我想匹配以下输入:
statement span=1m 0_dur=12
具有以下语法:
options {
language = Java;
output=AST;
ASTLabelType=CommonTree;
}
statement :'statement' 'span' '=' INTEGER 'm' ident '=' INTEGER;
INTEGER
: DIGIT+
;
ident : IDENT | 'AVG' | 'COUNT';
IDENT
: (LETTER | DIGIT | '_')+ ;
WHITESPACE
: ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
fragment
LETTER : ('a'..'z' | 'A'..'Z') ;
fragment
DIGIT : '0'..'9';
但它会导致错误:
MismatchedTokenException:第1:15行不匹配的输入'1m'期待'\ u0004'
有没有人知道如何解决这个问题?
感谢 查尔斯
答案 0 :(得分:0)
我认为你的语法是上下文敏感的,即使在词法分析器(Tokenizer)级别也是如此。字符串“1m”被识别为IDENT,而不是INTEGER,后跟'm'。您可以重新定义语法,或使用谓词解析,或在语法中嵌入Java代码以检测上下文(例如,如果数字在“span”之后显示,后跟“=”,则将其解析为INTEGER)。