Python Antlr4括号

2024-09-21 00:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写语法,但我不能解决括号问题和操作优先级。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
              ;

Tags: numberfeedline语法spaceoperationpowerdivide
2条回答

非常感谢你的回答。我做了类似的事情,但并不是每个选项都适用:

number        : Int | Hex | Oct
              ;
operation     : ( ('(') ( number ) (op=(Add|Subtract|Multiply|Divide|Power|Max|Min)) ( number ) (')') )
              | number
              ;
muldiv        : ( ( operation ) (op=(Multiply|Divide)) ( operation ) )
              |operation
              ;
addsub        : ( ( muldiv ) (op=(Add|Subtract)) ( muldiv ) )
              | muldiv
              ;
expression    : ( (addsub) (op=(Add|Subtract|Multiply|Divide|Power|Max|Min) (addsub)) )
              | addsub
              | number
              ;

您的语法在这里缺少两件事:优先规则和递归子表达式(即括号)。典型的表达式语法通过将表达式分解为一系列术语&;因子来实现这一点,如下所示:

expression    : term ( ( Add | Subtract )  term )* ;
term          : factor ( ( Multiply | Divide ) factor )* ;
factor        : number | '(' expression ')' ;

有很多关于这背后的理论和实践的教程和书籍,所以我不会在这里重复这个细节(试试this onethis one)。你知道吗

I need grammar to deal with (1 + 3) * 3 = 12 problem and 1 + 3 * 3 = 12

这里您的意思是应该比具有更高的优先级(因此不是典型的BODMAS优先级规则),您确定这是您想要的吗?如果是这样的话,我希望你能看到如何在你的语法中重做上述内容,给你想要的优先权。你知道吗

相关问题 更多 >

    热门问题