制作输入字符串的最左派。如何预测使用哪种生产?

时间:2011-06-02 04:56:13

标签: context-free-grammar compiler-construction

假设我有以下语法:

Expr -> Expr plus Expr  (1)
     |  Expr minus Expr (2)
     |  num             (3)

在进行最左派的时候,在“扩展”Expr之后,应该如何知道要使用哪种生产?

例如,如果我想解析1 + 2 - 3,我会从:

开始
Expr => Expr minus Expr

但这只会发生,因为这只是一个小例子,很容易看出(3)会迅速导致无处,(2)不适合下一步。这个例子会不会更复杂,我必须让事情基本上是反复试验。这是“正确的”方法还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

因为解析CFG本质上是非确定性的,所以没有通用的方法事先“知道”哪些可能的规则是正确的。基本上在最简单的层面上它确实是反复试验。就像分离布尔表达式if(a OR b OR c)一样,将逐个评估各个术语,直到成功为止,否则整个规则将失败。因此,您的解析器应该从规则(1)开始,尝试解析输入,如果失败,请从规则(2)开始重新启动,依此类推。