先解释几个单词便于记忆。在 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,然后观察即可,这样看简单点。