本网站为 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.

编译原理:文法转换

🕒 阅读时间:5 分钟📝 字数:1665👀 阅读量:Loading...

文法转换

GSaAd|aBeAcBbabc

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

GEE+T|ET|TTTF|T/F|FF(E)|idid+ididEE+TEE+T+T...

:::danger

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

:::

概念

:::tip

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


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


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

:::

消除直接左递归

AAα|β(aε,βA)AβAAαA|ε

:::info

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

:::

更一般地

AAα1|Aα2|...|Aαn|β1|β2|...|βm(αiε,βjA)Aβ1A|β2A|...|βmAAα1A|α2A|...|anA|ε

:::warning

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

:::

消除间接左递归

SAα|bAAc|Sd|ε>>SA,:AAc|Aad|bd|ε>>A,:AbdA|AAcA|adA|ε

提取左公因子

文法G

SaAd|aBeAcBb

文法G

SaSSAd|BeAcBb

:::info

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

:::

编译原理:文法转换

作者:xingwangzhe

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

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

留言评论