一、英语语法句型分析哪个软件好
英语语法句型分析以下这几个软件好。
《可可英语》是一款综合性的英语学习软件,在这里提供各种英语考试方面的学习,布景有智能的作文批改,还会标出句式错误的地方,便于提高写作阅读水平。
《每日英语阅读》是一款专门勇于英语阅读学习的app,会根据使用者的英语水平推送相对应的英语文章,还有专业的英语教师逐句精讲,语法知识一网打尽。
《中考英语通》是一款为中考英语打造的学习app,这里包含了素有的中考英语只是,阅读理解和完形填空等会有专门的句型解析,答案也会进行详细的分析。
《高中英语》是一款高中英语学习app,不仅涵盖了高一到高三的所有句型语法知识点和单词,而且针对不同地区的考生还有不同的教材和学习技巧,可以反复观看学习。
《星火英语》是一款英语综合学习类app,包含了单词、听力、阅读、翻译和写作等多个专项的学习,长难句的详细讲解剖析让人一目了然。
《从零开始学英语》是一款为零基础学习者编写的app,通过日常对话,旅游出行等多个不同场景的英语需求打造出不同的教材,无论是短语还是句式都有十分详细的知识点讲解。
《扇贝阅读》是一款英语阅读的app,在这里有着海量的英文原著,每一篇原著还会提供单词或句型的借此,遇到不会长难句可以直接查看翻译和解析。
《懒人英语》是一款英语学习app,每天都会更新英语听力、口语、单词、阅读等材料,可以在阅读的专项训练中查看句型分析,更快速的掌握各种英语语法。
《优点英语》是一款综合性的英语学习app,这款软件有着专业的写作训练功能,使用者可以根据教学加强英语写作,了解英语句型和语法,提高英语表达能力。
《英语学霸》是一款英语学习的app,软件学习资源分类简洁明确,初中英语、高中英语、四六级等等按照不同的阶段划分,每一个阶段都有语法句型课程,提供专业的英语学习环境。
二、求一个语法分析器
1、typedef struct ProNode{//产生式结构
2、char leftSym;//产生式左边的符号
3、char midSym[Pro_MidSym_Max];//产生式推导符号
4、char rightSym[Pro_RightSym_Max];//产生式右边的符号,不超过十个
5、typedef struct UnTInfo{//每个非终结符的信息结构,包括first和follow集合
6、typedef struct{//构造顺序栈,存储符号
7、typedef struct QNode{//构造单链队列,存储输入符号串
8、char UnTerminate[15];//非终结符表
9、char ProNull[20];//记录能产生空字符的非终结符
10、ProNode sheet[15][15];//分析表
11、char select[15][15];//select集合,以便于构造分析表
12、void InitUnTInfo(UnTInfo unTInfo[],int unTInfoNum);
13、void InitProNode(ProNode proNode[],int proNum);
14、void InitStack(SqStack&s);//初始化栈
15、void InitQueue(LinkQueue&q);//初始化队列
16、void EnQueue(LinkQueue&q,char c);//在队尾插入新的元素
17、void Push(SqStack&s, char c);//入栈
18、void InitSheet(ProNode** sheet,int m,int n);//初始化分析表函数
19、bool ReadPro(ProNode proNode[],char fileName[]);//从文件读取产生式函数
20、void PrintPro(ProNode proNode[],int proNum);//显示产生式
21、void SetUnTerminate(char UnTerminate[],ProNode proNode[],int proNum);//设置非终结符表
22、void SetTerminate(char UnTerminate[],ProNode proNode[],int proNum);//设置终结符表
23、int GetNumofUT(char UnTerminate[]);//获得非终结符个数
24、int GetNumofT(char Terminate[]);//获得终结符个数
25、int GetUTLoaction(char UnTerminate[],char c);//获得非终结符在非终结符表中的位置
26、int GetTLocaction(char UnTerminate[],char c);//获得终结符在终结符表中的位置
27、void First(ProNode proNode[],UnTInfo unTInfo[]);//计算各非终结符的First集
28、void Follow(ProNode proNode[],UnTInfo unTInfo[]);//计算各非终结符的Follow集
29、void AddChar(char chArray[],char c);//将非终结符的所有first值加入First集
30、void AddCharToChar(char chArray[],char otherArray[]);//将非终结符的所有first集加入First集
31、void AddFollow(char follow[],char c);//将非终结符的所有follow值加入Follow集
32、bool IsNull(char c);//非终结符能否产生空字符
33、bool IsTerminate(char c);//判断是否为终结符号
34、void SetSheet(ProNode proNode[],UnTInfo unTInfo[]);//设置分析表
35、void SetSelect(ProNode proNode[],UnTInfo unTInfo[]);//设置Select集合
36、void InputSym();//输入字符串函数
37、void Scan();//分析扫描的主控程序
38、char GetSym(LinkQueue&q);//获取下一字符
39、void PrintSym(SqStack&s);//显示符号栈符号
40、void PrintRemain(LinkQueue&q);//显示剩余符号串
41、void PrintSheet(int row,int col);//显示所使用产生式
42、cout<<"请输入放有产生式的文件(如:pro.txt):"<<endl;
43、if(ReadPro(proNode,fileName)){
44、cout<<"该文法产生式为:"<<endl;
45、SetUnTerminate(UnTerminate,proNode,proNum);
46、SetTerminate(Terminate,proNode,proNum);
47、int NumofUT= GetNumofUT(UnTerminate);
48、int NumofT= GetNumofT(Terminate);
49、cout<<endl<<"分析表:"<<endl;
50、for(int jj= 0; jj< NumofT; jj++)
51、cout<<Terminate[jj]<<"\t";
52、for(int mm= 0; mm< NumofUT; mm++){
53、cout<<UnTerminate[mm]<<"\t";
54、for(int mn= 0; mn< NumofT; mn++){
55、void InitProNode(ProNode proNode[],int proNum){
56、for(int i= 0; i< proNum; i++){
57、proNode[i].leftSym='\0';
58、memset(proNode[i].midSym,0,Pro_MidSym_Max);
59、memset(proNode[i].rightSym,0,Pro_RightSym_Max);
60、void InitUnTInfo(UnTInfo unTInfo[],int unTInfoNum){
61、for(int i= 0; i< unTInfoNum;i++){
62、int firLength= strlen(unTInfo[i].first);
63、int folLength= strlen(unTInfo[i].follow);
64、memset(unTInfo[i].first,0,UnTInfo_Fir_Max);
65、memset(unTInfo[i].follow,0,UnTInfo_Fol_Max);
66、void InitStack(SqStack&s){//初始化栈
67、s.base=(char*)malloc(STACK_INIT_SIZE* sizeof(char));
68、void Push(SqStack&s, char c){//入栈
69、if(s.top- s.base>= s.stacksize){//栈满,追加存储空间
70、s.base=(char*)realloc(s.base,(s.stacksize+ STACKINCREMENT)* sizeof(char));
71、if(!s.base) Exit();//存储分配失败
72、if(s.top== s.base) return NULL;
73、void InitQueue(LinkQueue&q){//初始化队列
74、q.front= q.rear=(QueuePtr)malloc(sizeof(QNode));
75、if(!q.front) Exit();//存储分配失败
76、void EnQueue(LinkQueue&q,char c){//在队尾插入新的元素
77、QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
78、cout<<"溢出!"<<endl;
79、cout<<"分析出错!"<<endl;
80、void InitSheet(ProNode** sheet,int m,int n){
81、sheet[i][j].leftSym='\0';//用0标记无定义的表格
82、bool ReadPro(ProNode proNode[],char fileName[]){
83、if((pFile= fopen(fileName,"r"))== NULL){
84、cout<<"打开文件出错!"<<endl;
85、while(tmpChar!='#'){//求出产生式的个数
86、for(int i= 0;i< proNum;i++){//读出各产生式并置于已定义的数据结构ProNode中,
87、fscanf(pFile,"%c%c%c",&proNode[i].leftSym,&proNode[i].midSym[0],\
88、proNode[i].midSym[2]='\0';
89、proNode[i].rightSym[j]= tmpChar;
90、proNode[i].rightSym[j]='\0';
91、void PrintPro(ProNode proNode[],int proNum){//显示产生式
92、for(int i= 0; i< proNum; i++){
93、cout<<proNode[i].leftSym<<proNode[i].midSym[0]<<proNode[i].midSym[1];
94、for(int j= 0; j< proNode[i].length;j++)
95、cout<<proNode[i].rightSym[j];
96、void SetUnTerminate(char UnTerminate[],ProNode proNode[],int proNum){
97、for(int i= 0; i< proNum; i++){//从第一个产生式开始
98、int tmpLength= strlen(UnTerminate);
99、for(int j= 0; j<= tmpLength; j++){
100、if(UnTerminate[j]== proNode[i].leftSym){//若已存在,则进入下个产生式
101、UnTerminate[tmpLength]= proNode[i].leftSym;//将非终结符加入到非终结符表
102、UnTerminate[tmpLength+ 1]='\0';
103、void SetTerminate(char Terminate[],ProNode proNode[],int proNum){
104、for(int i= 0; i< proNum; i++){//从第一个产生式开始
105、for(int k= 0; k< proNode[i].length; k++){
106、if(isupper(proNode[i].rightSym[k]))//若为非终结符号,则进入下一个字符
107、else if( proNode[i].rightSym[k]=='^'){
108、int tmpLength= strlen(ProNull);
109、ProNull[tmpLength]= proNode[i].leftSym;//记录能产生空字符的产生式
110、ProNull[tmpLength+ 1]='\0';
111、for(int j= 0; j<= tmpLength; j++){
112、if(Terminate[j]== proNode[i].rightSym[k]){
113、if(flag){//将终结符加入到终结符表
114、Terminate[tmpLength]= proNode[i].rightSym[k];
115、Terminate[tmpLength+ 1]='\0';
116、int GetNumofUT(char UnTerminate[]){//获得非终结符个数
117、int GetNumofT(char Terminate[]){//获得终结符个数
118、bool IsNull(char c){//非终结符能否产生空字符
119、bool IsTerminate(char c){//判断是否为终结符号
120、int num= GetNumofT(Terminate);
121、for(int i= 0; i< num; i++){
122、int GetUTLoaction(char UnTerminate[],char c){//获得非终结符在非终结符表中的位置
123、for(int i= 0; i< GetNumofUT(UnTerminate);i++)
124、int GetTLocaction(char Terminate[],char c){//获得终结符在终结符表中的位置
125、for(int i= 0; i< GetNumofT(Terminate);i++)
126、void AddChar(char chArray[],char c){//将非终结符的所有first值加入First集
127、int tmpLength= strlen(chArray);
128、for(int i= 0; i<= tmpLength; i++){
129、if(chArray[i]== c){//若已存在,则不加入
130、chArray[tmpLength]= c;//将first值加入First集
131、chArray[tmpLength+ 1]='\0';
132、void AddCharToChar(char chArray[],char otherArray[]){
133、int otherLength= strlen(otherArray);
134、for(int j= 0; j< otherLength; j++){
135、int tmpLength= strlen(chArray);
136、for(int i= 0; i<= tmpLength; i++){
137、if(chArray[i]== otherArray[j]){//若已存在,则不加入
138、chArray[tmpLength]= otherArray[j];//将first值加入First集
139、chArray[tmpLength+ 1]='\0';
140、void First(ProNode proNode[],UnTInfo unTInfo[]){//求出First集合
141、for(int i= proNum-1; i>= 0; i--){//从最后一个产生式开始进行分析
142、char leftSym= proNode[i].leftSym;
143、char c= proNode[i].rightSym[0];
144、int leftSymLoc= GetUTLoaction(UnTerminate,leftSym);
145、if(IsNull(leftSym))//如果产生式推出空字符,则把空字符加入First集合
146、AddChar(unTInfo[leftSymLoc].first,c);
147、if(IsTerminate(c)){//如果产生式右边第一个符号为终结符号
148、AddChar(unTInfo[leftSymLoc].first,c);//将符号加入First集合
149、for(int k= 0; k< proNode[i].length; k++){
150、if(!IsNull(proNode[i].rightSym[k])){
151、AddChar(unTInfo[leftSymLoc].first,'^');
152、char rightChar= proNode[i].rightSym[l];
153、int rightSymLoc= GetUTLoaction(UnTerminate,rightChar);
154、int firstLen= strlen(unTInfo[rightSymLoc].first);
155、for(int m= 0; m< firstLen; m++){
156、if(unTInfo[rightSymLoc].first[m]!='^')
157、AddChar(unTInfo[leftSymLoc].first,unTInfo[rightSymLoc].first[m]);
158、int rightSymLoc= GetUTLoaction(UnTerminate,proNode[i].rightSym[k]);
159、AddCharToChar(unTInfo[leftSymLoc].first,unTInfo[rightSymLoc].first);
160、void Follow(ProNode proNode[],UnTInfo unTInfo[]){//计算各非终结符的Follow集
161、AddChar(unTInfo[0].follow,'#');//开始符号,则把“#”加入FOLLOW中;
162、int numOfUnT= GetNumofUT(UnTerminate);
163、for(int i= 0; i< numOfUnT; i++){
164、for(int j= 0;j< proNum; j++){//从第一个产生式开始进行分析,逐个进行扫描
165、for(int k= 0; k< proNode[j].length; k++){
166、if(UnTerminate[i]== proNode[j].rightSym[k])//判断非终结符是否在产生式右边
167、if((k== proNode[j].length- 1)|| IsNull(proNode[j].rightSym[k+1])){
168、if(proNode[j].leftSym!= UnTerminate[i]){
169、int leftSymLoc= GetUTLoaction(UnTerminate,proNode[j].leftSym);
170、AddCharToChar(unTInfo[i].follow,unTInfo[leftSymLoc].follow);
171、if(proNode[j].rightSym[k+1]!='\0'){
172、if(IsTerminate(proNode[j].rightSym[k+1]))
173、AddChar(unTInfo[i].follow,proNode[j].rightSym[k+1]);
174、else{//如果β为非终结符,则将FIRST(β)-{ε}加入FOLLOW(A)中
175、int rightSymLoc= GetUTLoaction(UnTerminate,proNode[j].rightSym[k+1]);
176、int len= strlen(unTInfo[rightSymLoc].first);
177、for(int l= 0; l< len; l++){
178、if(unTInfo[rightSymLoc].first[l]!='^')
179、AddChar(unTInfo[i].follow,unTInfo[rightSymLoc].first[l]);
180、void SetSelect(ProNode proNode[],UnTInfo unTInfo[]){//设置Select集合
181、for(int i= 0;i< proNum; i++){//扫描每一个产生式,求出Select集合
182、if(IsTerminate(proNode[i].rightSym[0])){
183、AddChar(select[i],proNode[i].rightSym[0]);
184、else if(proNode[i].rightSym[0]=='^')
185、AddCharToChar(select[i],unTInfo[GetUTLoaction(UnTerminate,proNode[i].leftSym)].follow);
186、for(int j= 0; j< proNode[i].length; j++){
187、if(!IsTerminate(proNode[i].rightSym[j])){
188、int rightSymLoc= GetUTLoaction(UnTerminate,proNode[i].rightSym[j]);
189、int firLen= strlen(unTInfo[rightSymLoc ].first);
190、for(int k= 0; k< firLen; k++)
191、if(unTInfo[rightSymLoc ].first[k]!='^')
192、AddChar(select[i],unTInfo[rightSymLoc].first[k]);
193、if(!IsNull(proNode[i].rightSym[j])){
194、else{//遇到了终结符号,此时也应终止循环
195、if(isVT&&isNull)//处理像E->ABaβ的产生式的情况
196、AddChar(select[i],proNode[i].rightSym[j]);
197、int leftSymLoc= GetUTLoaction(UnTerminate,proNode[i].leftSym);
198、AddCharToChar(select[i],unTInfo[leftSymLoc].follow);
199、void SetSheet(ProNode proNode[],UnTInfo unTInfo[]){//构造分析表
200、for(int i= 0; i< proNum; i++){
201、for(int j= 0; j< selLen; j++){
202、rowLoc= GetUTLoaction(UnTerminate,proNode[i].leftSym);
203、colLoc= GetTLocaction(Terminate,select[i][j]);
204、sheet[rowLoc][colLoc]= proNode[i];
205、void InputSym(){//输入字符串函数
206、cout<<"请输入要分析的字符串(以'#'结束):"<<endl;
207、void Scan(){//分析扫描的主控程序
208、cout<<"步骤"<<"\t"<<"符号栈"<<"\t\t"<<"读入符号"<<"\t"<<"剩余符号串"<<"\t"<<"使用产生式"<<endl;
209、cout<<step++<<"\t";
210、Push(SymStack,UnTerminate[0]);//'#'、开始符号入栈
211、a= GetSym(Remain);//读入第一个符号
212、cout<<a<<"\t\t";
213、x= Pop(SymStack);//从栈中弹出符号
214、leftLoc= GetUTLoaction(UnTerminate,x);
215、rightLoc= GetTLocaction(Terminate,a);
216、cout<<step++<<"\t";
217、cout<<a<<"\t\t";
218、else if(sheet[GetUTLoaction(UnTerminate,x)][GetTLocaction(Terminate,a)].leftSym\
219、!='\0'){// X∈Vn查分析表
220、leftLoc= GetUTLoaction(UnTerminate,x);
221、rightLoc= GetTLocaction(Terminate,a);
222、if(sheet[leftLoc][rightLoc].rightSym[0]!='^'){
223、int rightLen= strlen(sheet[leftLoc][rightLoc].rightSym);
224、for(int i= rightLen- 1; i>=0; i--){
225、Push(SymStack,sheet[leftLoc][rightLoc].rightSym[i]);
226、cout<<step++<<"\t";
227、cout<<a<<"\t\t";
228、cout<<step++<<"\t";
229、cout<<a<<"\t\t";
230、if(q.front== q.rear) return NULL;
231、QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
232、if(q.rear== p) q.rear= q.front;
233、void PrintSym(SqStack&s){//显示符号栈符号
234、for( i= s.base; i< s.top;i++)
235、void PrintRemain(LinkQueue&q){//显示剩余符号串
236、void PrintSheet(int row,int col){//显示所使用产生式
237、cout<<sheet[row][col].leftSym<<sheet[row][col].midSym[0]<<sheet[row][col].midSym[1];
238、for(int j= 0; j< sheet[row][col].length;j++)
239、cout<<sheet[row][col].rightSym[j];
240、cout<<"Successful!"<<endl;
三、c语言的词法分析器和语法分析器有什么区别
1、顾名思义,词法分析器检查的是词法,语法分析器分析的是语法,什么是词法,什么是语法你弄明白就知道了。
2、所谓词法,源代码由字符流组成,字符流中包括关键字,变量名,方法名,括号等等符号,其中变量名要满足不能包括标点符号,不能以数字开头的数字与字母的字符串这个条件,对于括号要成对出现等等,这就是词法;
3、而语法,词法没有问题才能进入语法分析,语法就是词排列的方法,字面意义,比如一句中文:我吃萝卜,里面有三个词我吃萝卜,除了“我吃萝卜”外,这三个词还可以组成,“萝卜吃我”“萝卜我吃”等,显然按照中文文法,后面的两句话是不对的,语法分析器就是分析类似这样的语法的。
文章到此结束,如果本次分享的语法分析器和语法分析器的任务的问题解决了您的问题,那么我们由衷的感到高兴!