Какой самый короткий способ написать парсер для моего языка? - PullRequest
8 голосов
/ 04 октября 2009

PS. Где почитать про теорию разбора?

Ответы [ 11 ]

11 голосов
/ 04 октября 2009

Всегда полезно прочитать Книгу Дракона . Но учтите, что если ваш язык не тривиален, на самом деле не существует «короткого» способа сделать это.

11 голосов
/ 10 октября 2009

Резюме: самый короткий, вероятно, Antlr.

Соблазнительно пойти в Книгу Дракона, чтобы узнать о теории разбора. Но я не думаю, что Книга Дракона, и у вас есть одно и то же представление о том, что означает «теория» Книга Дракона описывает, как создавать рукописные парсеры, генераторы парсеров и т. Д., Но вы почти наверняка захотите использовать инструмент генерации парсеров.

Несколько человек предложили Bison и Flex (или их более старые версии Yacc и Lex). Это старые приверженцы, но они не очень полезны. Их документация сама по себе не плохая, просто она не совсем помогает разобраться с случайной сложностью их использования. Их внутренние данные плохо инкапсулированы, и с ними очень сложно что-либо сделать. Например, в phc у нас все еще нет правильных номеров строк, потому что это очень сложно. Они поправились, когда мы изменили грамматику, включив в нее операторы «без операции», но это невероятный взлом, который не должен быть необходим.

Якобы, Bison и Flex работают вместе, но интерфейс неудобен. Хуже того, существует множество версий каждой из них, которые прекрасно работают только с некоторыми конкретными версиями другой. И, наконец, я, по крайней мере, проверил, документация о том, какие версии пошли, а какая была довольно скудной.

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

Непонятно, на каком языке вы работаете, но некоторые языки имеют отличные рамки синтаксического анализа. В частности, библиотека Haskell Parsec выглядит очень элегантно. Если вы используете C ++, у вас может возникнуть соблазн использовать Spirit . Мне было очень легко начать, и трудно - но все же возможно - делать с ним сложные вещи. Это соответствует моему опыту C ++ в целом. Я говорю, что мне было легко начать, но тогда я уже написал пару парсеров и изучал синтаксический анализ в классе компилятора.

Короче говоря: Antlr, если только у вас нет веских причин.

5 голосов
/ 04 октября 2009

Это скорее зависит от вашего языка. Некоторые очень простые языки требуют очень небольшого разбора, поэтому могут быть закодированы вручную; другие языки используют генераторы PEG, такие как Rats! (PEG - грамматика выражений синтаксического анализатора, которая находится между Regex и LR-анализатором) или обычные генераторы синтаксического анализатора, такие как Antlr и Yacc. Менее формальные языки требуют вероятностных методов, таких как ссылка грамматики .

4 голосов
/ 04 октября 2009

Запись парсера рекурсивного спуска . Иногда это проще, чем YACC / BISON, и, как правило, более интуитивно понятно.

3 голосов
/ 10 октября 2009

У Дугласа Крокфорда есть доступный пример парсера, написанного на JavaScript .

2 голосов
/ 04 октября 2009

Попробуйте Бизон для разбора и Flex для лексинга

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

2 голосов
/ 04 октября 2009

Я использовал GOLD Parsing System , потому что он казался более легким в использовании, чем ANTLR для такого новичка, как я, и при этом был достаточно полнофункциональным для моих нужд. Веб-сайт включает документацию (включая инструкции по написанию грамматик , что составляет половину работы), а также программное обеспечение .

2 голосов
/ 04 октября 2009

YACC , существуют различные реализации для разных языков.

Удачи с вашим языком; -)

1 голос
/ 10 октября 2009

ANTLR является самым простым для тех, кто не имеет опыта в теории компиляции из-за:

  • ANTLRWORKS (визуальный анализ и отладка AST)

  • Книга ANTLR (фон теории компиляции не требуется)

  • Всего 1 синтаксис для лексера и анализатора.

1 голос
/ 10 октября 2009

Использование генератора синтаксического анализатора для вашего основного языка является самым быстрым способом в сочетании с теорией синтаксического анализа из книги, такой как Книга Дракона или Современная компиляция в серии {C, ML}.

Если вы используете C, yacc и версия GNU bison являются стандартными генераторами. Насколько мне известно, Antlr широко используется во многих языках, поддерживая Java, C # и C ++. Есть также много других почти на любом языке.

Мой личный фаворит в настоящее время - Menhir , отличный генератор парсера для OCaml. Языковые диалекты в стиле ML (Ocaml, Standard ML и т. Д.) В целом очень хороши для построения компиляторов и интерпретаторов.

...