使用 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 功能,完全没有涵盖。
我一直在使用 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 功能,完全没有涵盖。