1、1语法分析程序(递归下降法)班级 学号 姓名: 指导老师: 一. 实验目的:1、 学习语法分析的主要方法;2、 熟悉复习词法分析的方法;3、 判断表达式的正确性;4、 熟悉 C 语言并提高动手能力;二. 实验内容:用递归下降分析法编写一个用于判断数学表达式是否正确的语法分析三. 实验硬件和软件平台:INTEL C433MHz Cpu128Mb SDRAMTurbo C 2.0Microsoft Windows XP SP1四. 步骤和算法描述:1 调用词法分析程序,转换表达式成为内号;2 调用语法分析程序,判断表达式正确与否;五. 源程序:#include #include #include
2、#define yy swy=adv()FILE *fp1;char ch;int swy;main()void CS();int chz(char str15);int adv();void CT();void E();void EB();void ERROR();void ET();void F();void IT();void T();void sentence();clrscr();ch= ;fp1=fopen(“pas.txt“,“r“);if(!fp1)printf(“Can not open ljx.txt!n”); exit(0);/* while(!feof(fp1) */2
3、yy;sentence();fclose(fp1);void ERROR()printf(“%d ERROR!n “,swy);void E()T();while(swy=34|swy=35)yy;T();void T()F();while(swy=36|swy=37)yy;F();void F()if(swy=21|swy=22) yy;else if(swy=27)yy;E();if(swy=28) yy;else ERROR();else ERROR();void sentence()switch(swy)case 21 :yy;if(swy=44)yy;E();else ERROR()
4、;break;case 1:CS();break;case 8:yy;EB();if(swy!=4)ERROR();yy;sentence();break;case 19:yy;EB();if(swy!=4)ERROR();yy;sentence();break;case 14:yy;if(swy!=27) ERROR();yy;IT();if(swy!=28)ERROR();yy;break;case 20:yy;if(swy!=27) ERROR();yy;ET();if(swy!=28)ERROR();3yy;break;void CS()yy;sentence();while(swy=
5、24)yy;sentence();if(swy=6)yy;else ERROR();void CT()if(swy=5)yy;sentence();void EB()E();if(swy=38)yy;E();else ERROR();void IT()if(swy!=21)ERROR();yy;while(swy=23)yy;if(swy!=21)ERROR();else ERROR();void ET()E();while(swy=23)yy;E();int chz(char str115)char str2115=“and“,“begin“,“const“,“div“,“do“,“else
6、“,“end“,“function“,“if“,“integer“,“not“,“or“,“procdure“,“program“,“read“,“real“,“then“,“type“,“var“,“while“,“write“;int i,max,min,mid;for(i=0;i=A)str1i=str1i+a-A;max=20;min=0;mid=10;while(min0)min=mid+1;mid=(max+min)/2;else max=mid-1;mid=(max+min)/2;return 0;int adv()char str115;int t,i=0,sk=0;4float num,xs;if(ch= |swy=24)fscanf(fp1,“%c“,printf(“%c“,ch);while(!feof(fp1)printf(“%c“,ch);sk=1;5if(ch)=)ch= ;return 44;else return 40;default:break;if(sk=0)fscanf(fp1,“%c“,printf(“%c“,ch);else sk=0;