我正在写语法,但我不能解决括号问题和操作优先级。1+3等于4,但我需要语法来处理 (1+3)*3=12问题和 1 + 3 * 3 = 12. 我的语法只有奇数,但没关系。你知道吗
这是我的语法代码:
grammar PolishNotation;
fragment SINGLE_SPACE : '\u0020'; // ' '
fragment TABULATION : '\u0009'; // '\t'
fragment LINE_FEED : '\u000A'; // '\n'
fragment CARRAIGE_RETURN: '\u000D'; // '\r'
fragment DECEVEN : '0' | '2' | '4' | '6' | '8';
fragment DECODD : '1' | '3' | '5' | '7' | '9';
fragment HEXEVEN : '0' | '2' | '4' | '6' | '8' | 'A' | 'C' | 'E';
fragment HEXODD : '1' | '3' | '5' | '7' | '9' | 'B' | 'D' | 'F';
fragment OCTEVEN : '0' | '2' | '4' | '6';
fragment OCTODD : '1' | '3' | '5' | '7';
Add : '+';
Subtract : '-';
Multiply : '*';
Divide : '/';
Colon : ':' -> type(Divide);
Power : '^';
DoubleMultiply: '**' -> type(Power);
Max : 'max';
Min : 'min';
Int : (DECODD)
| ([1-9]+ (DECODD | DECEVEN)* (DECODD))
;
Hex : ('0x' (HEXODD))
| ('0x' [1-F]+ (HEXODD | HEXEVEN)* (HEXODD))
;
Oct : ('0o' (OCTODD))
| ('0o' [1-7]+ (OCTODD | OCTEVEN)* (OCTODD))
;
WhiteSpace : ( SINGLE_SPACE | TABULATION )+ -> skip;
NewLine : ( CARRAIGE_RETURN | LINE_FEED )+ -> skip;
number : Int | Hex | Oct
;
operation : ( number )
op=( Add
| Subtract
| Multiply
| Divide
| Power
| Max
| Min )
( number | operation )
| '(' operation ')'
;
expression : operation
| number
;
非常感谢你的回答。我做了类似的事情,但并不是每个选项都适用:
您的语法在这里缺少两件事:优先规则和递归子表达式(即括号)。典型的表达式语法通过将表达式分解为一系列术语&;因子来实现这一点,如下所示:
有很多关于这背后的理论和实践的教程和书籍,所以我不会在这里重复这个细节(试试this one或this one)。你知道吗
这里您的意思是加应该比乘具有更高的优先级(因此不是典型的BODMAS优先级规则),您确定这是您想要的吗?如果是这样的话,我希望你能看到如何在你的语法中重做上述内容,给你想要的优先权。你知道吗
相关问题 更多 >
编程相关推荐