Как создать правило синтаксического анализатора, которое принимает то, что не принимаются предыдущими правилами?
Я пытаюсь переписать файлы 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, который, как я полагаю, должен соответствовать предыдущему правилу.
Правильно ли мое предположение?Это правильный способ реализовать такую логику игнорирования остальных?