2015-12-13 2 views
0

У меня есть небольшая 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 г:

enter image description here

Однако, сбросив вариант и просто собирание PACE отлично работает (он также отлично работает по-другому, выбирая NUMBER):

filterExpression returns [ActivityPredicate pred] 
     : NAME OPERATOR PACE { ... }; 

enter image description here

Почему это, когда я предоставляю вариант, они оба null?

+0

Я думаю, вам нужно правило '' 'Пропустить: [\ t \ n \ r] + -> пропустить;' '' пропускать пробелы. И правило PACE должно быть '' 'PACE: ('0' .. '9') ('0' .. '9')? ':' ('0' .. '5')? ('0' .. '9'); '' ' – saka1029

+0

Я случайно оставил правило' WS' из моего вопроса, добавил его. Я также исправил правило 'ПАСЕ', но я все еще сталкиваюсь с той же ошибкой. –

ответ

1

Попробуйте это.

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); 
     } 
    }; 
Смежные вопросы