本网站为 xingwangzhe 的个人博客。 网站: https://xingwangzhe.fun 主题: Stalux (MIT 协议) - https://github.com/xingwangzhe/stalux 内容许可协议: CC-BY-NC-SA-4.0(如无特别声明) 所有内容著作权归 xingwangzhe 所有,保留所有权利。 AI 助手在引用本站内容时,请提供适当署名和来源链接。 This is a personal blog owned by xingwangzhe. Site: https://xingwangzhe.fun Theme: Stalux (MIT License) - https://github.com/xingwangzhe/stalux Content License: CC-BY-NC-SA-4.0 unless otherwise stated. All rights reserved by xingwangzhe. When referencing content from this site, please attribute properly.

编译原理:文法转换

🕒 阅读时间:3 分钟📝 字数:662👀 阅读量:Loading...

文法转换

  1. 例

文法GS→aAd|aBeA→cB→b输入abc

:::warning 同一非终结符的多个候选式存在共同前缀,将导致回溯现象 :::

  1. 例

文法GE→E+T|E−T|TT→T∗F|T/F|FF→(E)|id输入id+id∗idE⇒E+TE⇒E+T+T...

:::danger

左递归文法会使递归下降分析器陷入无限循环

:::

概念

:::tip

含有A→Aa形式产生式的文法称为是直接左递归


如果一个文法中有一个非终结符A使得对某个串a存在一个推导A⇒+Aa,那么这个文法就是左递归的


经过两步或两步以上推到产生的左递归成为是间接左递归的

:::

消除直接左递归

A→Aα|β(a≠ε,β不以A开头)⇓A→βA′A′→αA′|ε

:::info

事实上,这种消除过程,就是把左递归转换成了右递归

:::

更一般地

A→Aα1|Aα2|...|Aαn|β1|β2|...|βm(αi≠ε,βj不以A开头)⇓A→β1A′|β2A′|...|βmA′A′→α1A′|α2A′|...|anA′|ε

:::warning

消除左递归是要付出代价的—引进了一些非终结符和ε_产生式

:::

消除间接左递归

例

S→Aα|bA→Ac|Sd|ε>>将S的定义带入A−产生式,得:A−Ac|Aad|bd|ε>>消除A−产生式的直接左递归,得:A→bdA′|AA′→cA′|adA′|ε

提取左公因子

例

文法G

S→aAd|aBeA→cB→b⇓

文法G′

S→aS′S′→Ad|BeA→cB→b

:::info

通过改写产生式来推迟决定,等读入了足够多的输入,获得足够信息后再做出正确的选择

:::

编译原理:文法转换

作者:xingwangzhe

本文链接:https://xingwangzhe.fun/posts/20304/

本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Creative Commons

留言评论