为什么语法可以生成一个字符串,但不能被相同的递归下降解析器识别?

时间:2015-09-25 05:39:18

标签: parsing compiler-construction recursive-descent

例如,我们有一个语法S-> aSa | aa,显然,这个语法可以生成所有偶数长度的字符串。如果我们为这个语法设计一个递归下降的解析器,为什么可以识别像“aa”,“aaaa”,“aaaaaaaa”这样的输入,但是“aaaaaa”无法识别?

以下是我的想法:

对于“aa”,尝试S-> aSa,'a'匹配,但'S'不匹配,回溯。           尝试S-> aa,匹配。

对于“aaaa”,尝试S-> aSa,'a'匹配,尝试S-> aSa,我们有aaSaa,S不匹配,尝试S-> aa,我们有aaaa,匹配。

对于“aaaaaa”,尝试S-> aSa,'a'匹配,尝试S-> aSa,我们有aaSaa,尝试S-> aSa,我们有aaaSaaa,不匹配,尝试S-> aa,我们有“aaaaaa”。

我不知道'aaaaaa'部分是什么。

为什么无法识别aaaaaa?

1 个答案:

答案 0 :(得分:2)

因为在简单的递归下降解析器中不允许回溯。

递归下降解析器从左到右读取令牌,读取每个令牌一次。

当然你可以通过回溯递归下降解析器来识别它;但是解析器不再是线性时间。