预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验二递归下降语法分析 实验目的 按照语言的语法要求编写文法的规则 转化文法的规则,使之具有EBCF,消除左递归和左因子 掌握编程形式的语法分析器的实现 实验内容 在TINY计算机语言的编译程序的词法分析部分实现的基础上,采用递归下降的方法实现语法分析,形成语法树。 语法分析的输入是记号串,按照从左到右扫描,按照文法规则的要求,判断语句是否符合文法要求,如果符合要求则形成语法数,不符合则指出原因。 为了简化程序的编写,对语法有具体如下的要求: 只有5中语句if、repeat、read、write、assignment。 read只作用一个变量,实现输入。 write只作用一个表达式,实现输出。 表达式只有两类:布尔表达式,只用于if和repeat语句的测试,算术表达式采用左结合和优先级的方式组成。 没有变量的声明,仅仅在赋值时采用隐性的方式说明,只有整型变量; 每个语句序列采用‘;’的形式分开,最后一个语句没有分号 没有函数或过程 实验要求 要求实现语法分析程序的以下功能: 在实现之前首先实现EBNF,消除左递归和左因子,为递归下降程序做好准备 对于语句和表达式采用枚举的形式定义,形成一个统一的树结点结构 把正确源程序的首先经过词法分析形成二元式记号提供给语法分析程序 如果出现错误,指出错误的位置和类型 把语法树按照树的前序遍历的形式把所有的结点按照某种形式输出 语法分析进行具体的要求: 语法分析的具体功能实现是一个函数TreeNode*parse(),分析记号串,形成一个语法数。 编写一个单独的函数parseTree(TreeNode*)遍历整个语法树,把每个结点信息输出 四.源代码 #include<iostream> usingnamespacestd; chara[80];//字符串的存入 charsym;//单个的判断字符 inti=0;//字符串下标 voidE();//功能识别函数 voidE2();//功能识别函数 voidT();//功能识别函数 voidT2();//功能识别函数 voidF();//功能识别函数 voidinput();//输入函数 voidadvance();//字符串小标进一函数 voidmain() { while(1) { input(); advance(); E();//从首个推导式E开始 if(sym=='#') cout<<"success"<<endl; else cout<<"fail"<<endl;i=0;//重新输入时,下标置0 } } voidE() T(); E2(); } voidE2() { if(sym=='+') { adance(); T(); E2() } elseif(sym!=')'&&sym!='#') { cout<<"error!"<<endl; exit(0); } } voidT() { F(); T2(); } voidT2() { if(sym=='*') { advance(); F(); T2(); } elseif(sym!='+'&&sym!=')'&&sym!='#') { cout<<"error!"<<endl; exit(0); } } voidF() { if(sym=='(') { advance(); E(); if(sym==')') advance(); else { cout<<"error!"<<endl; exit(0); } } elseif(sym=='i') { advance(); } else { cout<<"error!"<<endl; exit(0); } } voidinput() { cout<<"请输入需识别的句子:"; cin>>a; } voidadvance() { sym=a[i]; i++; }