Генераторы парсеров не нуждаются в сканере. Но вы почти сошли с ума, если не используете один.
Парсеры, созданные генераторами парсеров, не заботятся о том, что вы им кормите, если вы называете их токенами.
Для сборки используйте генератор анализатора без сканера, просто определите свою грамматику вплоть до уровня символов и подайте отдельные символы в анализатор как токены.
Причина, по которой это безумие, заключается в том, что разбор является более сложным делом, чем лексизм. Вы можете создавать лексеры как конечные автоматы, которые переводят в машинный код почти так же, как «сравнивают и переходят в следующее состояние». Для скорости это действительно трудно победить. Генераторы синтаксических анализаторов создают синтаксические анализаторы, которые выполняют синтаксический анализ с рекурсивным спуском (для большинства генераторов LL, таких как ANTLR) или выполняют поиск в таблицах с помощью хеширования, двоичного или линейного поиска и т. Д. Таким образом, анализатор тратит на токен гораздо больше энергии, чем лексер тратит на характер.
Если вы подаете символы в анализатор как токены, он будет тратить соответственно больше энергии на персонажа, чем эквивалентный лексер. Если вы обрабатываете много входного текста, это в конечном итоге будет иметь значение, независимо от того, делаете ли вы это для миллиардов небольших входных потоков или нескольких действительно больших.
Так называемые парсеры GLR без сканера страдают от этой проблемы производительности по сравнению с парсерами GLR, которые предназначены для использования токенов.
Моя компания создает инструмент, DMS Software Reengineering Toolkit , который использует синтаксический анализатор GLR (и успешно анализирует все распространенные языки, которые вы знаете, и множество странных, которые у вас нет, потому что он имеет GLR синтаксический анализатор). Мы знали о парсерах без сканера и решили не применять их из-за разницы в скорости; у нас есть классически стилизованная (но чрезвычайно мощная) LEX-подобная подсистема для определения лексических токенов. В одном случае, когда DMS сравнивал XT (инструмент с анализатором GLR без сканера), обрабатывая один и тот же ввод, DMS оказался в 10 раз быстрее, чем пакет XT. Справедливости ради, проведенный эксперимент был специальным и не повторялся, но, поскольку он совпал с моими подозрениями, я не видел причин для его повторения. YMMV.
И, конечно, если мы хотим работать без сканера, то довольно просто написать грамматику с символьными терминалами, как я уже указывал.
GLR-сканеры без сканера do имеют еще одно очень приятное свойство, которое не будет иметь значения для большинства людей. Вы можете взять две отдельные грамматики для синтаксического анализатора без сканера и буквально объединить их, и при этом получить синтаксический анализатор (часто с большим количеством неясностей). Это очень важно, когда вы создаете один язык, встроенный в другой. Если это не то, что вы делаете, это просто академическое любопытство.
И, AFAIK, Элкхаунд не без сканера. (Я могу ошибаться в этом).
(РЕДАКТИРОВАТЬ: 2/10: Похоже, я был неправ. Не в первый раз в моей жизни:)