- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
微型语言编译器
微型语言编译器
Author:谭添升(031162020)
时间:2006年5月28日
功能以及使用说明:
开发环境:WindowsXp+Cygwin+Flex+BYacc+gcc
使用说明:源程序主要有scan.l 和grammer.y,main.c,global.h.
global.h主要为Lex和Yacc以用主程序main.c要共同使用的变量声明.,scanl.l为lex
说明文件,是词法分析程序,Gramer.y为Yacc说明文件,其内容包括语法分析,代码生成等.
由于scanl.l与grammer.y均是在Cygwin环境下编译,对一般Xp系统,可能无法编译,所以
我已经下载了flex和byacc 的windows版本,放在ForWin下,,只要装了VC++6.0(其它的
没试过)在windows机器上也可以编译说明文件,并且提供了MAKEFILE,在ForWin作为
当前目录时使用VC++自带的NMAKE 实用程序即可从scan.l和grammer.y构建编译器,
生成的main.exe 即可运行.
main.c为实际的主程序,主要将生成的指令数组写入到文件.
使用编译器:编译源文件的方法为:Usage:main soucefile [destfile], 其中的目标文件
可以省略,默认为当前目录下的a.txt.本文最后附有成功构建和编译测试文件的截图, 可
供参考.
code 目录下附有我的一些测试文件,和一个求最大公约数的程序,比较容易看明白.
本编译器接收的文法.
① 基本上按照老师给的PPT给出的文法,但有几处修改.首先是Dec 和Body之间的分
号被去掉,因为存在这个分号会和Vardec和Dec之间的分号冲突,而遇到这种冲突,YACC是尽
量移入,导致Body 不能得到归约.
② 另一个是Statement的规则右部少了ReadSt,和WriteSt,导到这两个符号不能规约,这
应该是原文法的一个失误.总之,这两处修改基本不改变可接收的语言.除了一个分号.
③ 示例源程序如下(本编译器支持类C 的注释风格):
/*变量重定义,编译器可以检测到,并给出重定义的变量*/
/*error:line 6variable a redefinition*/
vara:int;
varb:real;
varc:real;
vara:real
begin
a:=1;
b:=1.5;
c:=2.5
end
翻译方案的实现
在YACC 的说明文件中,语义动作使用了带回填的翻译方案.其中的Jumplist 为回填所使
用的指令指针表.为便于回填,生成的代码指令预先放入结构体数组structCode code[]中,具体
实现请参考grammer.y文件.
附:
ForLinux版本:
ForWin版本(有waning但编译成功):
Forwin的main.exe来编译程序(由于Flex和byacc 是Fordos的,所以可能nmake 后即编译不
能显示汉字.
文档评论(0)