I want to convert below rewrite rule. cause I have to move from antlr3 to antlr4.
grammar Calc;
options
{
language=C;
output=AST;
}
tokens {
METHOD_CALL;
EXPR_GROUP;
ARGS;
UNARY_MINUS;
UNARY_PLUS;
}
IDENTIFIER
: LETTER (LETTER|'0'..'9')*
;
fragment
LETTER : 'A'..'Z'
| 'a'..'z'
| '_'
;
COMMA : ',' ;
LPAREN : '(' ;
RPAREN : ')' ;
EQUAL : '==';
NOTEQUAL : '!=';
LESSTHANOREQUALTO
: '<=';
GREATERTHANOREQUALTO
: '>=';
LESSTHAN : '<' ;
GREATERTHAN : '>' ;
DIVIDE : '/' ;
PLUS : '+' ;
MINUS : '-' ;
MULTI : '*' ;
MOD : '%' ;
AND : '&&';
NOT : '!';
OR : '||';
DECIMAL
: ('0' | '1'..'9' '0'..'9'*)
;
STRING
: '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
ITEM_ESCAPE
:'{exist}' ;
WS : ( ' ' | '\t' | '\r' | '\n' )+ { $channel = HIDDEN; } ;
prog
: (expression)+
;
expression
: logicalOrExpression
;
logicalOrExpression
: logicalAndExpression (OR^ logicalAndExpression)*
;
logicalAndExpression
: equalityExpression (AND^ equalityExpression)*
;
equalityExpression
: relationalExpression ((NOTEQUAL^ | EQUAL^) relationalExpression)*
;
relationalExpression
: additiveExpression
( ( LESSTHAN^
| GREATERTHAN^
| LESSTHANOREQUALTO^
| GREATERTHANOREQUALTO^
)
additiveExpression
)*
;
additiveExpression
: multiplicativeExpression ((PLUS^ | MINUS^) multiplicativeExpression)*
;
multiplicativeExpression
: nonExpression ((MULTI^ | DIVIDE^ | MOD^ ) nonExpression)*
;
nonExpression
: NOT^ primaryExpression
| MINUS primaryExpression -> ^(UNARY_MINUS primaryExpression)
| PLUS primaryExpression -> ^(UNARY_PLUS primaryExpression)
| primaryExpression
;
primaryExpression
: (IDENTIFIER LPAREN) => functionCall //function,such as (max,min)
| IDENTIFIER
| constant
| LPAREN expression RPAREN -> ^(EXPR_GROUP expression) // (p1+p2*p3...)
;
functionCall
: id=IDENTIFIER LPAREN argList? RPAREN -> ^(METHOD_CALL $id argList?)
;
argList
: expression (COMMA expression)* -> ^(ARGS expression+)
;
constant
: DECIMAL
| STRING
;
i tried it in antlr4, but so many errors:
syntax error: '^' came as a complete surprise to me
syntax error: '->' came as a complete surprise to me while looking for rule element
syntax error: '$' came as a complete surprise to me while looking for rule element