Как заставить синтаксический анализатор типа YACC останавливаться на кратчайшем совпадающем вводе?

Вот контекст: у меня есть файл (или поток), и я хочу обработать его заголовок, остановить, а затем по-другому обработать остальные данные. То есть, предположим, у меня есть поток вроде BEGIN GOOD GOOD GOOD GOOD GOOD DONE JUNK JUNK JUNK JUNK .... Первая часть (BEGIN GOOD+ DONE) соответствует моей грамматике, и я хочу остановиться, как только увижу DONE.

Насколько я знаю, YACC и друзья хотят продолжать потреблять токены до тех пор, пока они не закончатся, поэтому мне нужно написать больше грамматики, чтобы соответствовать всем JUNK. Есть ли способ обойти это?

Я использую PLY (реализация Lex и Yacc для Python), но здесь я открыт для общих ответов.


person Eric Anderson    schedule 17.11.2011    source источник
comment
Кстати, в итоге я решил сделать это с PLY (или YACC) и выбрал ANTLR, где такое поведение, похоже, используется по умолчанию. Что не обязательно лучше, но соответствует всем требованиям.   -  person Eric Anderson    schedule 21.11.2011


Ответы (1)


В обычном yacc вы можете использовать макрос yacc YYACCEPT в действии, чтобы немедленно вернуть успешный синтаксический анализ без чтения каких-либо токенов. Однако я не знаю, поддерживает ли PLY это.

person Chris Dodd    schedule 17.11.2011