0

我想匹配以下输入:

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'

有谁知道如何解决这个问题?

谢谢查尔斯

4

1 回答 1

0

我认为您的语法是上下文敏感的,即使在词法分析器(Tokenizer)级别也是如此。字符串“1m”被识别为 IDENT,而不是 INTEGER 后跟“m”。您可以重新定义您的语法,或者使用谓词解析,或者在您的语法中嵌入 Java 代码来检测上下文(例如,如果数字出现在“span”后跟“=”之后,则将其解析为 INTEGER)。

于 2013-04-17T01:46:13.753 回答