
一、实验目的
通过在词法分析,语法分析和语义分析程序的基础上,将源代码翻译成中间代码,认识中间代码的表示形式和生成中间代码的原理和技巧,掌握中间代码生成器的构造原理和语法制导翻译的实现方法。
二、实验内容
用Bison进行语法分析的基础上,编写一个中间代码生成程序。**(文法定义**见教材附录 A.1,p394)
三、实现方案
需要考虑以下方面:
通过在词法分析,语法分析和语义分析程序的基础上,将源代码翻译成中间代码,认识中间代码的表示形式和生成中间代码的原理和技巧,掌握中间代码生成器的构造原理和语法制导翻译的实现方法。
用Bison进行语法分析的基础上,编写一个中间代码生成程序。**(文法定义**见教材附录 A.1,p394)
需要考虑以下方面:
掌握LR语法分析器的构造原理,掌握Bison工具的编程方法
用Bison编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
1.参考实验示例完成,提交实验报告。 2.实验的结果为:按归约的先后顺序显示每次归约时所使用的产生式。(最右推导使用产生式的逆过程)
compile.y
, 核心代码如下掌握语法分析器的构造原理,掌握递归下降法的编程方法。
用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。(注意,需要改写文法,消除左递归等)
掌握词法分析器的构造原理,理解单词的类别和识别方法,掌握手工编程或 LEX 编程方法之一。
编写一个词法分析器,能够将输入的源程序转换为单词序列输出。
(1)该语言的关键字:if while do break real true false int char bool float
(其中,int、char、bool、float
在产生式中为basic
) 所有的关键字都是保留字,并且必须是小写。
(2)id和num的正则表达式定义;
(3)专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
(4)空格由空白、换行符和制表符组成。空格通常被忽略,除了它必 须分开ID、NUM关键字。
(5)程序书写格式自由:一行可以有多个语句,一个语句也可以有多 行,单词之间可以插入任意空格。
(6)考虑注释。注释由/*
和*/
包含。注释可以放在任何空白出现的位置, 且可以超过一行。注释不能嵌套。
构造一个从中缀表达式到后缀形式的表达式翻译器,初步了解递归下降语法分析原理及语法制导翻译的过程。
'+'
、'-'
、"*"
、"\"
、"("
、")"
、空格构成的中缀表达式expr
-->
expr + term
expr - term
term
term
-->
term * factor
term / factor
factor
factor
-->
(expr)
ID
NUM