2019-11-27作业

一、实验目的:

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

 

二、实验原理

每个非终结符都对应一个子程序。

该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端:

  • 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理
  • 每遇到一个非终结符,则调用相应的子程序

 

三、实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。

例如:

输入begin a:=9;x:=2*3;b:=a+x end #

输出success

输入x:=a+b*c  end #

输出‘end' error

 

四、实验步骤

1.待分析的语言的语法(参考P90)

2.将其改为文法表示,至少包含

–语句

–条件

–表达式

3. 消除其左递归

4. 提取公共左因子

5. SELECT集计算

6. LL(1)文法判断

7. 递归下降分析程序

  1 #include "string.h"
  2 #include <stdio.h>
  3 #include<conio.h>
  4 
  5 void lrparser();
  6 void yucu();
  7 void statement();
  8 void expression();
  9 void term();
 10 void factor();
 11 int kk=0;
 12 char prog[80],token[8];
 13 int syn,p,m,n,sum=0;
 14 char ch;
 15 char *rwtab[6]= {"begin","if","then","while","do","end"};
 16 
 17 void scaner() {
 18     m=0;
 19     for(n=0; n<8; n++) token[n]=NULL;
 20     ch=prog[p++];
 21     while(ch==' ') ch=prog[p++];
 22     if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')) {
 23         while((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9')) {
 24             token[m++]=ch;
 25             ch=prog[p++];
 26         }
 27         token[m++]='\0';
 28         syn=10;
 29         p=p-1;      //回退一个字符
 30         for(n=0; n<6; n++) {
 31             if(strcmp(token,rwtab[n])==0) {
 32                 syn=n+1;
 33                 break;
 34             }
 35         }
 36     } else if(ch>='0' && ch<='9') {
 37         sum=0;
 38         while(ch>='0' && ch<='9') {
 39             sum=sum*10+ch-'0';
 40             ch=prog[p++];
 41         }
 42         p=p-1;
 43         syn=11;
 44     } else {
 45         switch(ch) {
 46             case '<':
 47                 m=0;
 48                 token[m++]=ch;
 49                 ch=prog[p];
 50                 if(ch=='>') {
 51                     syn=21;
 52                     token[m++]=ch;
 53                 } else if(ch=='=') {
 54                     syn=22;
 55                     token[m++]=ch;
 56                 } else {
 57                     syn=20;
 58                     p=p-1;
 59                 }
 60                 p=p+1;
 61                 token[m]='\0';
 62                 break;
 63             case '>':
 64                 m=0;
 65                 token[m++]=ch;
 66                 ch=prog[p++];
 67                 if(ch=='=') {
 68                     syn=24;
 69                     token[m++]=ch;
 70                 } else {
 71                     syn=23;
 72                     p=p-1;
 73                 }
 74                 break;
 75             case ':':
 76                 m=0;
 77                 token[m++]=ch;
 78                 ch=prog[p++];
 79                 if(ch=='=') {
 80                     syn=18;
 81                     token[m++]=ch;
 82                 } else {
 83                     syn=17;
 84                     p=p-1;
 85                 }
 86                 break;
 87             case '+':
 88                 syn=13;
 89                 token[0]=ch;
 90                 break;
 91             case '-':
 92                 syn=14;
 93                 token[0]=ch;
 94                 break;
 95             case '*':
 96                 syn=15;
 97                 token[0]=ch;
 98                 break;
 99             case '/':
100                 syn=16;
101                 token[0]=ch;
102                 break;
103             case ';':
104                 syn=26;
105                 token[0]=ch;
106                 break;
107             case '(':
108                 syn=27;
109                 token[0]=ch;
110                 break;
111             case ')':
112                 syn=28;
113                 token[0]=ch;
114                 break;
115             case '=':
116                 syn=25;
117                 token[0]=ch;
118                 break;
119             case '#':
120                 syn=0;
121                 token[0]=ch;
122                 break;
123             default:
124                 syn=-1;
125         }
126     }
127 }
128 
129 void lrparser() {
130     if (syn==1) { //begin
131         scaner();
132         yucu();
133         if (syn==6) { //end
134             scaner();
135             if (syn==0 && kk==0) printf("success \n");
136         } else {
137             if(kk!=1) printf("error,lose 'end' ! \n");
138             kk=1;
139         }
140     } else {
141         printf("error,lose 'begin' ! \n");
142         kk=1;
143     }
144     return;
145 }
146  
147 void yucu() {
148     statement();
149     while(syn==26) { 
150         scaner();
151         statement();
152     }
153     return;
154 }
155  
156 void statement() {
157     if (syn==10) { //为标识符
158         scaner();
159         if (syn==18) { //为 :=
160             scaner();
161             expression();
162         } else {
163             printf("error!");
164             kk=1;
165         }
166     } else {
167         printf("error!");
168         kk=1;
169     }
170     return;
171 }
172  
173  
174 void expression() {
175     term();
176     while(syn==13 || syn==14) {
177         scaner();
178         term();
179     }
180     return;
181 }
182  
183  
184 void term() {
185     factor();
186     while(syn==15 || syn==16) {
187         scaner();
188         factor();
189     }
190     return;
191 }
192  
193  
194 void factor() {
195     if(syn==10 || syn==11)scaner(); //为标识符或整常数时,读下一个单词符号
196     else if(syn==27) {
197         scaner();
198         expression();
199         if(syn==28)scaner();
200         else {
201             printf(" ')' 错误\n");
202             kk=1;
203         }
204     } else {
205         printf("表达式错误\n");
206         kk=1;
207     }
208     return;
209 }
210  
211  
212 int main() {
213     p=0;int i;
214     printf("********************语法分析程序***************\n");
215     printf("请输入源程序:\n");
216     do {
217         scanf("%c",&ch);
218         prog[p++]=ch;
219     } while(ch!='#');
220     p=0;
221     scaner();
222     lrparser();
223     printf("语法分析结束!\n");
224     getch();
225 }

测试结果:

 

 

 

 

posted @ 2019-11-29 17:42  土块  阅读(374)  评论(0编辑  收藏  举报