前后文无关文法和语言
(相当于取交集)
(乘法)
(是一个集合,集合中有一个元素,元素是空串)
文法G[S]
- 文法是一个四元式
- :非终结符号集
- :终结符号集
- :产生式集
- :开始符号
[!TIP]
一个文法均有产生式,如:
首先,产生式左部一定有非终结符
产生式的右部一般有终结符(至少有一个产生式右部有终结符,否则文法无意义)
另外,文法一定有开始符号,用于标识文法推导应该从哪个非终结符开始。
对于一个句子,开始符式就是:句子 这个 非终结符(类记号)
分析文法
自顶向下
- 最左推导:被替换的非终结符总是当前字符串的最左非终结符
- 最右推导:被替换的非终结符总是当年潜伏好的最右非终结符 最右推导,也称为规范推导
自底向上
- 最右归约:被规约的总式当前符号串最右
- 最左归约: (规范规约)
[!TIP]
最左推导的逆过程就是最右规约
最右推导的逆过程就是最左规约
语法树
- 子树:任一节点 及其 全部后继
- 直接子树(树高为1):子树根只有直接后继?
[!tip]
直接后继:在树中,一个节点的直接后继式其直接的孩子节点。
* / \ + 5 / \ 3 4以
+为根的子树+ / \ 3 4,就是的直接后继
-
一棵语法树 多种推导序列
-
一棵语法树 唯一最左推导和最右推导 二义性判断会用到
-
二义性文法: 的某个句子对应不止一个 最左/最右 推导 即,L(G)中某个句子,对应不止一个语法树
-
无二义性文法:该文法所产生的每个句子都仅右一棵语法树
[!tip] L(G) 是文法 G 能生成的所有合法句子的集合。
[!tip]
对于文法
句子 的二义性:
最左推导1(先展开第一个 为 ):
语法树:
S /|\ S + S a /|\ S * S a a(等价于 )
最左推导2(先展开第二个 为 ):
语法树:
S /|\ S * S /|\ a S + S a a(等价于 )
这两个推导对应 不同的语法树,导致运算优先级不同(乘法优先 vs. 加法优先),因此 是二义性文法。
- 短语:每颗子树的叶子
- 直接短语:每棵直接子树的叶子
- 句柄:某句型的最左直接短语(即规范分析中最先被规约的子串)
- 素短语:至少包含一个终结符 且不包含更小素短语的短语
[!tip]
对于,语法树:
S /|\ S * S /|\ a S + S a a其叶子,即
a + a * a
[!warning]
最右推导,找最左直接短语
因为替换是反向操作,最左直接短语是最后被替换为终结符的
就应该最先被替换为非终结符
化简文法
-
从开始一步步看,将含有永远消不掉的符号的产生式消去 所有的(无用符号,无用产生式)
因为,产生式是用来产生仅由终结符组成的句子的,无法终结,即产生式无法产生句子,故无用
-
删 -产生式
-
删 形如 的 单产生式