使用 ANTLR4 的 Matlab 语法中的指数运算符无法正常工作

The exponential operator in Matlab grammar using ANTLR4 does not work correctly

我一直在使用 this 来源的 matlab 语法。我遇到以下输入错误

a = 2^2*3
b = 3*2^2

两种情况下的结果都应该是 12,但事实并非如此,因为使用 ANTLR4 的 Matlab 语法中的指数运算符无法正常工作,显示了以下树

问题可能出在乘法表达式上,但我没有找到解决问题的最佳方案。老实说,我对此没有任何解决方案。谁能告诉我如何解决这个问题?

multiplicative_expression
   : unary_expression
   | multiplicative_expression '*' unary_expression
   | multiplicative_expression '/' unary_expression
   | multiplicative_expression '\' unary_expression
   | multiplicative_expression '^' unary_expression
   | multiplicative_expression ARRAYMUL unary_expression
   | multiplicative_expression ARRAYDIV unary_expression
   | multiplicative_expression ARRAYRDIV unary_expression
   | multiplicative_expression ARRAYPOW unary_expression
   ;

我认为您需要将 multiplicative_expression 部分替换为以下内容:

multiplicative_expression
   : pow_expression
   | multiplicative_expression '*' pow_expression
   | multiplicative_expression '/' pow_expression
   | multiplicative_expression '\' pow_expression
   | multiplicative_expression ARRAYMUL pow_expression
   | multiplicative_expression ARRAYDIV pow_expression
   | multiplicative_expression ARRAYRDIV pow_expression
   ;

然后添加一个附加部分 pow_expression:

pow_expression
   : unary_expression
   | pow_expression '^' unary_expression
   | pow_expression ARRAYPOW unary_expression
   ;

这应该使求幂运算符的优先级高于乘法运算符。

但是,如果您尝试实际实现 MATLAB 的实际语法,您应该意识到 GitHub 上的语法并不能很好地反映它。 MATLAB 有进一步的求幂运算符(.^-.^+.^~^-^+^~),例如,还有整个类别语法,例如所有 object-oriented 功能,完全没有涵盖。