我的 ANTLR 语法如下所示。
grammar ProgCalc;
options {
language = Java;
ASTLabelType=CommonTree;
output=AST;
backtrack=true;
}
/* Parser rules */
eval
: exp=add;
add
: term ( PLUS^ term | MINUS^ term ) *;
term
: factor ( MULT^ factor | MOD^ factor )*;
factor
: number
| VARIABLE
| '('! add^ ')'!
;
number
: DEC | HEX | OCT;
/* Lexer Rules*/
VARIABLE: ('a'..'z' |'A'..'Z')('a'..'z'|'A'..'Z' | '0'..'9'|'_')* ;
DEC : ('1'..'9')('0'..'9')+;
HEX : '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+;
OCT : '0' ('0'..'7')*;
PLUS : '+';
MINUS : '-';
MULT : '*';
MOD : '%';
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; };
编译成功。 但当我用表达式解析时(例如 5%3*5),我收到错误。
line 1:1 required (...)+ loop did not match anything at character '%' line 1:3 required (...)+ loop did not match anything at character '*' line 1:5 required (...)+ loop did not match anything at character '<EOF>' line 1:5 no viable alternative at input '<EOF>'
有人可以检查我的语法并纠正它吗? 非常感谢。
最佳答案
由于 +
运算符,您的 DEC
词法分析器规则需要至少 2 位数字。我相信你的意思是写:
DEC : ('1'..'9') ('0'..'9')*;
关于java - ANTLR:循环与字符 '%' 处的任何内容都不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20246781/