ANTLR4 C#语法和左递归

本文关键字:递归 语法 ANTLR4 | 更新日期: 2023-09-27 18:28:53

我正在尝试使用ANTLR4(来自Java)解析C#代码。到目前为止,我找不到合适的语法,所以我决定自己写。我在这里用了这个附录,但遇到了一个问题。问题是我有很多左递归规则。我试图通过使用ANTLRWorks(ANTLRWorks-1.5)来修复它们,但我总是遇到异常。我可以手动修复其中一些,但不能修复像这样的:

multiplicative_expression:
| unary_expression
| multiplicative_expression '*' unary_expression
| multiplicative_expression '/' unary_expression
| multiplicative_expression '%' unary_expression;

有没有人能指导我为ANTLR4找到合适的语法,或者帮助我处理左递归问题。非常感谢。

ANTLR4 C#语法和左递归

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  ;