我是ANTLR的新手,我正在尝试扩展这里提供的简单计算器的例子.具体来说,我尝试添加一些简单的函数,负数等,以熟悉自己的ANTLR.但是,我在尝试实现"隐式"乘法时遇到了一些问题(例如,3cos(2)sin(2)将被解释为3*cos(2)*sin(2)).
我在Stack Overflow上发现了一个同样问题的问题(这里).解决这个问题的一般形式看起来就像我自己找到的那样,所以我不确定我的问题在哪里.
我的语法如下.如果没有这| p2 = signExpr {$value *= $p2.value;}条线(最后一条线multiplicationExpr),根据我的测试,一切似乎都能正常工作.当我添加此行并运行它时antlr,我收到以下错误:
error(211): calculator.g:24:3: [fatal] rule multiplicationExpr has non-LL(*) decision due to recursive rule invocations reachable from alts 3,4. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
warning(200): calculator.g:24:3: Decision can match input such as "'-' FLOAT" using multiple alternatives: 3, 4
As a result, alternative(s) 4 were disabled for that input
Run Code Online (Sandbox Code Playgroud)
backtrack为我的一些(通常正常工作的)测试表达式启用错误计算结果.此外,警告谈论替代方案3和4 multiplicationExpr,但我只有三个替代方案,让我感到困惑.
有人能够指出我的语法中的错误,如下所示?
grammar calculator; …Run Code Online (Sandbox Code Playgroud)