0

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

  • https://github.com/antlr/antlr4/issues/464 – Lex Li May 28 '21 at 14:48
  • Antlr4 does not support AST construction. Otherwise, Antlr3 is similar to Antlr4. I do have a converter from Antlr 3 to 4, but I haven't updated it lately. I just finished the converter of Antlr 2 grammars to 4. The conversion rules explicitly codified, more or less, are here: https://github.com/kaby76/Domemtech.Trash/blob/main/doc/Import.md. – kaby76 May 28 '21 at 17:47

0 Answers0