问题描述
我想转换以下重写规则。因为我必须从 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 (将#修改为@)