Parser генераторов делать не необходимости сканер. Но вы очень сумасшедший, если не используете его.
Парсеры, созданные генераторами парсера, не заботятся о том, что вы их кормите, если вы называете их жетонами.
Чтобы использовать генератор синтаксического анализатора без сканера, просто определите грамматику до уровня персонажа и поместите отдельные символы в парсер в качестве токенов.
Причина, по которой это безумие, заключается в том, что синтаксический анализ является более сложным, чем лексирование. Вы можете создавать лексеры как конечные конечные машины, которые переводят на машинный код в значительной степени, как «сравнить и перейти к следующему состоянию». Для скорости это действительно сложно победить. Генераторы Parser создают парсеры, которые проводят рекурсивный прогностический анализ спуска (для большинства генераторов LL, таких как ANTLR), или выполняют поиск таблиц путем хэширования, двоичного или линейного поиска и т. Д. Таким образом, парсер тратит гораздо больше энергии на токен, чем лексер тратит на персонаж.
Если вы подаете символы в парсер в качестве токенов, он будет тратить соответственно больше энергии на персонажа, чем эквивалент лексера. Если вы обрабатываете много текста ввода, это в конечном итоге будет иметь значение, независимо от того, выполняете ли вы это для небольших потоков ввода или нескольких действительно больших.
Так называемые сканерные анализаторы GLR страдают от этой проблемы с производительностью, по сравнению с анализаторами GLR, которые предназначены для использования токенов.
Наша компания создает инструмент, the DMS Software Reengineering Toolkit, который использует анализатор GLR (и успешно разбирает все обычные langauges, которые вы знаете, и много лишних, которых нет, потому что у него есть парсер GLR). Мы знали о сканерных синтаксических анализаторах и решили не выполнять их из-за разницы в скорости; у нас есть классическая (но чрезвычайно мощная) LEX-подобная подсистема для определения лексических токенов. В одном случае, когда DMS перешел носом к носу против инструмента XT (инструмента со сканерным анализатором GLR), который обрабатывал тот же вход, DMS оказался в 10 раз быстрее, чем XT-пакет. Справедливости ради следует, что эксперимент проводился ad hoc и не повторялся, но поскольку он соответствовал моим подозрениям, я не видел причин повторять его. YMMV. И, конечно, если мы хотим пойти без сканера, ну, довольно легко написать грамматик с символьными терминалами, как я уже указывал.
GLR Анализаторы scannerless do имеют еще одно очень приятное свойство, которое не имеет большого значения для большинства людей. Вы можете взять две отдельные грамматики для анализатора без сканера и буквально объединить их и все равно получить парсер (часто с большим количеством двусмысленностей). Это очень важно, когда вы строите один язык, встроенный в другой. Если это не то, что вы делаете, это просто академическое любопытство.
И, AFAIK, Elkhound не работает без сканера. (Я мог ошибаться в этом). (EDIT: 2/10: Похоже, я был неправ Не будет в первый раз в моей жизни :)
Еще несколько «Обобщенный левый-правый правый деривационный анализатор» перечислены здесь http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages – stacker
@stacker: Википедия перечисляет лексер DParser как «сгенерированный»; И GLR не подразумевает scannerless – Meinersbur
Я не понимаю, почему сканер будет препятствием для нескольких языков или языков без зарезервированных ключевых слов. Сканер по-прежнему будет полезен для использования пробелов и (по крайней мере часто) комментариев и объединения символов в числа и слова. –