У меня есть небольшая Antlr грамматика работы в прогрессе, который выглядит как: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
Однако оба этих входов приводит к null
для какPACE
и NUMBER
, пытаясь разобрать eithe г:
Однако, сбросив вариант и просто собирание PACE
отлично работает (он также отлично работает по-другому, выбирая NUMBER
):
filterExpression returns [ActivityPredicate pred]
: NAME OPERATOR PACE { ... };
Почему это, когда я предоставляю вариант, они оба null
?
Я думаю, вам нужно правило '' 'Пропустить: [\ t \ n \ r] + -> пропустить;' '' пропускать пробелы. И правило PACE должно быть '' 'PACE: ('0' .. '9') ('0' .. '9')? ':' ('0' .. '5')? ('0' .. '9'); '' ' – saka1029
Я случайно оставил правило' WS' из моего вопроса, добавил его. Я также исправил правило 'ПАСЕ', но я все еще сталкиваюсь с той же ошибкой. –