为什么递归正常的解析器无法解析aaaaaa EX(4.4.5)Ullman ravisethi

时间:2017-09-22 11:54:38

标签: parsing recursion recursive-descent recursive-backtracking

语法S - > a S a | a a生成所有偶数长度的字符串。我们可以设计一个带有回溯的递归下降解析器 语法。 如果我们选择按生产S扩展 - > aa,然后我们将 只识别字符串aa。 因此,任何合理的递归下降解析器都会 尝试S - > aSa首先。

显示此递归下降解析器识别输入aa,aaaa和 aaaaaaa,但不是aaaaaa。

2 个答案:

答案 0 :(得分:0)

解析器将首先尝试调用match(a);S();match(a);,而不是问题中所述的match(a);match(a);。请注意,当您尝试递归调用块S()内的match(a);S();match(a);时,您仅调用了match(a)一次,最后的'a'符号不会被使用。

答案 1 :(得分:0)

我将用this other answer来诠释自己。

实际上,这是具有回溯功能的递归下降解析器的幼稚实现中通常使用的“单匹配策略”的属性。

Adrian Johnstone博士引用this answer

这里的技巧是认识到许多回溯解析器使用我们所谓的单例匹配策略,在该策略中,规则的parse函数一旦找到匹配项,它就会返回。通常,解析函数需要返回一组假定的匹配项。只需尝试一下,您就会发现singelton匹配分析器会遗漏一些可能的派生词。

此外,this answer中提供的图像将帮助您直观地了解所例举的情况。