编译原理语法分析器.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
. .. 语法分析 一、实验任务 本实验的任务是编写整数算术表达式的递归下降语法分析程序,它从左至右逐个扫描输入单词,分析输入单词符号串是否合乎算术表达式语法。 具体任务有: ●组织算术表达式的输入。 ●拼出单词并转换成机内表示形式。 ●在词法分析基础上分析表达式语法。 ●发现并定位语法错误。 ●打印错误信息。 二、实验要求 整数加减乘除四则运算表达式文法G[E]如下所示: E-E+T | E-T | T T-T*F | T/F | F F-(E) | i (i是整常数) 文法是含回溯和左递归的上下文无关文法,实验要求首先将文法转换成等价的LL(1)文法,再从转换后的LL(1)文法构造出整数四则运算表达式的递归下降分析器。 2.能检查并处理某些语法错误,一旦发现错误,输出错误位置及错误类型,可停止分析或进行错误恢复处理(同学们自行选择处理方式)。 错误类型:(同学们自行定义,如) 1:非法字符。 2:… 三、实验内容 将文法G[E]转化为LL(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) 参照实验1、书P74和附录1的方法,实现整数算术表达式的递归下降语法分析程序 四、程序代码 以下的代码只支持7种节点——加减乘除,标识符,数字,表达式。想要加入其他节点,在opprio数组中加入优先级。 ////////////////////////////////Parse.h////////////////////////////////// #ifndef _PARSE_H_ #define _PARSE_H_ #include lexical.h //算法优先文法中优先级关系枚举 typedef enum {LS, GT, EQ,UN} Priority; //移进归约算法中使用到的栈节点结构(双向链表) typedef struct _pstacktoken { LexToken *ptoken; struct _pstacktoken *pr; struct _pstacktoken *nt; struct _pstacktoken *child; }PStackToken; void PStackPush(LexToken *t); LexToken* PStackPop(); //产生式链表节点结构(单向链表) typedef struct _generator {LexTokenType *gen; int size; struct _generator *nt;} Generator; PStackToken* Parse(char *Source); #endif//_PARSE_H ////////////////////////////////////////Parse.c///////////////////////////// #include Parse.h #include malloc.h #include string.h #include stdarg.h #include stdio.h //各个运算符之间的优先级定义 #define OPNUM 7 Priority opprio[OPNUM][OPNUM]={ {GT,GT,LS,LS,LS,LS,GT,}, {GT,GT,LS,LS,LS,LS,GT,}, {GT,GT,GT,GT,LS,LS,GT,}, {GT,GT,GT,GT,LS,LS,GT,}, {GT,GT,GT,GT,UN,UN,GT,}, {GT,GT,GT,GT,UN,UN,GT,}, {LS,LS,LS,LS,LS,LS,EQ,}, }; Priority PrioCmp(LexTokenType first, LexTokenType second)//这段函数被优化代码替代 { if (first=OPNUM || second=OPNUM) return UN; return opprio[first][second]; } PStackToken *PSbot = NULL;//栈底指针 PStackToken *PStop = NULL;//栈顶指针 //int PSnum = 0;//栈元素个数 void PStackPush(LexToken *t) {

文档评论(0)

hkfgmny + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档