编译原理语法分析器.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《编译原理语法分析器.doc》由会员分享,可在线阅读,更多相关《编译原理语法分析器.doc(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、语法分析一、实验任务 本实验的任务是编写整数算术表达式的递归下降语法分析程序,它从左至右逐个扫描输入单词,分析输入单词符号串是否合乎算术表达式语法。具体任务有:组织算术表达式的输入。拼出单词并转换成机内表示形式。在词法分析基础上分析表达式语法。发现并定位语法错误。打印错误信息。二、实验要求1 整数加减乘除四则运算表达式文法GE如下所示:E-E+T | E-T | TT-T*F | T/F | FF-(E) | i (i是整常数)文法是含回溯和左递归的上下文无关文法,实验要求首先将文法转换成等价的LL(1)文法,再从转换后的LL(1)文法构造出整数四则运算表达式的递归下降分析器。2能检查并处理某
2、些语法错误,一旦发现错误,输出错误位置及错误类型,可停止分析或进行错误恢复处理(同学们自行选择处理方式)。错误类型:(同学们自行定义,如)1:非法字符。2:三、实验内容1 将文法GE转化为LL(1)文法1) 提取公共左因子如E-E+T | E-T | T 提取公共左因子得到E-E E1 | T (1)E1-+T | -T (2)2) 消除左递归,如上(1) 消除左递归得到E-T E2 (1)E2-E1 E2 | e(空串) (3)2 参照实验1、书P74和附录1的方法,实现整数算术表达式的递归下降语法分析程序四、程序代码以下的代码只支持7种节点加减乘除,标识符,数字,表达式。想要加入其他节点,
3、在opprio数组中加入优先级。1) /Parse.h/2)3) #ifndef _PARSE_H_4) #define _PARSE_H_5) #include lexical.h6)7) /算法优先文法中优先级关系枚举8) typedef enum LS, GT, EQ,UN Priority;9) /移进归约算法中使用到的栈节点结构(双向链表)10) typedef struct _pstacktoken11) 12) LexToken *ptoken;13) struct _pstacktoken *pr;14) struct _pstacktoken *nt;15) struct _
4、pstacktoken *child;16) PStackToken;17) void PStackPush(LexToken *t);18) LexToken* PStackPop();19)20) /产生式链表节点结构(单向链表)21) typedef struct _generator LexTokenType *gen; int size; struct _generator *nt; Generator;22) PStackToken* Parse(char *Source);23)24) #endif/_PARSE_H25) /Parse.c/26) #include Parse.
5、h27) #include 28) #include 29) #include 30) #include 31)32) /各个运算符之间的优先级定义33) #define OPNUM 734) Priority opprioOPNUMOPNUM=35) GT,GT,LS,LS,LS,LS,GT,36) GT,GT,LS,LS,LS,LS,GT,37) GT,GT,GT,GT,LS,LS,GT,38) GT,GT,GT,GT,LS,LS,GT,39) GT,GT,GT,GT,UN,UN,GT,40) GT,GT,GT,GT,UN,UN,GT,41) LS,LS,LS,LS,LS,LS,EQ,42
6、) ;43) Priority PrioCmp(LexTokenType first, LexTokenType second)/这段函数被优化代码替代44) 45) if (first=OPNUM | second=OPNUM)46) return UN;47) return oppriofirstsecond;48) 49)50)51) PStackToken *PSbot = NULL;/栈底指针52) PStackToken *PStop = NULL;/栈顶指针53) /int PSnum = 0;/栈元素个数54) void PStackPush(LexToken *t)55) 5
7、6) static int size = sizeof(PStackToken);57) PStackToken *p = (PStackToken*)malloc(size);/不检查合法性58) p-ptoken = t;/不对t的合法性检查59) if (!PSbot)/第一个节点60) 61) PSbot = PStop = p;62) p-pr = p-nt = NULL;63) 64) else65) 66) PStop-nt = p;67) p-pr = PStop;68) p-nt = NULL;69) PStop = p;70) 71) p-child = NULL;72)
8、73) LexToken* PStackPop()74) 75) LexToken *p = PStop-ptoken;76) PStackToken *last = PStop;77) if (PStop=NULL)/如果已无元素可弹出78) return NULL;79) PStop = PStop-pr;80) PStop-nt = NULL;81) free(last);82) return p;83) 84)85)86) Generator *GLhead = NULL;87) Generator *GLend = NULL;88) void AddGen(int num, .)89
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法 分析器
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内