0

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

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

那么有没有人可以指导我使用正确的 ANTLR4 语法或帮助我处理左递归问题。谢谢你。

4

2 回答 2

1

ANTLR 4 在内部处理直接左递归。您在上面发布的规则将在 ANTLR 4 中有效,无需更改。

于 2013-08-25T15:28:27.317 回答
0

左递归规则的形式为 A -> Aa | b 解决这个问题的形式方法是引入一个新的非终结符 A' 并将规则重写为

A -> bA'

A' -> 厄普西隆 | aA' (其中 Epsilon 是“空字符串”)

由于 ANTLR 是一个 LL 解析器生成器,它不能忍受左递归。但是,严格递归规则在 ANTLR 中是可以的,因此我们可以将规则编写为:

multiplicative_expression:
| unary_expression
| unary_expression '*' multiplicative_expression 
| unary_expression '/' multiplicative_expression  
| unary_expression '%' multiplicative_expression  ;
于 2013-08-25T13:17:11.837 回答