资源描述:
《编译原理语法分析器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算机科学与工程学院计算机033班曾志强22号语法分析一、实验任务本实验的任务是编写整数算术表达式的递归下降语法分析程序,它从左至右逐个扫描输入单词,分析输入单词符号串是否合乎算术表达式语法。具体任务有:●组织算术表达式的输入。●拼出单词并转换成机内表示形式。●在词法分析基础上分析表达式语法。●发现并定位语法错误。●打印错误信息。二、实验要求1.整数加减乘除四则运算表达式文法G[E]如下所示:E->E+T
2、E-T
3、TT->T*F
4、T/F
5、FF->(E)
6、i(i是整常数)文法是含回溯和左递归的上下文无关文法,实验要求首先将文法转换成等价的LL(1)文法,再从转换后的LL(1)文
7、法构造出整数四则运算表达式的递归下降分析器。2.能检查并处理某些语法错误,一旦发现错误,输出错误位置及错误类型,可停止分析或进行错误恢复处理(同学们自行选择处理方式)。错误类型:(同学们自行定义,如)1:非法字符。2:…三、实验内容1.将文法G[E]转化为LL(1)文法1)提取公共左因子如E->E+T
8、E-T
9、T提取公共左因子得到E->EE1
10、T(1)E1->+T
11、-T(2)2)消除左递归,如上(1)消除左递归得到E->TE2(1)’E2->E1E2
12、e(空串)(3)2.参照实验1、书P74和附录1的方法,实现整数算术表达式的递归下降语法分析程序四、程序代码以下的代码只支持7
13、种节点——加减乘除,标识符,数字,表达式。想要加入其他节点,在opprio数组中加入优先级。1)////////////////////////////////Parse.h//////////////////////////////////2)7/7计算机科学与工程学院计算机033班曾志强22号1)#ifndef_PARSE_H_2)#define_PARSE_H_3)#include"lexical.h"4)5)//算法优先文法中优先级关系枚举6)typedefenum{LS,GT,EQ,UN}Priority;7)//移进归约算法中使用到的栈节点结构(双向链表)8)ty
14、pedefstruct_pstacktoken9){10)LexToken*ptoken;11)struct_pstacktoken*pr;12)struct_pstacktoken*nt;13)struct_pstacktoken*child;14)}PStackToken;15)voidPStackPush(LexToken*t);16)LexToken*PStackPop();17)18)//产生式链表节点结构(单向链表)19)typedefstruct_generator{LexTokenType*gen;intsize;struct_generator*nt;}Ge
15、nerator;20)PStackToken*Parse(char*Source);21)22)#endif//_PARSE_H23)////////////////////////////////////////Parse.c/////////////////////////////24)#include"Parse.h"25)#include26)#include27)#include28)#include29)30)//各个运算符之间的优先级定义31)#defineOPNUM732)Prior
16、ityopprio[OPNUM][OPNUM]={33){GT,GT,LS,LS,LS,LS,GT,},34){GT,GT,LS,LS,LS,LS,GT,},35){GT,GT,GT,GT,LS,LS,GT,},36){GT,GT,GT,GT,LS,LS,GT,},37){GT,GT,GT,GT,UN,UN,GT,},38){GT,GT,GT,GT,UN,UN,GT,},39){LS,LS,LS,LS,LS,LS,EQ,},40)};41)PriorityPrioCmp(LexTokenTypefirst,LexTokenTypesecond)//这段函数被优化代码替代7/7
17、计算机科学与工程学院计算机033班曾志强22号1){2)if(first>=OPNUM
18、
19、second>=OPNUM)3)returnUN;4)returnopprio[first][second];5)}6)7)8)PStackToken*PSbot=NULL;//栈底指针9)PStackToken*PStop=NULL;//栈顶指针10)//intPSnum=0;//栈元素个数11)voidPStackPush(LexToken*t)12){13)staticintsize=sizeof(PStac