前言
目录
01 文法和语言、词法分析复习
02 自顶向下、自底向上的LR分析复习
03 语法制导翻译和中间代码生成复习
04 符号表、运行时存储组织和代码优化复习
05 用C++手撕PL/0
第7章 语法制导的语义计算
语义分析是上下文有关的,目前较为常见的是用属性文法来描述程序语言语义,并采用语法制导翻译的方法完成对语法成分的翻译工作。
属性文法属性 描述文法符号的类型、值等有关的一些信息,它可以被计算或传递。
语义动作 指产生式相关联的指定操作
条件谓词 指产生式关联的接受条件,或者根据该条件谓词决定做什么语义动作
语义规则集 通常是产生式关联的一组语义规则,每个语义规则可以是一个语义动作或条件谓词。
属性\(att\)可以与某个文法符号\(a\)关联,用\(a.att\)来表示这种关联
现有一文法:
\(E\rightarrow T_1 + T_2\mid T_1 \&\& T_2\)
\(T\rightarrow num\mid true\mid false\)
将上面的文法描述为类型检查的属性文法:
\(E\rightarrow T_1 + T_2 \quad \{T_1.type=int\quad\&\&\quad T_2.type=int\}\)
\(E\rightarrow T_1 \&\& T_2\quad\{T_1.type=bool\quad\&\&\quad T_2.type=bool\}\)
\(T\rightarrow num\quad\{T.type=int\}\)
\(T\rightarrow true\quad\{T.type=bool\}\)
\(T\rightarrow false\quad\{T.type=bool\}\)
对关联于产生式\(A\rightarrow \alpha\)的语义动作\(b:=f(c_1, c_2, ..., c_k)\),如果\(b\)是A的某个属性,则b是A的一个综合属性。综合属性是自底向上传递信息。
对关联于产生式\(A\rightarrow \alpha\)的语义动作\(b:=f(c_1, c_2, ..., c_k)\),如果\(b\)是产生式右边某个文法符号X的某个属性,则b是A的一个继承属性。继承属性是自顶向下传递信息。
带标注语法分析树,即在语法树的基础上,将原来的非终结符结点修改为综合属性的赋值。
下面是一个简单表达式文法G[S]的一个仅含综合属性的属性文法(开始符号为S)
\(S\rightarrow E\quad\{print(E.val)\}\)
\(E\rightarrow E_1+T\quad\{E.val:=E_1.val+T.val\}\)
\(E\rightarrow T\quad\{E.val:=T.val\}\)
\(T\rightarrow T_1*F\quad\{T.val:=T_1.val\times F.val\}\)
\(T\rightarrow F\quad\{T.val:=F.val\}\)
\(F\rightarrow (E)\quad\{F.val:=E.val\}\)
\(F\rightarrow d\quad\{F.val:=d.lexval\}\)
其中\(d.lexval\)表示数值,\(E.val, T.val, F.val\)都为综合属性
现在要给表达式\(3*(5+4)\)构造语法树和带标注语法分析树:
下面则是一个包含综合属性、继承属性的属性文法:
\(E\rightarrow TR\quad\{R.in:=T.val;\quad E.val:=R.val\}\)
\(R\rightarrow +TR_1\quad\{R_1.in:=R.in+T.val;\quad R.val:=R_1.val\}\)
\(R\rightarrow -TR_1\quad\{R_1.in:=R.in-T.val;\quad R.val:=R_1.val\}\)
\(R\rightarrow \varepsilon\quad\{R.val := R.in\}\)
\(T\rightarrow num\quad\{T.val := lexval(num)\}\)
其中\(lexval(num)\)表示从词法分析程序得到的常数值。
可见\(E.val, T.val, R.val\)都为综合属性,\(R.in\)为继承属性
现在要给表达式\(3+4-5\)构造语法树和带标注语法分析树:
了解综合属性和继承属性。已知属性文法和输入符号串,构建语法树和带标注语法分析树。
第8章 静态语义分析和中间代码生成 中间代码生成中间代码 一种介于源语言和目标语言的中间语言形式,有:
逆波兰表示
三元式表示
四元式表示
树形表示
逆波兰表示