2010-02-08 1 views
23

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

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

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

  • Elkhound (опционально, Томит/РВО)
  • DParser (Томит/РВО)
  • SDLR (Томит/РВО)

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

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

часто, «Обходные пути» используются как включение сканера по запросу парсера.

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

Ответы:

+0

Еще несколько «Обобщенный левый-правый правый деривационный анализатор» перечислены здесь http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages ​​ – stacker

+0

@stacker: Википедия перечисляет лексер DParser как «сгенерированный»; И GLR не подразумевает scannerless – Meinersbur

+0

Я не понимаю, почему сканер будет препятствием для нескольких языков или языков без зарезервированных ключевых слов. Сканер по-прежнему будет полезен для использования пробелов и (по крайней мере часто) комментариев и объединения символов в числа и слова. –

ответ

10

Два других:.

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

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

Я на самом деле огромный поклонник сканерных парсеров; они упрощают конфигурацию. И типичные генераторы сканеров, мягко говоря, не очень забавны в использовании. На странице человека для Lex:

The asteroid to kill this dinosaur is still in orbit.

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

3

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

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

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

9

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: Похоже, я был неправ Не будет в первый раз в моей жизни :)

+0

Спасибо за ваш ответ, особенно за сообщение о вашем опыте в отрасли. Обратите внимание, что линейные разности скоростей не являются основным недостатком. В противном случае никто не мог бы написать сканеры на языках сценариев. Но GLR может привести к нелинейным характеристикам в грамматиках, которые требуют неограниченного вида (O (n³)), например, токенов идентификатора. Если парсеры могут обрабатывать жетоны с линейной сложностью (и есть идеи для этого), зачем писать сканер? – Meinersbur

+0

Scannerless Elkhound: http://scottmcpeak.com/elkhound/sources/elkhound/examples/scannerless/ – Meinersbur

+0

@Meinersbur: Я не понимаю вашу точку зрения. Кажется, вы говорите, что синтаксические сканеры без нелинейности при попытке обрабатывать идентификаторы; что предложит вам согласиться с тем, что использование анализатора без сканера не является хорошей идеей. Но тогда вы говорите: «Зачем писать сканер?». Что я упустил? –

Смежные вопросы