我是ANTLR的新手,我正尝试使用ANTLR4和C#为计算器应用程序生成一个相对简单的解析器。这是我的语法文件。

parser grammar CalculatorExpressionParser;

options{
language = CSharp2;
}

expr:  FUNC expr? (COMMA expr)* RIGHTPAREN               #CallFunction
    |  LEFTPAREN expr RIGHTPAREN                         #Parens
    |  expr POW<assoc=right> expr                        #Pow
    |  expr op=(MULTIPLY | DIVIDE)? expr                 #MultDivide
    |  expr op=(ADD | SUBTRACT) expr                     #AddSubtract
    |  SUBTRACT expr                                     #Negative
    |  NUMBER                                            #Number
    ;


我编写了一个自定义词法分析器来生成标记,以便在解析之前支持隐式乘法和将变量转换为其数值等效项。

但是输入后,我得到以下结果。

2+6/3 => 4 (correct)
6/3+2 => 1.2 (should be 4)
6/(3+2) => 4 (also correct)

1+2*3 => 7 (correct)
2*3+1 => 8 (should be 7 too)
(2*3)+1 => 7 (correct)


请注意,我尝试关闭错误恢复功能并将其设置为报告所有歧义错误,但似乎没有发现任何错误。

无论如何,如果我通过删除?将语法更改为以下内容?在除法/乘法运算符之后,它似乎工作得很好,除了不再支持隐式乘法。

parser grammar CalculatorExpressionParser;

options{
language = CSharp2;
}

expr:  FUNC expr? (COMMA expr)* RIGHTPAREN               #CallFunction
    |  LEFTPAREN expr RIGHTPAREN                         #Parens
    |  expr POW<assoc=right> expr                        #Pow
    |  expr op=(MULTIPLY | DIVIDE) expr                  #MultDivide
    |  expr op=(ADD | SUBTRACT) expr                     #AddSubtract
    |  SUBTRACT expr                                     #Negative
    |  NUMBER                                            #Number
    ;


我想知道为什么放?破坏匹配顺序?有没有简单的方法可以解决此问题?

最佳答案

尽管ANTLR 4.2可以处理此问题,但“ expr expr”不适合运算符的模式。 Sam仍在更新C#目标。

关于c# - 无法使Antlr4解析器遵循隐式乘法的运算顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21741045/

10-17 02:08