我有一个错误(如标题中所述)有一条规则,我不知道如何解决。
我写了以下规则:
FunctionArguments returns FunctionArgs::IFunctionArguments :
FunctionArgumentsNormal
| FunctionArgumentsForIter
;
FunctionArgumentsNormal returns FunctionArgs::IFunctionArguments :
{FunctionArgs::FunctionArguments} args+=Expression (',' args+=Expression)*
| {FunctionArgs::FunctionArguments} argNames+=NamedArguments (',' argNames+=NamedArguments)*
;
FunctionArgumentsForIter returns FunctionArgs::IFunctionArguments :
{FunctionArgs::FunctionArgumentsIterator} exp=Expression 'for' iterators=ForIterator
;
你能帮我解决一下这个表达式吗或者给别人解决方案吗?
答案 0 :(得分:0)
在LL语法中,您可以没有左递归。问题是LL解析器可以选择这样的派生: FunctionArguments - > FunctionArgumentsNormal - > FunctionArguments - > FunctionArgumentsNormal ... 你的语法包含所谓的间接左递归。您可以在此维基百科文章中找到一个示例,其中还包含有关如何解决此问题的解决方案:Left-Recursion。 一个好的起点是(我想你已经这样做了)以一种非常简单的方式编写你的语法,而你的例子中没有包含所有的注释和内容。如果您在简单表格上有语法:
S -> A | B
B -> "terminal1" B
| b
A -> a "terminal2"
进行必要的重写要容易得多。