Antlr 解析器规则无法匹配任何指定的词法分析器规则
Antlr parser rule fails to match either of specified lexer rules
我有一个正在进行中的小 Antlr 语法,看起来像:
filterExpression returns [ActivityPredicate pred]
: NAME OPERATOR (PACE | NUMBER) {
if ($PACE != null) {
$pred = new SingleActivityPredicate($NAME.text, Operator.fromCharacter($OPERATOR.text), $PACE.text);
} else {
$pred = new SingleActivityPredicate($NAME.text, Operator.fromCharacter($OPERATOR.text), $NUMBER.text);
}
};
OPERATOR: ('>' | '<' | '=') ;
NAME: ('A'..'Z' | 'a'..'z')+ ;
NUMBER: ('0'..'9')+ ('.' ('0'..'9')+)? ;
PACE: ('0'..'9')('0'..'9')? ':' ('0'..'5')('0'..'9');
WS: (' ' | '\t' | '\r'| '\n')+ -> skip;
希望解析如下内容:
distance = 4
或 pace < 8:30
但是,对于 、PACE
和 NUMBER
,这两个输入都会导致 null
,同时尝试解析:
但是,放弃该选项并选择 PACE
效果很好(它也可以通过其他方式正常工作,选择 NUMBER
):
filterExpression returns [ActivityPredicate pred]
: NAME OPERATOR PACE { ... };
为什么当我提供选项时,它们都是 null
?
试试这个。
filterExpression returns [ActivityPredicate pred]
: n=NAME o=OPERATOR (p=PACE | i=NUMBER) {
if ($PACE != null) {
$pred = new SingleActivityPredicate(
$n.text, Operator.fromCharacter($o.text), $p.text);
} else {
$pred = new SingleActivityPredicate(
$n.text, Operator.fromCharacter($o.text), $i.text);
}
};
我有一个正在进行中的小 Antlr 语法,看起来像:
filterExpression returns [ActivityPredicate pred]
: NAME OPERATOR (PACE | NUMBER) {
if ($PACE != null) {
$pred = new SingleActivityPredicate($NAME.text, Operator.fromCharacter($OPERATOR.text), $PACE.text);
} else {
$pred = new SingleActivityPredicate($NAME.text, Operator.fromCharacter($OPERATOR.text), $NUMBER.text);
}
};
OPERATOR: ('>' | '<' | '=') ;
NAME: ('A'..'Z' | 'a'..'z')+ ;
NUMBER: ('0'..'9')+ ('.' ('0'..'9')+)? ;
PACE: ('0'..'9')('0'..'9')? ':' ('0'..'5')('0'..'9');
WS: (' ' | '\t' | '\r'| '\n')+ -> skip;
希望解析如下内容:
distance = 4
或 pace < 8:30
但是,对于 、PACE
和 NUMBER
,这两个输入都会导致 null
,同时尝试解析:
但是,放弃该选项并选择 PACE
效果很好(它也可以通过其他方式正常工作,选择 NUMBER
):
filterExpression returns [ActivityPredicate pred]
: NAME OPERATOR PACE { ... };
为什么当我提供选项时,它们都是 null
?
试试这个。
filterExpression returns [ActivityPredicate pred]
: n=NAME o=OPERATOR (p=PACE | i=NUMBER) {
if ($PACE != null) {
$pred = new SingleActivityPredicate(
$n.text, Operator.fromCharacter($o.text), $p.text);
} else {
$pred = new SingleActivityPredicate(
$n.text, Operator.fromCharacter($o.text), $i.text);
}
};