2009-07-18 10 views
2

У меня есть следующая Antlr грамматика:Antlr скрытого канал проблема пробельных

grammar MyGrammar; 

doc : intro planet; 
intro : 'hi'; 
planet : 'world'; 
MLCOMMENT 
    : '/*' (options {greedy=false;} : .)* '*/' { $channel = HIDDEN; }; 
WHITESPACE : ( 
    (' ' | '\t' | '\f')+ 
    | 
    // handle newlines 
    ('\r\n' // DOS/Windows 
     | '\r' // Macintosh 
     | '\n' // Unix 
    ) 
    ) 
{ $channel = HIDDEN; }; 

В ANTLRWorks 1.2.3 интерпретатором, входы hi world, hi/**/world и hi /*A*/ world работа, как и ожидалась.

Однако вход hiworld, который не должен работы, также принимается. Как сделать hiworld сбой? Как заставить хотя бы одно пробел (или комментарий) между «привет» и «миром»?

Обратите внимание, что я использовал только MLCOMMENT и WHITESPACE в этом примере, чтобы упростить, но будут поддерживаться другие виды комментариев.

+0

Ну, я не знаю Antlr, но не будет «doc: intro WHITESPACE planet» или что-то вроде этого будет наиболее очевидным? – schnaader

+0

Поскольку канал WHITESPACE скрыт, это вызывает MismatchedTokenException. – luiscubal

+0

Значит, вы не можете создать другую простую грамматику, которая не скрыта и не использует ее? – schnaader

ответ

6

Вы должны создать общий маркер ID. Поскольку lexer строит самый длинный токен, он может видеть входной сигнал «hiworld» как одно слово, поскольку он длиннее, чем «привет» или «мир» сам по себе. Такое правило может выглядеть следующим образом:

ID : ('a'..'z' | 'A'..'Z')+; 

В качестве примера, это точно, как парсеры для языков программирования отделить «делать» ключевое слово из «двойного» (ключевого слова типа, начинается с «делать») или «Done» (имя переменной).

+0

Этот ответ просто сделал так много вещей, щелкнув в моей голове. благодаря –

0

Один из способов сделать строку hiworld потерпеть неудачу, чтобы использовать проверяющий семантический предикат, который гарантированно не получится, следующим образом:

doc:  intro planet; 
failure : 'hiworld' { false }?; 
intro : 'hi'; 
planet : 'world'; 
// rest of grammar omitted 
+0

Очень интересно, но если бы я добавил каждый возможный случай отказа к более сложным грамматикам, число ситуаций сбоев увеличилось бы экспоненциально. – luiscubal