当前位置: 首页> 科技> 名企 > 编译原理2

编译原理2

时间:2025/9/11 4:37:34来源:https://blog.csdn.net/weixin_73223235/article/details/139417048 浏览次数:0次

推导和短语

推导

推导过程中,每一步推导都是对句型的 最右非终结符 进行替换,最右推导(规范推导)

短语

用 β 替换 A,则 β 就是 关于A 的一个短语

直接短语是短语范围内的一步推导;

直接短语可能不唯一,但 最左直接短语 唯一确定,被称为句柄; 

例:通过推导过程找出短语和句柄

 素短语
(1) 是短语
(2) 至少包含一个终结符
(3) 不再包含其它素短语

找素短语的方法有:

找短语中最短的判断是否有终结符,若有则该短语是素短语;然后判断其他短语有是否有该素短语,若有,则其他短语不是素短语,若没有,则进一步判断是否有终结符,若有,则是,反之则不是;

以上例题中,a 和 Sb 是素短语;

语法树

基本特点和定义

1)根结点是文法开始符号;

2)内部结点一定是非终结符;

3)若某结点为ε,则该结点是叶子结点,并且其父结点无其他子结点;

根据一棵语法树无法判断是 最右推导 还是 最左推导

短语:每个子树的叶子结点组成的符号串;

直接短语:简单子树(单层分支的子树)的 叶子结点 组成的字符串是相对于简单子树根的直接短语

句柄:最左简单子树的 叶子结点组成的字符串

素短语:子树的叶子节点组成的字符串包含终结符,且在子树中不再有包含终结符的最小子树


证明某文法二义性?

找出二义性的句子 / 句型(若某个句子能够找到两种不同的最左/右推导或者存在两棵不同的语法树)


自顶向下的语法分析

1.不确定的自顶向下语法分析

   根据多个公共因子的候选式进行不确定的试探,出现错误会回溯,效率低

2.确定的自顶向下语法分析--消除左递归 消除回溯

   1) 递归下降分析法;

   2)LL(1)分析法;

消除左递归(直接左递归)
将产生式 A → Aα | β   改写为: A → βA'       A' → α A' | ε
其中, A' 新引入的非终结符 ε 不可缺少,否则推导过程无 法结束;
例:含有直接左递归的表达式文法G[E]为
G[E]:
E → E+T | T  - -存在左递归
T → T*F | F   - -存在左递归
F → (E) | i
经过消去直接左递归后得到文法 G'[E]
E → TE'
E' → +TE' | ε
T → FT'
T' → *FT' | ε
F → (E) | i
A → Aα 1 | Aα 2 | … | Aα m | β 1 | β 2 | … | β n 消除其直接左递归如下:
A β 1 A' β 2 A' ∣…∣ β n A'
A' α 1 A' α 2 A' ∣…∣ α m A' ε
例如,对产生式 E →E+T | E -T | T ,消除直接左递归后为
E TE'
E' +TE' | - TE' | ε
消除间接左递归
G[S]: S → Q c | c
Q → R b | b
R → S a | a
中的 S Q R 都具有间接左递归
S Qc Rbc Sabc
通过分配律将间接左递归化作直接左递归:
Q →  ( Sa | a ) b | b 展开后: Q → Sab | ab | b
再将改变后 Q 的产生式代入到 S 的产生式中并按分配律展开得
S →  ( Sab | ab | b ) c | c
展开后: S →  Sabc | abc | bc | c   
消除直接左递归 S->abcS' | bcS' | cS'    S'->abcS' | ε  (略有疑问)
回溯

候选式中存在公共的左因子;

A → δβ1 | δβ2 | … | δβi | βi+1 | … | βj 消除回溯,经过反复提取左因子,就能把每个非终结符(包括新引进者)的所有候选首字符集变为两两不相交(即不含公共左因子):

A δA' β i+1 ∣…∣ β j
A' β 1 ∣…∣ β i
例:对文法 G[A]: A →  aAB | a | b 提取公共左因子后的文法 G' [A] ?
G ' [A]: A →  aA ' | b
A' → AB | ε
递归下降分析器 

要求:消除左递归; 消除回溯; 

递归子程序法对应的是最左推导过程;

LL(1) 分析法

L :    自顶向下分析是从左向右扫描字符串的;

L :    分析过程用最左推导;

(1):   只需要向右查看一个符号就可决定如何推导;

LL(1)分析器是由 LL(1)分析表、分析栈和一个控制程序组成;

分析栈要求逆序入栈

First集合是 针对第一个位置的终结符 ; 并且是针对产生式的左端非终结符考察的;

Follow集合是针对产生式的右端非终结符考察的;

例1:

例2:修正等价的LL(1)文法

注:S的 first 集只有 i  而无分号 

 例3:

关键字:编译原理2

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: