1

次のような式を取ることができるレクサーとパーサーを書きたい

(4+y)*8
4+5*x
(3)+(z*(4+w))*6

そして、加算よりも乗算の優先順位を考慮してそれらを解析します。特に、どうすれば回避できるのかわかりません

4+5*x

としてグループ化される

MULTIPLICATION(ADDITION(4,5),5) instead of ADDITION(4+MULTIPLICATION)

私のレクサーは次のようになります。

PLUS     : '+';
TIMES    : '*';
NUMBER   : [0-9]+'.'?[0-9]*;
VARIABLE : [(a-z)|(A-Z)]+;
OPENING  : '(';
CLOSING  : ')';
WHITESPACE : [ \t\r\n]+ -> skip ;
4

1 に答える 1

2

優先度の低い操作を優先度の高い操作よりも「ルート式」ルールに近づけて定義すると、正しいグループ化が自動的に行われます。

expr
:       e=multDivExpr
    (   PLUS e=multDivExpr
    |   MINUS e=multDivExpr
    )*
;

multDivExpr
:       e=atomExpr 
    (   TIMES e=atom
    |   DIV e=atom
    |   REM e=atom
    )*
; 

atom
:       NUMBER
    |   VARIABLE
    |   OPENING e=expr CLOSING
;

何が起こっているのかを理解する簡単な方法は、ANTLR によって生成された再帰的降下パーサーが非終端記号をmultDivExpr「加法的」非終端記号の「ビルディング ブロック」として使用することを考えることexprです。減算。

于 2013-10-06T18:49:52.783 に答える