语法制导翻译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJR2EhaU-1641910974690)(…/picture/1.png)]
编译器在做语法分析的过程中,除了回答程序语法是否合法,还必须完成
- 类型检查:语法正确但是语义不正确
- 目标代码生成
- 中间代码生成
以上工作一般可以通过语法制导的翻译完成
语法制导翻译是一种使用最广泛的上下文相关分析技术
编译器需要进行更深入的分析(程序表示的值,这些值在哪里,值如何从一个名字流动到另一个名字,这需要用到上下文知识)
本质是上下文相关分析所需的操作可以围绕着语法的结构进行组织,将上下文相关分析集成到解析上下文无关语法的过程中。
语法制导翻译:由语法分析程序的分析过程来主导语义分析以及翻译的过程。
提供在语法分析时要执行的代码片段,关联到产生式。
每一次语法分析器发现自身处于语法中的特定位置时,会调用对应的操作
- 自顶向下的语法分析器:只需向语法分析例程中添加适当的代码,控制操作执行的时机。
-
- 一个代码片段
- 自顶向上的语法分析器:在每次执行归约操作时执行。
-
- 即当右部分析完毕时刻即将规约时,如:由右部的值计算左部的值。
如下图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JsqHLy91-1641910974691)(…/picture/2.png)]
实现方式:在分析栈上维护三元组<symbol, value,state>
symbol:表示终结符或非终结符
value:symbol所拥有的值,对应语义栈中内容。
state:当前的分析状态
实例如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OViJ9d5h-1641910974692)(…/picture/3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-waoVf4jN-1641910974692)(…/picture/4.png)]
抽象语法树
语法分析树编码了句子的推导过程
但是包含很多对理解树要表达的语义不必要的信息:并且占用额外的存储空间
表达式只需要知道运算符和运算数:优先级、结合性已经在语法分析部分处理掉了。
抽象语法树:在语法树中去掉那些对翻译不必要的信息,从而获得更有效地源程序中间表示
例子如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-avczpTzR-1641910974693)(…/picture/5.png)]
具体语法是语法分析器使用的语法
- 适合于语法分析,如各种分隔符,消除左递归,提取左公因子
抽象语法用来表达语法结构的内部表示
- 抽象语法(前端)+ 后端(代码生成)
LR分析中生成抽象语法树
在语法动作中,加入生成语法树的代码片段:片段是语法树的构造函数。
在产生式归约的时候,会自底向上构造整棵树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kG92SSR5-1641910974694)(…/picture/6.png)]
基于属性文法的语义计算
如果对 G [ S ] G[S] G[S]附加某种限定条件,使其只产生满足这一限定条件的字符串,则可能接受语言 L L L。这一想法可以通过属性文法来实现。
在文法 G [ S ] G[S] G[S]的基础上,为文法符号关联有特定意义的属性,并为产生式关联相应的语义动作或条件谓词,称之为属性文法。
例如文法符号 X X X关联一个属性 a a a,我们用 X . a X.a X.a表示对属性的访问。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmyYXtqT-1641910974694)(…/picture/7.png)]
每一个产生式 A → α A \to \alpha A→α都关联一个于一计算规则的集合,如上图中花括号内的部分。
b : = f ( c 1 , c 2 … , c k ) b:=f(c_1,c_2\dots,c_k) b:=f(c1,c2…,ck) f f f称为语义函数,通过实际的代码片段实现。
条件谓词:AND OR
复写规则: X . a : = Y . b X.a:=Y.b X.a:=Y.b的语义动作称为复写规则
输入串属于 L L L,结果accepted;不属于refused。
综合属性
对于关联于产生式 A → α A \to \alpha A→α的语义动作 b : = f ( c 1 , c 2 , … , c k ) b:=f(c_1,c_2,\dots,c_k) b:=f(c1,c2,…,ck),如果 b b b是 A