ANTLR4 C#语法和左递归

时间:2013-08-25 12:45:27

标签: c# java antlr4

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

左递归规则的形式为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  ;