2.1.5. 通用的分析例程
想法:要用适当的右端替换栈顶的变量,使用向前看
符号和左端在 LL 分析表中查找右端。
(LL[,] 就是分析表。):
push(S) read(symbol) 当栈非空时获取向前看符号
case 栈顶元素为
终结符:
if 栈顶元素 == symbol
then { pop(); read(symbol) } 弹出终结符并获取下一个向前看符号
else
error
非终结符:
if LL[栈顶元素,symbol] <> error
then { pop(), 弹出左部
push(LL[栈顶元素,symbol]) } 压入右部
else
error
end case
end while if symbol <> $, then error
备注
对前面的例子,尝试以下追踪:
分析串: aabbb
分析串: b
我们将使用 FIRST 和 FOLLOW 这两个函数来帮助
计算分析表。
2.1.6. 构造 LL 分析表 LL[rows,cols]
对每条规则 \(A \rightarrow w\)
对 FIRST(w) 中的每个 a
把 w 加入 LL[A,a]
如果 \(\lambda\) 在 FIRST(w) 中
对 FOLLOW(A) 中的每个 \(b\) ,把 \(w\) 加入 LL[A,b]
其中 \(b \in T \cup \{\$\}\)
每个未定义的表项都是错误。
注释(Comments):
有些 CFL 没有 LL(k) 分析器
有些语言,某些文法有 LL(k) 分析器,而另一些文法没有。