APP下载

编译技术——SIMPLE语言的语法制导翻译程序的设计

2009-04-29贾燕梅

管理观察 2009年10期
关键词:解释

贾燕梅

摘 要:近年来,信息技术的迅猛发展,对软件技术和软件工具的需求急剧增加,编译技术已大量应用于各种各样软件工具的研制和开发中。本课程设计从最初语言的定义开始,终结符号的说明,到验证词法分析器、语法分析器功能和语义分析功能的实现,为后续内容中间代码、目标代码的生成打下更为坚实的理论和实践基础。

关键词:编译原理 编译程序 解释 词法分析器 语法分析器

一、语言定义

(一) 字符集的定义:

1.<字符集>:= <字母> | <数字> | <单界符>

2.<字 母> := A | B…….| Z | a | b | ……….| z

3. <数字> := 0 | 1 | 2 |……| 9

4.<单界符> := ' | ( | ) | * | + | , | - | . | / | : | ; | < | = | > | [ | ] _ //15-31

(二) 单词集的定义:

<单词集>:= <保留字> | <双界符> | <标识符> | <常数> | <单界符>

6.<保留字> := and | array | begin | bool | call | case | char | constant | do | else | end | false | for | if | input | integer | not | of | or | output | read | real | repeat | return |set | then | to | true | until | main | void | while | write//32-64

7. <双界符> := <> | <= | >= | := | /* | */ | ..// 1-7

8.<标识符> := 〈字母〉| 〈标识符〉〈数字〉| 〈标识符〉〈字母〉

9.〈常数〉:= 〈整数〉|〈布尔常数〉|〈字符常数〉|〈常数标识符〉|〈实数〉

10.<整数〉:=〈数字〉|〈整常数〉〈数字〉

(三) 表达式的定义

11. <表达式>:=<算术表达式>|<布尔表达式>|<字符表达式>

12.<算术表达式>:=<算术表达式>+-<项>|+-<项>|<项>

13. <项>:=<项>* <因子>|<项>/<因子> | <因子>

14. <因子>:=<算术量> | (<算术表达式>)

15.<算术量>:=<整数标识符>|<实数标识符> | <正整数常数> | <正实数常数>

(四) 语句定义

16. <语句>:=<变量声明语句>|<函数声明语句>|<赋值语句>|<布尔表达语句>|

<函数调用语句>|<输入语句>|<输出语句>|<return语句>|<复合语句>

17.<类型>:= integer | char | real | bool

18. <变量声明语句>=<类型><赋值表达式>;|<类型><赋值表达式>,<赋值表达式>;

19. <输入语句>:=input:<变量表>;

二、各终结符说明

(一)单终结符

三、各功能模块的实现

(一)词法分析器的实现

其基本思路是每次从源文件中读一行放入缓冲区。再从缓冲区中每次读取一个字符进行判断,为方便判断,每次多读一个字符,根据不同的字符进入不同的处理过程。将识别出的每一个单词(标识符,立即数)都填入符号表中,并返回符号表的入口以作为TOKEN的第二个分量。这样构成的TOKEN的第一个分量是种别码,如果是关键字,第二个分量为空,否则,TOKEN的第二分量为该单词在符号表中的入口地址。

(二)语法分析器的实现

本编译器采用语法语义分析在同一遍中完成。所用中间代码为四元式序列。语法分析阶段采用LL(1)分析法,采用算符优先的至顶向下分析法,但是不使用堆栈保存各种状态,而是设置一个字符变量表示当前状态,再根据所出现的符号,判断是否规约和执行各种语义动作,直到出现终结状态。在识别出合法的语义后,如果有四元式产生,则写入中间代码文件parser.txt中。

(三)四元式解释器的实现

本编译器直接将中间代码四元式解释执行。四元式的结构为:(运算符,direction,source1,source2)。

解释程序写在exceut.h中,其就为一个switch语句,根据不同的四元式操作而执行相应的操作。源程序的执行结果直接在标准输出上输出。解释程序结束后,对资源进行回收。

四、测试数据及结果

由于系统庞大,受篇幅的限制,仅选取了比较有代表性的几个测试结果作为说明。

输入源程序所在文件:我们选择soure.txt内容为

{函数调用}

Procedure add(x,y);

Begin

x:=x+y;

end;

{主函数}

Program exp;

Var a,b:integer;

begin

a:=4*(2-3)/2;{测试优先级}

b:=10;

b:=a+b;

write(b);{测试输出语句}

if a>b then{测试if-then-else}

a:=b;

else

b:=a;

write(b);

call add(a,b);{调用函数}

write(a);

While a<b do{测试while-do}

a:=b-a*2;

write(a);

end.

开始欢迎界面,输入1,我们看见符号表已近生成。当然由于屏幕的原因,显示不全。输入2, 输入1, 继续执行结果,我们发现实现正确的结果。◆

参考文献:

[1] 贺汛.《编译方法学习指导与实践》,机械工业出版社

猜你喜欢

解释
宪法司法化研究
马克·吐温的墓中回忆录:《戏谑人生》
侵犯商业秘密罪的无罪辩护
关于民事诉讼法司法解释重点问题的思考
大学英语阅课教学中的3+1
别让“解释”伤了爱
以“历史性”视角解读译作中的翻译活动
关于近地天体撞击地球原理的猜想
《拯救乳房》对创伤性体验与创伤后成长的书写
贪污贿赂:两高发布新“解释”