1

次の文法がある場合、演算子2^3を作成するようなものに一致するルールを追加するにはどうすればよいですか?power

negation : '!'* term ;

unary : ('+'!|'-'^)* negation ;

mult : unary (('*' | '/' | ('%'|'mod') ) unary)* ;

add : mult (('+' | '-') mult)* ;

relation : add (('=' | '!=' | '<' | '<=' | '>=' | '>') add)* ;

expression : relation (('&&' | '||') relation)* ;

// LEXER ================================================================

HEX_NUMBER : '0x' HEX_DIGIT+;

fragment 
FLOAT: ;

INTEGER : DIGIT+ ({input.LA(1)=='.' && input.LA(2)>='0' && input.LA(2)<='9'}?=> '.' DIGIT+ {$type=FLOAT;})? ;

fragment
HEX_DIGIT : (DIGIT|'a'..'f'|'A'..'F') ;

fragment
DIGIT : ('0'..'9') ;

私が試したこと:

のようなものを試しましpower : ('+' | '-') unary'^' unaryたが、うまくいかないようです。

私も試しmult : unary (('*' | '/' | ('%'|'mod') | '^' ) unary)* ;ましたが、それもうまくいきません。

4

2 に答える 2

2

^よりも優先順位を高くするにはnegation、次のようにします。

pow      : term ('^' term)* ;

negation : '!' negation | pow ;

unary    : ('+'! | '-'^)* negation ;
于 2012-11-13T19:19:04.960 に答える
1

すでに文法に含まれている右結合性を考慮したい場合は、再帰を使用することもできます。

   pow  :   term ('^'^ pow)?
        ;

   negation : '!'* pow;

   ...
于 2012-11-14T09:55:18.050 に答える