例如,我们有一个语法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?
答案 0 :(得分:2)
因为在简单的递归下降解析器中不允许回溯。
递归下降解析器从左到右读取令牌,读取每个令牌一次。
当然你可以通过回溯递归下降解析器来识别它;但是解析器不再是线性时间。