У меня возникла небольшая проблема с ручным испусканием токена с помощью правила lexer в ANTLR. Я знаю, что функция emit() должна использоваться, но, похоже, существует четкая нехватка документации об этом. У кого-нибудь есть хороший пример того, как это сделать?Вручную выдавать токен с ANTLR
Книга ANTLR дает хороший пример того, как вам нужно это сделать, чтобы разобрать гнездо Python. Например, если вы видите определенное количество пробелов, которое больше, чем пробел предыдущей строки, испустите токен INDENT, но если он меньше, испустите токен DEDENT. К сожалению, книга затушевывает реальный синтаксис, который требуется.
EDIT: Вот пример того, что я пытаюсь проанализировать. Это вложенные уценки по блокам цитат:
before blockquote
> text1
>
> > text2
>
> text3
outside blockquote
Теперь мой подход до сих пор по существу считать > символов в строку. Например, приведенное выше кажется, что оно должно испускать (грубо ...) PARAGRAPH_START, CDATA, PARAGRAPH_END, BQUOTE_START, CDATA, BQUOTE_START, CDATA, BQUOTE_END, CDATA, BQUOTE_END, PARAGRAPH_START, CDATA, PARAGRAPH_END. Трудность здесь - это окончательный BQUOTE_END, который, как мне кажется, должен быть мнимым маркером, испускаемым после того, как найден неблокирующий элемент (и уровень вложенности> = 1)
Скотт, не могли бы вы привести пример того, что вы пытаетесь разобрать? –
Вы упоминаете Python в вопросе, но фактически не говорите, на каком языке вы используете. Я привел пример, который делает это на C++. – chollida