2016-04-14 4 views
0

У меня есть требование, где я написал лексический маркер, как:Есть ли токен по умолчанию, доступный в ANTLR, если он не соответствует ни одному из уже определенных токенов?

IF_LEXER_TOKEN: ('I')('F') (.)* ('E')('N')('D')_('I')('F') 
ANY :(options {greedy=true;}: .)* ; 

Но если вход в виде:

IF a>b then a=b END_IF 
IF c>d then c=d 

В этом случае ожидаемое поведение является то, что он должен использовать маркер IF_LEXER_TOKEN для первой строки и ЛЮБОЙ токен для второй строки, но вместо этого он рассматривает ЛЮБОЙ токен для обеих строк. Просьба помочь. Примечание: из-за некоторых ограничений я не могу создать правило анализатора для сценария выше.

+0

Почему вы помещаете все свои однотонные жетоны в собственную пару круглых скобок? Выглядит странно. –

ответ

1

Нет, такой токен по умолчанию отсутствует. Но вы можете легко создать его:

ANY: .*?; 

Лучше всего, чтобы это не жадный, чтобы соответствующие другие маркеры после этого входа. Btw: определение полной последовательности в лексере имеет несколько недостатков, например. отчет об ошибках не может дать вам веской причины, если правило lexer выходит из строя. Вы должны явно обрабатывать все пробелы. И вы отказываетесь от таких принципов, как обычно, неважно, сколько пробелов (включая разрывы строк) существует между токенами.

+0

Спасибо за ответ. Я попытался создать вышеупомянутый токен, но его бросание исключения SystemOutOfRange: не может оглянуться назад более чем на один токен. – shruti

+0

Это правило catch должно быть последним правилом lexer. Попробуйте также жадный подход, если это имеет значение. –

+0

Правило ЛЮБОЕ:. * ?; Синтаксическая ошибка: NoViableAltException. Его последнее правило лексера, как вы упомянули. – shruti