我如何将 Antlr3 转换为 Antlr4?

问题描述

我想转换以下重写规则。因为我必须从 antlr3 移动到 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
; 

我在 antlr4 中尝试过,但错误很多:

语法错误:'^' 出乎我的意料

语法错误:'->' 在寻找规则元素时让我大吃一惊

语法错误:'$' 在寻找规则元素时让我大吃一惊

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)