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

如何修复Antlr3中的递归规则调用?,antlr,antlr3,xtext,Antlr,Antlr3,Xtext,我有下面的XText语法,它在引擎盖下使用ANTLR3。在我的语法中,我希望支持像TYPE(EXPRESSION)和(TYPE)(EXPRESSION)这样的强制转换表达式。类型定义通常包含其他类型(我认为这是问题所在,但我无法更改此要求)。除此之外,我还希望在表达式周围使用括号 通过左因子分解可以解决递归吗?我总是收到以下错误消息 [fatal]由于可从alts 1,2访问递归规则调用,规则ruleExpression具有非LL(*)决策。通过左因子分解或使用语法谓词或使用backtrack=

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

通过左因子分解可以解决递归吗?我总是收到以下错误消息

[fatal]由于可从alts 1,2访问递归规则调用,规则ruleExpression具有非LL(*)决策。通过左因子分解或使用语法谓词或使用backtrack=true选项进行解析


最简单但并非必然最好的方法是在整个castExpression中加入语法谓词(=>),如下所示:

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

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

最简单但并非必要的最佳方法是在整个castExpression上添加语法谓词(=>),如下所示:

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

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

@lucastzesniewski它是XText,它在hood@LucasTrzesniewski这是XText,它在后台使用ANTLR3,谢谢你的输入,但是有没有可能在没有语法谓词的情况下描述我的语法呢?我想要一个表达式语法,它具有类似类型(表达式)的“强制转换运算符”。关键问题是,我希望在表达式和类型之间使用括号(因为类型可能很复杂)。我想允许使用(type)(expr)或(type)((expr)+(expr))之类的表达式。谢谢您的输入,但是可以不使用语法谓词描述我的语法吗?我想要一个表达式语法,它具有类似类型(表达式)的“强制转换运算符”。关键问题是,我希望在表达式和类型之间使用括号(因为类型可能很复杂)。我想允许像(type)(expr)或(type)((expr)+(expr))这样的表达式。