5. 语法制导翻译

语法制导翻译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值