Правила ANTLR принимать то, что ранее не соответствовало - PullRequest
0 голосов
/ 28 октября 2011

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

Я пытаюсь переписать файлы c ++ src с помощью ANTLR.Моя грамматика должна понимать только подмножество C ++ и игнорировать остальное.Игнорируя все остальное, я имею в виду, что я все равно должен вывести строку ввода как есть.Я не могу просто отбросить ввод.Например, мне может понадобиться найти #if, #ifdef, #ifndef, #else, #elif, #endif, но отправить любой другой действительный синтаксис C ++ обратно на выход как есть.Решение выглядит так:

inputLines :  ( preprocessorLineSet  |  oneNormalInputLine ) ;
preprocessorLineSet  : ....;// pattern to match #if #else etc
oneNormalInputLine : (any_token_except_crlf)* CRLF {System.out.println($text)}; 
// a catch-all rule for anything including #if #else #endif, it must send any unrecognised input back to the ouput

Я предполагаю, что парсер попытается использовать альтернативы в порядке, указанном в грамматике.Таким образом, мое правило preprocessorLineSet указано перед oneNormalInputLine в правиле inputLines .Но, похоже, ANTLR по-прежнему предпочитает oneNormalInputLine , даже если вход имеет шаблон #if, который, как я полагаю, должен соответствовать предыдущему правилу.

Правильно ли мое предположение?Это правильный способ реализовать такую ​​логику игнорирования остальных?

1 Ответ

1 голос
/ 28 октября 2011

JavaMan писал:

Я предполагаю, что парсер попробует альтернативы в порядке, указанном в грамматике.Таким образом, мое правило preprocessorLineSet указано перед oneNormalInputLine в правиле inputLines.

Правильно, правила пробуются слева направо (preprocessorLineSet до oneNormalInputLine).

JavaMan писал:

Но, похоже, ANTLR по-прежнему предпочитает oneNormalInputLine, даже если вход имеет шаблон #if, который, как я предполагаю, должен совпадать с предыдущимrule.

Разве вам не нужно исключать такие вещи, как #if и #elif из any_token_except_crlf?Не могли бы вы опубликовать рабочий пример, включающий класс драйвера, который показывает неожиданное поведение?

...