首页 > 代码库 > 实验报告(3)-语法分析
实验报告(3)-语法分析
实验三:递归下降语法分析实验
一、 实验目的
编制一个递归下降分析程序。
二、 实验内容和要求
输入:算术表达式;
输出:判断结果(输入正确/错误)。
三、实验方法、步骤及结果测试
1.源程序名:递归下降语法分析.c
可执行程序名:递归下降语法分析.exe
2. 原理分析及流程图
采用递归子程序方法进行语法分析,对文法中的每个非终结符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。
流程图:
3. 主要程序段及其解释:
#include<stdio.h> #include<string.h> char prog[100],token[8],ch; char *rwtab[6]={"begin","if","then","while","do","end"}; int syn,p,m,n,sum; void E(); //E->TE1; void E1(); //E1->+TE1|-TE1|ε void T(); //T->FT1 void T1(); //T1->*FT1 |/FT1|ε void F(); //F->(E) | i error(); void scaner(); int main() { p=0; printf("\nplease input a string (end with ‘#‘): \n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch!=‘#‘); p=0; scaner(); E(); } void E() { T(); E1(); } void E1() { if((syn==13)||(syn==14)) { scaner(); T(); E1(); } else { if(syn!=28 && syn!=0) error(); } } void T() { F(); T1(); } void T1() { if((syn==15)||(syn==16)) { scaner(); F(); T1(); } else { if(syn!=28 && syn!=0 && syn!=13) error(); } } void F() { if(syn==27) { scaner(); E(); if(syn==28) { scaner(); E(); if(syn==0) printf("\nTrue!\n"); } else error(); } else if(syn==11||syn==10) scaner(); } error() { printf("\n Syn Error!\n"); } void scaner() { sum=0; for(m=0;m<8;m++) token[m++]=NULL; m=0; ch=prog[p++]; while(ch==‘ ‘) ch=prog[p++]; if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))) { while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘))) { token[m++]=ch; ch=prog[p++]; } p--; syn=10; token[m++]=‘\0‘; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>=‘0‘)&&(ch<=‘9‘)) { while((ch>=‘0‘)&&(ch<=‘9‘)) { sum=sum*10+ch-‘0‘; ch=prog[p++]; } p--; syn=11; } else switch(ch) { case ‘<‘: m=0; ch=prog[p++]; if(ch==‘>‘) { syn=21; } else if(ch==‘=‘) { syn=22; } else { syn=20; p--; } break; case ‘>‘: m=0; ch=prog[p++]; if(ch==‘=‘) { syn=24; } else { syn=23; p--; } break; case ‘:‘: m=0; ch=prog[p++]; if(ch==‘=‘) { syn=18; } else { syn=17; p--; } break; case ‘+‘: syn=13; break; case ‘-‘: syn=14; break; case ‘*‘: syn=15; break; case ‘/‘: syn=16; break; case ‘(‘: syn=27; break; case ‘)‘: syn=28; break; case ‘=‘: syn=25; break; case ‘;‘: syn=26; break; case ‘#‘: syn=0; break; default: syn=-1; break; } }
4. 运行结果及分析
实验报告(3)-语法分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。