一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列
的语法检查和结构分析。
二、实验内容
利用 C 语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1 待分析的简单语言的语法
用扩充的 BNF 表示如下:
⑴<程序>::=begin<语句串>end
⑵<语句串>::=<语句>{;<语句>}
⑶<语句>::=<赋值语句>
⑷<赋值语句>::=ID:=<表达式>
⑸<表达式>::=<项>{+<项> | -<项>}
⑹<项>::=<因子>{*<因子> | /<因子>
⑺<因子>::=ID | NUM | (<表达式>)
2.2 实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,
打印“success,”否则输出“error。”
例如:
输入 begin a:=9; x:=2*3; b:=a+x end #
输出 success
输入 x:=a+b*c end #
输出 error
#include<stdio.h> #include<string.h> int id(char a[],int i) { if(a[i]<='z'&&a[i]>='a') { for(i++;(a[i]<='z'&&a[i]>='a')||(a[i]>='0'&&a[i]<='9');i++); if(a[i]==':'&&a[i+1]=='=') return i+2; else return -1; } else return -1; } int yinzi(char e[]) { int i=0; if(e[i]>='a'&&e[i]<='z') { for(i++;e[i]<='z'&&e[i]>='a'||e[i]>='0'&&e[i]<='9';i++); if(i!=strlen(e)) return -1; else return 1; } else if(e[i]>='0'&&e[i]<='9') { for(i++;e[i]<='9'&&e[i]>='0';i++); if(i!=strlen(e)) return -1; else return 1; } else return -1; } int biaodashi(char d[],int i); int kuohao(char d[],int i) { int kz=1,ky=0,j=0; char e[200]={}; for(i+=1;d[i]!='\0'&&kz>ky;i++) { if(d[i]=='(') { kz++; e[j++]=d[i]; } else if(d[i]==')') { ky++; if(kz>ky) e[j++]=d[i]; } else e[j++]=d[i]; } if(kz!=ky) return -1; else { j=0; if(biaodashi(e,j)>0) return i; else return -1; } } int jiequ(char d[],int i) { int j=0; char e[200]={}; while(!(d[i]=='+'||d[i]=='-'||d[i]=='*')&&i!=strlen(d)) e[j++]=d[i++]; int k=yinzi(e); if(k<0) return -1; else return i; } int biaodashi(char d[],int i) { int k=0; if(d[i]=='(') k=kuohao(d,i); else k=jiequ(d,i); if(k<0) return -1; else if(k==strlen(d)) return 1; else i=k; if(d[i]=='+'||d[i]=='-'||d[i]=='*'||d[i]=='/') { i++; if(biaodashi(d,i)<0) return -1; else return 1; } else if(d[i]==strlen(d)) return 1; else return -1; } int main() { char a[200]={},b[10]={},c[10]={}; scanf("%s ",b); gets(a); int n=0,i=0,j=0,k=0; n=strlen(a); for(i=n-6;i<=n-1;i++) c[j++]=a[i]; if((strcmp("begin",b)!=0)||(strcmp(" end #",c)!=0)) printf("error\n"); else { for(i=0;i<=n-7;) { k=id(a,i); if(k<0) break; else { i=k; k=0; } char d[200]={}; j=0; while(a[i]!=';'&&i<=n-7) d[j++]=a[i++]; i+=2; k=biaodashi(d,0); if(k<0) break; else k=0; } if(k<0) printf("error\n"); else printf("success\n"); } return 0; }