Java ANTLR4 不匹配的输入 '<EOF>' 期望 KEY



我正在尝试定义一个简单的语法来解析表达式,例如

s=1,b=2

s=1,b=[1,2,3]

语法是(不是完整的(:

grammar KeyVal;
program : exprs EOF ;
exprs : expr (',' expr)* ;
expr  :  KEY '=' VALUE  ;         // match key=value
KEY : [a-zA-Z]+ ;             // match lower-case identifiers
VALUE : NUMBER | LIST ;
LIST : '[' NUMBER (',' NUMBER)* ']';

NUMBER   : INTEGER   ;
INTEGER    : DECIMAL_INTEGER    ;

DECIMAL_INTEGER   : NON_ZERO_DIGIT DIGIT* | '0'+
;
fragment NON_ZERO_DIGIT   : [1-9]    ;
/// digit          ::=  "0"..."9"
fragment DIGIT     : [0-9]    ;
WS : [ trn]+ -> skip ; // skip spaces, tabs, newlines

使用生成类的Java程序:

String s = " s=1,a=2";
KeyValLexer lexer = new KeyValLexer(CharStreams.fromString(s));
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
KeyValParser parser = new KeyValParser(commonTokenStream);
ProgramContext tree = parser.program();

提供错误

line 1:8 mismatched input '<EOF>' expecting KEY

如何避免此错误?

LIST应该是一个解析器规则。像这样的事情应该这样做:

grammar KeyVal;
program
: exprs EOF
;
exprs
: expr ( ',' expr )*
;
expr
:  KEY '=' value
;
value
: DECIMAL_INTEGER
| list
;
list
: '[' value ( ',' value )* ']'
;
KEY
: [a-zA-Z]+
;
DECIMAL_INTEGER
: [1-9] [0-9]*
| '0'+
;
WS
: [ trn]+ -> skip
;

最新更新