假设我有以下语法:
Expr -> Expr plus Expr (1)
| Expr minus Expr (2)
| num (3)
在进行最左派的时候,在“扩展”Expr
之后,应该如何知道要使用哪种生产?
例如,如果我想解析1 + 2 - 3
,我会从:
Expr => Expr minus Expr
但这只会发生,因为这只是一个小例子,很容易看出(3)
会迅速导致无处,(2)
不适合下一步。这个例子会不会更复杂,我必须让事情基本上是反复试验。这是“正确的”方法还是我错过了什么?
答案 0 :(得分:1)
因为解析CFG本质上是非确定性的,所以没有通用的方法事先“知道”哪些可能的规则是正确的。基本上在最简单的层面上它确实是反复试验。就像分离布尔表达式if(a OR b OR c)
一样,将逐个评估各个术语,直到成功为止,否则整个规则将失败。因此,您的解析器应该从规则(1)开始,尝试解析输入,如果失败,请从规则(2)开始重新启动,依此类推。