您的位置:首页 > 其它

编译原理课程设计

2012-07-12 16:11 316 查看
课程设计内容

1.题目:编译程序构造

2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。

3.具体要求

根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体;

要求完成一条说明语句、一条算术表达式和赋值语句的翻译,生成中间代码。

变量说明语句的文法及相应的语义子程序:.att表示数据类型属性,fill函数表示将单词id及其类别属性填写符号表。

(0)S→D; {acc}

(1)D→int id { fill(id,int);D.att=int; }

(2)D→float id {fill(id,float); D.att=float; }

(3)D→D(1),id { fill(id,D(1).att);D.att=D(1).att; }

算术表达式和赋值语句的文法及相应的语义子程序。

(1)A→id=E; {p=lookup(id.name);

emit(=,E.PLACE , _,p);}

(2)E→E(1)+T {E.PALCE=newtemp();

emit(+,E(1).PLACE,T.PLACE,E.PLACE)}

(3)E→T {E.PLACE=T.PLACE;}

(4)T→T(1)*F {T.PLACE=newtemp();

emit(+,T(1).PLACE,F.PLACE,T.PLACE)}

(5)T→F {T.PLACE=F.PLACE;}

(6)F→(E) { F.PLACE=E.PLACE;}

(7)F→id {P=LOOKUP(id.name)

F.PLACE=P;}

构造其用于SLR(1)分析的识别活前缀的DFA以及action表和goto表。然后编程实现。(关于词法分析部分只需识别出与此文法相关的单词即可(+,*,(,),id,=))。

4.程序设计提示:

(1)分析栈设计时可以用一个栈完成,也可以设计三个栈:一个符号栈,一个状态栈,一个语义栈,归约时,则需要在符号栈中退掉n个符号,在状态栈中退掉n个符号(n为产生式符号个数),语义栈中退掉n个符号对应的语义;

(2)终结符表和非终结符表的组织和预测分析程序中相同(将符号对应到一个数字,表示在分析表中对应的下标)。

(3)action表中的错误处理:简化的错误处理:当查找action表出现空白时,则当前单词无法移进和规约,可简单的认为当前单词为多余的单词,则抛弃当前单词,读下一单词继续分析。

5.测试数据:

作为程序测试数据,以赋值语句area=r*r+r$作为测试输入(源程序)。程序要求输出二元式序列、符号表、语法分析过程、四元式序列。

假设AA.TXT的文件内容如下:

int area,r;

area=r*r+r;

程序运行情况如下:

请输入源文件名称:E:\AA.TXT<回车>

语法分析过程如下:

状态栈 符号栈
语义栈 动作说明

源程序对应的二元式如下:

(int,-)

(id,0)

(,,-)

(id,1)

(;,-)

(id,0)

(=,-)

(id,1)

(*,-)

(id,1)

(+,-)

(id,1)

(;,-)

符号表如下:

0area

1r

源程序对应的四元式序列如下:

(*,r,r,T1)

(+,T1,r,T2)

(=,T2,,area)

分析过程完成。

PS:单表达式和赋值语句SLR表

状态
ACTION
GOTO
i
=
+
*
(
)
;
#
A
E
T
F
0
S1
1
S2
2
S7
S6
3
4
5
3
S9
S8
4
R2
S10
R2
R2
5
R4
R4
R4
R4
6
S7
S6
11
4
5
7
R6
R6
R6
R6
8
ACC 0
9
S7
S6
12
5
10
S7
S6
13
11
S9
S14
12
R1
S10
R1
R1
13
R3
R3
R3
R3
14
R5
R5
R5
R5
[align=left]源码下载地址:http://download.csdn.net/detail/eyuanatqqdotcom/4425196[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: