编译程序构造
1.题目:编译程序构造 2.内容:涉及词法分析、自下而上语法分析程序的实现:SLR(1)分析器的实现以及生成中间代码。 3.具体要求 根据LR分析算法构造SLR(1)分析程序,并完成语法分析动作(当需要一个单词时,调用词法分析程序获取),同时完成语义分析生成四元式输出。要求程序具有通用性,改变文法时只需改变程序的数据初值,无需改变程序主体; (1)基本要求:完成1条说明语句、2条算数表达式和赋值语句的翻译,生成中间代码。 (2)高级要求:在完成基本要求的基础上,实现if语句和布尔表达式的翻译。if语句的文法和翻译方案参见课本。 变量说明语句的文法及相应的语义子程序:.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=lo okup(id.name); emit(E.PALCE, , p);} (2)E→E(1)+T {E.PALCE=newtemp(); emit(+,E(1).PALCE,T.PALCE,E.PALCE)} (3)E→T {E.PALCE=T.PALCE;} (4)T→T(1)*F {T.PALCE=newtemp(); emit(+,T(1).PALCE,F.PALCE,T.PALCE)} (5)T→F {T.PALCE=F.PALCE;} (6)F→(E) { F.PALCE=E.PALCE;} (7)F→id {P=LOOKUP(id.name) F.PALCE=P;} (8)F→num { P=LOOKUP(num.value) F.PALCE=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; r=1; area=r*r+r; 程序运行情况如下: 请输入源文件名称:E:\AA.TXT 语法分析过程如下: 状态栈 符号栈 语义栈 动作说明 源程序对应的二元式如下: (int,-) (id,0) (,,-) (id,1) (;,-) (id,1) (=,) (num,0) (id,0) (=,) (id,1) (*,) (id,1) (+,) (id,1) (;,-) 符号表如下: Name type value addr 0 area int 1 r int 数字表如下 源程序对应的四元式序列如下: (=,1, , r) (*,r,r,T1) (+,T1,r,T2) (=,T2,,area) 分析过程完成。 6.程序扩展要求 有能力的同学可将编译程序扩展布尔表达式、if语句的分析和四元式生成,布尔表达式和if语句的翻译参见教材。 okup(id.name); emit(E.PALCE, , p);} (2)E→E(1)+T {E.PALCE=newtemp(); emit(+,E(1).PALCE,T.PALCE,E.PALCE)} (3)E→T {E.PALCE=T.PALCE;} (4)T→T(1)*F {T.PALCE=newtemp(); emit(+,T(1).PALCE,F.PALCE,T.PALCE)} (5)T→F {T.PALCE=F.PALCE;} (6)F→(E) { F.PALCE=E.PALCE;} (7)F→id {P=LOOKUP(id.name) F.PALCE=P;} (8)F→num { P=LOOKUP(num.value) F.PALCE=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; r=1; area=r*r+r; 程序运行情况如下: 请输入源文件名称:E:\AA.TXT 语法分析过程如下: 状态栈 符号栈 语义栈 动作说明 源程序对应的二元式如下: (int,-) (id,0) (,,-) (id,1) (;,-) (id,1) (=,) (num,0) (id,0) (=,) (id,1) (*,) (id,1) (+,) (id,1) (;,-) 符号表如下: Name type value addr 0 area int 1 r int 数字表如下 源程序对应的四元式序列如下: (=,1, , r) (*,r,r,T1) (+,T1,r,T2) (=,T2,,area) 分析过程完成。 6.程序扩展要求 有能力的同学可将编译程序扩展布尔表达式、if语句的分析和四元式生成,布尔表达式和if语句的翻译参见教材。
暂无评论