如何修复Antlr3中的递归规则调用?

时间:2016-03-31 22:19:59

标签: antlr antlr3 xtext

我有以下XText语法,它使用了ANTLR3。在我的语法中,我想支持像TYPE(EXPRESSION)(TYPE)(EXPRESSION)这样的强制转换表达式。类型定义通常包含其他类型(我认为这是问题,但我无法更改此要求)。除此之外,我还想允许表达式括号。

是否有可能通过左因子解决递归?我总是收到以下错误消息。

  

[致命]规则ruleExpression具有非LL(*)决策,因为递归规则调用可从alts 1,2到达。通过左因子分解或使用句法谓词或使用backtrack = true选项来解析。

Model:
    e=Expression;

Expression:
    e=castExpression | e=parExpression | "VAR";

castExpression:
    (Type | '(' Type ')') e=parExpression;

parExpression:
    '(' Expression ')';

Type:
    "MYTYPE" t=Type | "TYPE_ID";

1 个答案:

答案 0 :(得分:0)

最简单但不是必须使其成功的最佳方法是在整个castExpression中输入一个语法谓词(=>),如下所示:

Expression:
   =>e=castExpression | e=parExpression | "VAR";

但似乎这是一个非常简化的实际语法摘录,所以我不能说它是否是完整语境中的可行解决方案。另请注意,进行如此长的前瞻可能会对工具方面和性能产生不良影响。在添加更多语法谓词之前,您应该确保理解语法谓词的含义。