如何创建匹配2 ^ 3的规则来创建幂运算符?

时间:2012-11-13 19:11:22

标签: antlr antlr3

鉴于我有以下语法,我如何添加规则以匹配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)* ;,但这也不起作用。

2 个答案:

答案 0 :(得分:2)

要使^的优先级高于negation,请执行以下操作:

pow      : term ('^' term)* ;

negation : '!' negation | pow ;

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

答案 1 :(得分:1)

如果你想在语法中考虑正确的关联性,你也可以使用递归:

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

   negation : '!'* pow;

   ...