我正在尝试定义一个简单的语法来解析像这样的表达式
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
如何避免此错误?
答案 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
;