我想匹配以下输入:
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”
有人知道如何解决这个问题吗?
谢谢 查尔斯
我认为你的语法是上下文敏感的,即使在词法分析器(Tokenizer)级别也是如此。字符串“1m”被识别为IDENT,而不是后面跟着“m”的INTEGER。您可以重新定义语法,或者使用谓词解析,或者在语法中嵌入Java代码来检测上下文(例如,如果数字在“span”后面跟着“=”,则将其解析为INTEGER)。