- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验三用Flex和Bison构造扩充的PL0语言的编
实验三 用 Flex 和 Bison 构造扩充的 PL/0 语言的编译器
软件 31 罗鹏魁 2003010655
一、实验目的及要求
实现满足以下EBNF描述的PL/0语言的编译器
二、主要设计
(一)词法分析脚本pl3.l 的设计
略:基本上沿用第二次实验的脚本。
(二)语法分析脚本pl3.y 的设计
语法分析脚本较上次实验有很大变动,因为加入属性文法之后,会凭空引入很多的冲突,大部分移
进-规约冲突可以利用 bison 的冲突默认处理机制解决(虽然这好像不被老师允许)。但是还有很多
冲突无法利用默认规则正确解决,主要集中在 if-then-else 和 while-do 上,其中 if-then-else 主要是
悬挂二义性的问题。实验二中我是用指定优先级的方法来消除 if-else 悬挂二义性的,但是跟属性文
法结合出现了一时没法解决的冲突。为解决这两个冲突,我从 bison 手册中得到了启发,把语句
statement 分成两大类:CloseStatement 和 OpenStatement,见下面的代码:
OpenStatement是专为if-then设立的语句,它指的是所有不以else结尾的if语句,这种语句有
三类,一类是IF condition THEN statement(要避免无穷递归,这个statement必须是非if的
CloseStatement);一类是IF condition THEN CloseStatement ELSE OpenStatement;最后一类
是WHILE condition DO OpenStatement,因为while语句是后向开放的,仍有可能以then语句结束。
OpenStatement的结尾最后是要由CloseStatement来定义的。
CloseStatement是排除掉OpenStatement之外的常规statement,除了read, write, call,
complex, repeat, assignment语句之外,还包括以else子句结尾的if-then-else语句,和以else
字句结尾的while语句。
举例:对于可能产生悬挂二义性的语句“IF cond1 THEN IF cond2 THEN stmt1 ELSE stmt2”
(stmt1和stmt2都是闭合的),应用的正确规则(略去属性文法)依次为:
statement - IF cond THEN statement
statement - Cstmt
Cstmt - IF cond THEN Cstmt ELSE Cstmt
仔细跟踪可知整个过程没有任何冲突,并且其他的规则应用序列均不能正确分析。
(三)符号表和虚拟机设计
基本上按照老师提供的框架,完成了符号表的操作和虚拟机的操作。一些在 pl3.y 中频繁用到的功
能也写成函数放在 table.c 中供调用。
以下是一些代码片断:
其中 LODX 和 STOX 是存取数组元素的指令。
三、编译及测试
(一)PL/0 编译器的生成
成功根据脚本生成 lex.yy.c 和pl3.tab 源代码:
这是 pl3.output 文件输出情况:
工程在 Windows XP + Visual C++7.0 环境中成功编译连接,得到满足脚本描述的 PL/0 编译程序
pl3.exe
(二)生成的PL/0 编译器的测试
可以看出,老师提供的所用代码均正确通过测试。
文档评论(0)