我正在尝试使用ANTLR4(来自Java)解析C#代码。到目前为止,我找不到合适的语法,所以我决定自己写。我在这里用了这个附录,但遇到了一个问题。问题是我有很多左递归规则。我试图通过使用ANTLRWorks(ANTLRWorks-1.5)来修复它们,但我总是遇到异常。我可以手动修复其中一些,但不能修复像这样的:
multiplicative_expression:
| unary_expression
| multiplicative_expression '*' unary_expression
| multiplicative_expression '/' unary_expression
| multiplicative_expression '%' unary_expression;
有没有人能指导我为ANTLR4找到合适的语法,或者帮助我处理左递归问题。非常感谢。
ANTLR 4在内部处理直接左递归。你在上面发布的规则将在ANTLR 4中工作,不会有任何更改。
左递归规则的形式是A->Aa|b解决这个问题的形式方法是引入一个新的非终结符a',并将规则重写为
A->bA'
A'->Epsilon|aA'(其中Epsilon是"空字符串")
由于ANTLR是一个LL语法分析器生成器,它无法忍受左递归。然而,正确的递归规则可以用于ANTLR,因此我们可以将规则写成:
multiplicative_expression:
| unary_expression
| unary_expression '*' multiplicative_expression
| unary_expression '/' multiplicative_expression
| unary_expression '%' multiplicative_expression ;