我正在尝试使用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的正确语法或帮助我处理左递归问题。谢谢。
答案 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 ;