文法和语言的形式描述 词法分析 - 编译原理

先解释几个单词便于记忆。在 G(V_N, V_T, P, S) 中
非终结符 nonterminal symbol
终结符 terminal symbol
产生式 production

接下来我以正则表达式为实例来解释编译原理的一些东西,因为编译原理太过抽象,初学者没有实例可以类比,难于理解。我只解释难理解的一部分,还需要对照书本来看。
非终结符是可推导的:比如正则表达式中 *,+ 这些,可以代表一类元素。终结符是类似于 a,b,c,1,2 之类的,只能能代表他自己。
上下文有关文法,比如 {0,9}+,越推导越多的式子。
“归约”就是把字符串 “12345” 再抽象回式子 {0,9}+。
词法规则可以用3型文法来描述,它产生的集合是正规集。

对于字母表∑      L(ε)={ε}   L 应该是language,也可理解为 lanch 展开。式子表示的意思是:正规式产生的正规集 {ε}。
b(ab)^*=(ba)^*b,(a|b)^*=(a^*b^*)*。考虑一下 a、b 位置顺序固定吗?不固定。

确定的有限自动机:(S,∑,f,s_0,Z)
NFAM→DFAN:简单理解就是把不确定的过程看成一坨,新的坨之间就都是确定的。

为什么正规式对应于NFAM ?   举个例子   *→1|3|d|,    ,这种式子显然是不确定的。

直接短语好理解,那么非直接短语有例子吗?       嵌套的for语句。
最左直接短语就是最精简的那种抽象: “12345abd” → {0,9}+ {a-z}+→*     这么举例可能不太恰当,大概就是这个意思。

消除文法的左递归:
A→Aα | β   改造为:
A→βA'
A'→αA' | ε
因为把 A 这个式子推到不能再推,序列里全是终结符时,最左一定是 β ,所以就可以提取出来。

LL(1)文法可以看作无歧义文法,没有左递归也没有公共因子。那么为什么有FOLLOW(A)的限制?推导式要避免重复。

计算FOLLOW(A)时就把所有的式子推导到只有A,然后观察即可,这样看简单点。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章