2010-05-01 2 views
0

Этот пример ANTLR не анализирует ввод «1;» , Можете ли вы объяснить, почему? Он анализирует «11;».Этот пример antlr не работает должным образом

grammar TestGrammar; 

options { 
    output=AST; 
} 

expr:  mexpr (PLUS^ mexpr)* SEMI!; 
mexpr:  atom (STAR^ atom)*; 
atom:  INT; 

LPAREN:  '('; 
RPAREN:  ')'; 
STAR:  '*'; 
PLUS:  '+'; 
SEMI:  ';'; 

protected 
DIGIT:  '0'..'9'; 
INT:  (DIGIT)+; 

WS:   (' ' | '\t' | '\n' | '\r') { 
       $channel = HIDDEN; 
      }; 

ответ

1

Для цели Java, если вы измените: защищенный DIGIT : '0' .. '9' ;

к фрагмент СИМВОЛЬНЫЙ : '0' .. '9' ;

будет работать.

Надеюсь, это вам поможет.

+0

Подтверждено, изменение защищено от фрагментов. – Pindatjuh

+2

Я понял. Объяснение: Защищенное ключевое слово работает в более ранних версиях ANTLR. Он не работает в ANTLR 3. Теперь нужно использовать фрагмент instread protected. Защищенный, вероятно, игнорируется в ANTLR 3. Итак, что происходит? ANTLR интерпретирует INT и DIGIT как токен. Поскольку они очень похожи, синтаксический анализ терпит неудачу. Используя фрагмент, DIGIT больше не является токеном. Фрагмент говорит, что DIGIT является частью правила или другого токена. Затем пример начинает работать. – Aftershock

Смежные вопросы