实验 6 简单中间代码生成1、实验目的:综合运用所学知识,集成词法分析、符号表管理等程序的成果,在语法分析和文法属性计算的基础上,完成中间代码的生成工作。
让学生全面了解一个编译器工作的全过程,真正全面掌握编译的思想和方法。
2、实验的基本原理对于一个给定文法,通过改写文法,使其满足LR(1)文法的要求,根据语义确定文法符号的属性,确定语义规则或翻译方案;根据文法特点构造LR(1)分析表,进而构造语法分析和属性计算程序。
分析程序在分析表的驱动下,完成对给定的句子进行语法分析和属性计算工作,最后生成三地址中间代码序列。
3、实验内容及要求a.实验所用文法如下。
statmt → id = expexp → exp addop term | termaddop →+ | -term→ term mulop factor | factormulop → * | /factor → ( exp ) | id | num其中id和num为实验二中定义的标识符和常数,因此这里还需要一个小的词法分析器来得到id和num。
b.构造文法LR(1)项目集,构造ACTION和GOTO矩阵,确认文法满足LR(1)文法要求。
c.按一般高级语言赋值语句的计算要求定义文法的属性和语义规则,属性计算的结果是将给定赋值语句翻译成三地址代码序列,并输出此序列。
d.从数据文件中读出赋值语句,并对其进行语法分析,对合法语句,输出其翻译结果。
e.实验数据文件中应该有多个语句,可能有正确的也应该有错误的语句;语句中的表达式有形式简单的也应该有复杂的。
每个表达式写在一行,以$结束。
4、实验步骤准备好用于实验的赋值语句序列,并存储在文件中。
a.编写单词分析子程序,能从源程序中分离出单词(包括标识符和常数);词法分析器以子程序形式出现,当需要进行词法分析时进行调用;b.构造分析表,确认上述文法为LR(1)文法,定义属性和语义规则。
c.确定临时变量生成方案,构造其生成程序。
d.编写自下而上分析程序,这个程序应该能够识别正确和错误的语句;同时进行语义计算。
e.逐个读入语句,给出正误评判,并输出正确语句翻译结果。
问题求解1.拓广方法由于文法的开始符号只在方法中出现一次,并不在产生式右部出现,所以方法可以不用扩展。
1)statmt → id = exp2)exp → exp addop term3)exp → term4)addop → +5)addop → -6)term→ term mulop factor7)term→ factor8)mulop → *9)mulop → /10)factor → ( exp )11)factor → id12)factor → num2.构造LR(1)项目集I0:statmt →·id = exp , $I1: goto( I0 , id )statmt →id·= exp , $I2: goto( I1 , = )statmt →id =·exp , $exp →·exp addop term , $|+|-exp →·term , $|+|-term→·term mulop factor , $|+|-|*|/term→·factor , $|+|-|*|/factor →·( exp ) , $|+|-|*|/factor →·id , $|+|-|*|/factor →·num , $|+|-|*|/I3: goto( I2 , exp )statmt →id = exp·, $exp →exp ·addop term , $|+|-addop →·+ ,(|id|numaddop →·- ,(|id|numI4: goto( I2 , term )exp → term· , $|+|-term→ term· mulop factor , $|+|-|*|/mulop →·* ,(|id|nummulop →·/ ,(|id|numI5: goto( I2 , factor )term→factor· , $|+|-|*|/I6: goto( I2 ,( )factor → (·exp) , $|+|-|*|/exp →·exp addop term , )|+|-exp →·term , )|+|-term→·term mulop factor , )|+|-|*|/term→·factor , )|+|-|*|/factor →·( exp ) , )|+|-|*|/factor →·id , )|+|-|*|/factor →·num , )|+|-|*|/I7: goto( I2 , id )factor →id· , $|+|-|*|/I8: goto( I2 , num )factor →num· , $|+|-|*|/I9; goto( I3 , addop )exp → exp addop· term , $|+|-term→·term mulop factor , $|+|-|*|/term→·factor , $|+|-|*|/factor →·( exp ) , $|+|-|*|/factor →·id , $|+|-|*|/factor →·num , $|+|-|*|/I10: goto(I3 , + )addop → +· ,(|id|numI11: goto(I3 , - )addop → -· ,(|id|numI12: goto(I4 , mulop )term→ term mulop· factor , $|+|-|*|/ factor →·( exp ) , $|+|-|*|/factor →·id , $|+|-|*|/factor →·num , $|+|-|*|/I13: goto( I4 , * )mulop → *· ,(|id|numI14: goto( I4 , / )mulop → /· ,(|id|numI15: goto( I6 , exp )factor → (exp·) , $|+|-|*|/exp → exp· addop term , )|+|-addop →·+ ,(|id|numaddop →·- ,(|id|numI16: goto( I6 , term )exp → term· , )|+|-term→ term· mulop factor , )|+|-|*|/ mulop →·* ,(|id|nummulop →·/ ,(|id|numI17: goto( I6 , factor )term→ factor· , )|+|-|*|/I18: goto( I6 , ( )factor → (·exp) , )|+|-|*|/exp →·exp addop term , )|+|-exp →·term , )|+|-term→·term mulop factor , )|+|-|*|/term→·factor , )|+|-|*|/factor →·( exp ) , )|+|-|*|/factor →·id , )|+|-|*|/fac tor →·num , )|+|-|*|/I19: goto( I6 , id )factor → id· , )|+|-|*|/I20: goto( I6 , num )factor → num· , )|+|-|*|/I21: goto( I9 , term )exp → exp addop term· , $|+|-term→term ·mulop factor , $|+|-|*|/mulop →·* ,(|id|nummulop →·/ ,(|id|numgoto( I9 , factor ) == I5goto( I9 , ( ) == I6goto( I9, id ) == I7goto( I9, num ) == I8I22: goto( I12 , factor )term→ term mulop factor· , $|+|-|*|/ goto( I12 , ( ) == I6goto( I12, id ) == I7goto( I12, num ) == I8I23: goto( I15 , addop )exp → exp addop· term , )|+|-term→·term mulop factor , )|+|-|*|/term→·factor , )|+|-|*|/factor →·( exp ) , )|+|-|*|/factor →·id , )|+|-|*|/factor →·num , )|+|-|*|/I24: goto( I15 , ) )factor → ( exp ) · , $|+|-|*|/goto( I15 , + ) == I10goto( I15 , - ) == I11I25: goto( I16 , mulop )term→ term mulop· factor , )|+|-|*|/ factor →·( exp ) , )|+|-|*|/factor →·id , )|+|-|*|/factor →·num , )|+|-|*|/goto( I16 , * ) == I13goto( I16 , / ) == I14I26: goto( I18 , exp )factor → (e xp·) , )|+|-|*|/exp →exp· addop term , )|+|-addop →·+ ,(|id|numaddop →·- ,(|id|numgoto( I18 , term ) == I16goto( I18 , factor ) == I17goto( I18 , ( ) == I18goto( I18 , id ) == I19goto( I18 , num ) == I20goto( I21 , mulop ) ==I12goto( I21 , * ) ==I13goto( I21 , / ) ==I14I27: goto( I23 , term )exp → exp addop term· , )|+|-term→ term· mulop factor , )|+|-|*|/ mulop →·* ,(|id|nummulop →·/ ,(|id|numgoto( I23 , factor ) == I17goto( I23 , ( ) == I18goto( I23 , id ) == I19goto( I23 , num ) == I20I28: goto( I25 , factor )term→ term mulop factor· , )|+|-|*|/goto( I25 , ( ) == I18goto( I25 , id ) == I19goto( I25 , num ) == I20I29: goto( I26 , ) )factor → ( exp )· , )|+|-|*|/goto( I26 , addop ) == I23goto( I26 , + ) == I10goto( I26 , - ) == I11goto( I27 , mulop ) == I25goto( I27 , * ) == I13goto( I27 , / ) == I143.,画出自动机5.判断是否是LR(1)文法由于按照LR(1)分析表的构造方法所构造出的分析表中,每一项至多只有一个动作,所以该文法是LR(1)的,可以用LR(1)方法分析。