实验三语义分析报告-Word文档下载推荐.doc
《实验三语义分析报告-Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《实验三语义分析报告-Word文档下载推荐.doc(15页珍藏版)》请在冰豆网上搜索。
基本思想是,根据翻译的需要设置文法符号的属性,以描述语法结构的语义。
例如,一个变量的属性有类型,层次,存储地址等。
表达式的属性有类型,值等。
属性值的计算和产生式相联系。
随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务。
2.翻译方案设计
1)设计原理:
在实验二的基础上为文法符号引进一组属性及相应求值规则和动作,得到属性翻译文法,并引进一个符号表(包括变量名,变量数据是否有效,变量地址,变量的具体数据,数据类型等),在进行语法分析的同时,结合符号表完成语义分析与检测,同时根据属性翻译文法的属性及相关动作得到中间代码(抽象机式汇编指令),最后通过模拟的抽象机运行出结果。
2)设计方法:
(@为动作标志,↓为继承属性,↑为综合属性)
结合课本语法制导相关内容对文法增加属性和动作如下:
以下列出有修改的属性翻译文法:
①<
declaration_stat>
↓vartablep,datap,codep→intID↑n@name-def↓n,t;
其中动作符号的含义如下
@name-def↓n,t:
插入符号表;
②<
if_stat>
→if(<
expr>
)@BRF↑label1<
statement>
@BR↑label2@SETlabel↓label1|if(<
)@BRF↑label1<
statement>
@BR↑label2@SETlabel↓label1else<
statement>
@SETlabel↓label2
@BRF↑label1:
输出BRFlabel1;
@BR↑label2:
输出BRlabel2;
@SETlabel↓label1:
设置标号label1;
@SETlabel↓label2:
设置标号label2;
③<
while_stat>
→while@SETlabel↑label1(<
expression>
)@BRF↑label2<
@BR↓label1@SETlabel↓label2
@SETlabel↑label1:
@BRF↑label2:
输出BRFlabel2;
@BR↓label1:
输出BRlabel1;
@SETlabel↓label2:
④<
for_stat>
→for(<
@POP;
@SETlabel↑label1<
expression>
@BRF↑label2@BR↑label3;
@SETlabel↑label4<
@POP@BR↓label1)@SETlabel↓label3<
@BR↓label4@SETlabel↓label2
@SETlabel↓label1:
@BRF↑label2:
@BR↑label3:
输出BRlabel3;
@SETlabel↓label4:
设置标号label4;
@BR↑label1:
@SETlabel↓label3:
设置标号label3;
@BR↑label4:
输出BRlabel4;
⑤<
write_stat>
→write<
@OUT;
@OUT:
输出OUT
⑥<
read_stat>
→readID↑nLOOK↓n↑d@IN@STO↓d@POP;
@LOOK↓n↑d:
查符号表n,给出变量地址d;
没有,变量没定义;
@IN:
输出IN;
@STO↓d:
输出指令代码STOd;
@POP:
将栈顶元素出栈
⑦<
→ID↑n@LOOK↓n↑d@ASSIGN=<
bool_expr>
@STO↓d@POP|<
@ASSIGN:
记住当前文件位置;
⑧<
→<
additive_expr>
|<
additive_expr>
>
<
@GT
@LES
=<
additive_expr>
@GE
@LE
==<
@EQ
!
@NOTEQ
@GT:
次栈顶与栈顶作大于比较;
@LES:
次栈顶与栈顶作小于比较;
@GE:
次栈顶与栈顶作大于等于比较;
@LE:
次栈顶与栈顶作小于等于比较;
@EQ:
次栈顶与栈顶作等于比较;
@NOTEQ:
次栈顶与栈顶作不等于比较;
B→+<
term>
B@ADD|-<
B@SUB|ε
⑨<
additive_A>
→+<
@ADD|-<
@SUB|ε
@ADD:
操作数相加;
@SUB:
操作数相减;
C→*<
factor>
C@MULT|/<
C@DIV|ε
⑩<
term_A>
→*<
@MULT|/<
@DIV|ε
@MULT:
操作数相乘;
@DIV:
操作数相除;
⑪<
factor>
→(<
)|ID↑n@LOOK↓n↑d@LOAD↓d|NUM↑i@LOADI↓i
@LOOK↓n↑d:
@LOAD↓d:
将地址d的变量入栈;
@LOADI↓i:
将常量i入栈;
3)设计结果:
1)<
program>
→{<
declaration_list>
statement_list>
}
2)<
<
|ε
3)<
4)<
5)<
→<
|<
compound_stat>
|<
expression_stat>
6)<
7)<
→while@SETlabellabel1(<
)@BRF↑label2<
8)<
;
@BR↓label1)@SETlabel↓label3<
@BR↓label2
9)<
10)<
11)<
compound_stat>
12)<
|;
13)<
14)<
bool_A>
15)<
→>
@GT|<
@LES|>
@LE|==<
@EQ|!
@NOTEQ|ε
16)<
additive_expr>
17)<
18)<
term>
19)<
20)<
三、实验过程
首先,理解书上的代码和观看相关的知识的PPT,深入理解属性反应文法的作用,据此在我之前实验写好的语法分析基础上进行修改,写出语义分析代码。
在语义分析里增加“不可引用未赋初值变量”的规则,在init()、showVarTable()、checkInitValue()中增加了相关操作。
然后,结合栈式抽象机及其汇编指令相关命令的操作含义,模拟写出TEST语言的抽象机模型用以运行文法生成的中间代码。
最后,写出执行中间代码的虚拟机程序。
最后,编写TEST语言程序进行代码实例测试,调试观察运行过程及结果,并调试修改程序BUG。
代码完成后,测试、完善。
//定义符号表结构,添加未赋初值记录
s