我正在学习递归体面解析,并提出了一些我认为算法不起作用的场景。其中之一是,考虑到这个简单的语法:
S→E;
E → 标识 | 身份证+身份证
那么这个字符串id + id;
在这个语法的语言中是有效的。但是,如果我们执行递归下降算法,它会从S
到E
然后到id
,这是第一个匹配的终端。现在输入在+
,我们又回到了S
尝试匹配;
然后失败的地方;但没有其他规则可供选择S
。
我认为语法没有歧义,因为语言中只有 2 个字符串id;
和id + id;
,每个字符串都有一个唯一的解析树。这里的一般问题是非终结符具有相同前缀的产生式,并且可能会做出在递归中更深层次匹配的选择,但会为更浅层次创建无效输入。
我已经阅读了诸如左递归之类的递归下降的典型问题,但在任何地方都没有发现上述问题。那么这真的是一个问题还是我错过了什么?
我从书中找到了一个权威的答案,Parsing Techniques: A Practical Guide p.182-188
它将上述方法归类为朴素递归体面,并强调了同样的问题。有两种解决方案始终适用于没有前瞻的一般情况(因为通常所需的前瞻长度随着前缀长度的增加而增加):需要使用延续的穷举递归下降和广度优先递归下降。