Подтвердить что ты не робот

Рекомендации по написанию парсера языка программирования

Есть ли какие-либо рекомендации, которые я должен соблюдать при написании парсера?

4b9b3361

Ответ 1

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

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

Будучи свободным от контекста, он не только делает генератор синтаксического анализа возможным, но и делает парсинг с ручной кодировкой намного проще. То, что у вас есть, - это одна (или две) функции для каждой фразы. Который, если вы упорядочиваете и называете код чисто, не намного сложнее увидеть, чем грамматику (если ваша среда IDE может показать вам звонки иерархиями, то вы можете в значительной степени увидеть, что такое грамматика).

Преимущества: -

  • Упрощенная сборка
  • Лучшая производительность
  • Улучшенный контроль вывода
  • Может справляться с небольшими отклонениями, например. работа с грамматикой, которая не является на 100% свободным от контекста.

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

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

Ответ 2

Несколько советов:

  • Знайте свою грамматику - запишите ее в подходящей форме
  • Выберите нужный инструмент. Сделайте это изнутри С++ с помощью Spirit2x или выберите инструменты внешнего анализатора, такие как antlr, yacc или что вам подходит.
  • Вам нужен парсер? Может быть, регулярное выражение будет достаточным? Или, может быть, взломать perl script, чтобы сделать трюк? Написание сложных парсеров требует времени.

Ответ 3

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

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

Ответ 4

Сначала прочитайте большую часть Dragon book.

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

Ответ 5

Угу. Попытайтесь его создать, а не писать. Подумайте о том, как использовать yacc, ANTLR, Flex/Bison, Coco/R, GOLD Parser generator и т.д. Прибегать к ручному написанию парсера только в том случае, если ни один из существующих генераторов парсера не соответствует вашим потребностям.

Ответ 6

  • Выберите правильный тип парсера, иногда рекурсивного потомка будет достаточно, иногда вам нужно использовать парсер LR (также есть много типов парсеров LR).
  • Если у вас сложная грамматика, создайте абстрактное дерево синтаксиса.
  • Попробуйте точно определить, что входит в lexer, что является частью синтаксиса и что является вопросом семантики.
  • Попробуйте сделать парсер наименее связанным с реализацией lexer, насколько это возможно.
  • Обеспечьте хороший интерфейс для пользователя, чтобы он был агностиком реализации парсера.

Ответ 7

Во-первых, не пытайтесь применять те же методы для синтаксического анализа всего. Существует множество возможных вариантов использования - от чего-то вроде IP-адресов (бит ad hoc-кода) до программ на С++ (для которых необходим анализатор промышленной силы с обратной связью из таблицы символов) и от пользовательского ввода (который нужно обрабатывать очень быстро) для компиляторов (которые обычно могут позволить себе провести небольшой анализ времени). Вы можете указать, что вы делаете, если хотите получить полезные ответы.

Во-вторых, используйте грамматику для разбора. Чем сложнее это, тем более формальной должна быть спецификация. Попытайтесь ошибиться на стороне слишком формальной.

В-третьих, это зависит от того, что вы делаете.