Java ANTLR4不匹配输入'<eof>',期望键

时间:2018-09-03 12:09:23

标签: java antlr4

我正在尝试定义一个简单的语法来解析像这样的表达式

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 : [ \t\r\n]+ -> 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

如何避免此错误?

1 个答案:

答案 0 :(得分:0)

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
 : [ \t\r\n]+ -> skip
 ;