Генераторы парсеров без сканера - PullRequest
23 голосов
/ 08 февраля 2010

Пролог: Хотя набор языков, распознаваемых синтаксическими анализаторами (грамматики без контекста), строго больше, чем один из сканеров (регулярные грамматики), большинству генераторов синтаксического анализатора необходим сканер.

(Пожалуйста, не пытайтесь объяснить причины этого, я их хорошо знаю).

Я видел парсеры, для которых не требуется сканер типа

Существуют определенные преимущества использования без сканера:

  • Только одна концепция (контекстно-свободные грамматики) вместо двух
  • Разбор нескольких языков в одном файле (например, HTML / Javascript)
  • Разбор языков без зарезервированных ключевых слов (например, PL / 1 )

Часто "обходные пути" используются как переключение сканера по запросу синтаксического анализатора.

Вопрос: Знаете ли вы какие-либо другие генераторы синтаксического анализатора без сканера (любой язык)? Являются ли они практичными в использовании (или чисто академическими)? Есть ли другие подходы, кроме Tomita / GLR?

Ответы:

Ответы [ 5 ]

11 голосов
/ 14 февраля 2010

Два других:

  • Для грамматики синтаксического анализа (PEG) Брайана Форда не требуется сканер. Эффективный, ленивый "parrat parser" не обязателен. У меня не было ничего, кроме хорошего опыта с версией Lua LPEG , которая компилируется в эффективную машину байт-кода. Довольно практично.

  • YAKKER выглядит очень интригующе, хотя все еще явно находится в состоянии перед выпуском. Они используют то, что, по их утверждению, является эффективным вариантом алгоритма парсинга Эрли.

Я на самом деле большой поклонник парсеров без сканера; они значительно упрощают настройку. А типичные генераторы сканеров, мягко говоря, не очень интересны в использовании. Со страницы руководства для Лекса:

Астероид, убивающий этого динозавра, все еще находится на орбите.

Наконец, у меня нет личного опыта с Elkhound, но подержанные сообщения, которые я слышу, впечатляют Я бы сказал, что нет никаких сомнений в том, что некоторые генераторы синтаксического анализатора без сканера очень практичны.

8 голосов
/ 10 февраля 2010

Генераторы парсеров не нуждаются в сканере. Но вы почти сошли с ума, если не используете один.

Парсеры, созданные генераторами парсеров, не заботятся о том, что вы им кормите, если вы называете их токенами.

Для сборки используйте генератор анализатора без сканера, просто определите свою грамматику вплоть до уровня символов и подайте отдельные символы в анализатор как токены.

Причина, по которой это безумие, заключается в том, что разбор является более сложным делом, чем лексизм. Вы можете создавать лексеры как конечные автоматы, которые переводят в машинный код почти так же, как «сравнивают и переходят в следующее состояние». Для скорости это действительно трудно победить. Генераторы синтаксических анализаторов создают синтаксические анализаторы, которые выполняют синтаксический анализ с рекурсивным спуском (для большинства генераторов LL, таких как ANTLR) или выполняют поиск в таблицах с помощью хеширования, двоичного или линейного поиска и т. Д. Таким образом, анализатор тратит на токен гораздо больше энергии, чем лексер тратит на характер.

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

Так называемые парсеры GLR без сканера страдают от этой проблемы производительности по сравнению с парсерами GLR, которые предназначены для использования токенов.

Моя компания создает инструмент, DMS Software Reengineering Toolkit , который использует синтаксический анализатор GLR (и успешно анализирует все распространенные языки, которые вы знаете, и множество странных, которые у вас нет, потому что он имеет GLR синтаксический анализатор). Мы знали о парсерах без сканера и решили не применять их из-за разницы в скорости; у нас есть классически стилизованная (но чрезвычайно мощная) LEX-подобная подсистема для определения лексических токенов. В одном случае, когда DMS сравнивал XT (инструмент с анализатором GLR без сканера), обрабатывая один и тот же ввод, DMS оказался в 10 раз быстрее, чем пакет XT. Справедливости ради, проведенный эксперимент был специальным и не повторялся, но, поскольку он совпал с моими подозрениями, я не видел причин для его повторения. YMMV. И, конечно, если мы хотим работать без сканера, то довольно просто написать грамматику с символьными терминалами, как я уже указывал.

GLR-сканеры без сканера do имеют еще одно очень приятное свойство, которое не будет иметь значения для большинства людей. Вы можете взять две отдельные грамматики для синтаксического анализатора без сканера и буквально объединить их, и при этом получить синтаксический анализатор (часто с большим количеством неясностей). Это очень важно, когда вы создаете один язык, встроенный в другой. Если это не то, что вы делаете, это просто академическое любопытство.

И, AFAIK, Элкхаунд не без сканера. (Я могу ошибаться в этом). (РЕДАКТИРОВАТЬ: 2/10: Похоже, я был неправ. Не в первый раз в моей жизни:)

3 голосов
/ 25 сентября 2011

Waxeye : синтаксический анализатор без сканера, основанный на синтаксическом анализе грамматик выражения (PEG).

3 голосов
/ 08 февраля 2010

boost::spirit::qi не нужен лексер, хотя вы можете использовать boost::spirit::lex в качестве внешнего интерфейса. С введением boost::spirit::lex:

На самом деле Spirit.Qi позволяет писать парсеры без использования лексера, разбор входной поток символов напрямую, и по большей части это путь Дух был использован с момента его Изобретение.

boost::spirit (оригинал) на самом деле работал именно так, как вы хотели, но он был перемещен в boost::spirit::classic. spirit::qi, spirit::lex - это новый дизайн духа, поэтому я упустил классическую версию:)

1 голос
/ 18 марта 2010

Извините за некропост. Вы можете попробовать это - встраиваемая реализация PEG / Packrat для .NET:

http://www.meta -alternative.net / pfdoc.pdf

http://www.meta -alternative.net / mbase.html

...