程序设计 3 语义分析程序的设计与实现
实验报告
班级:-------- 姓名:-------- 学号:--------
一、 实验题目与要求
题目:语义分析程序的设计与实现。
实验内容:编写语义分析程序,实现对算术表达式的类型检查和求值。要求所分析算术表达
式由如下的文法产生。
||
* | / |
. | ( ) |
E E T E T T
T T F T F F
F num num E num
实验要求:用自底向上的语法制导翻译技术实现对表达式的分析和翻译。
(1) 写出满足要求的语法制导定义或翻译方案。
(2) 编写分析程序,实现对表达式的类型进行检查和求值,并输出:
① 分析过程中所有产生式。
② 识别出的表达式的类型。
③ 识别出的表达式的值。
(3) 实验方法:可以选用以下两种方法之一。
① 自己编写分析程序。
② 利用 YACC 自动生成工具。
二、 实验分析
本次实验使用 YACC 语法分析程序生成器,其中词法分析调用了 LEX 词法分析程
序,在实验 2 的基础上进行扩展。首先文法中删去了 id,因此在 lex 语法中删去关于 id
的识别,同时在 yacc 语法中添加了对 num.num 这一文法的识别。由于要通过自底向上
的语法制导翻译技术来实现对表达式类型的检查以及求值,因此必须对识别出的符号的
属性进行扩充,由原先的 value 扩充到 value 和 type,即定义第二个综合属性 E.type。
这需要将原先 YYSTYPE 的类型由 double 扩充为 struct,在 struct 中包含 value 和 type
两个属性。然后对表达式中的翻译方案进行修改,根据不同表达式决定产生式的类型。
因此首先要分析文法的翻译方案。
由于文法中只有 num 和 num.num,因此本文法涉及的类型只有 int 和 real。又因为
int 可以隐式类型转换成 real 类型,因而本文法中重点考虑的是类型转换而非之前定义
id 时需要考虑的判断类型是否合法;再加上文法全部是规约至标识符的语句,所以判断
类型即判断标识符的类型。由分析可知,F->num.num 得到的是 real 类型,F->num 得
到的是 int 类型,而在计算中,当两个标识符都是 int 型时,得到结果的标识符为 int 型,
而存在一个标识符为 real 型,另一个标识符为 int 型时,后者需要隐式类型转换为 real
型,得到的结果也就是 real 型了。