Небольшой шрифт, похожий на DSL, который компилируется в код C / C ++ - хороший ли Antlr выбор? - PullRequest
2 голосов
/ 08 августа 2010

Создание синтаксиса Lisp, такого как DSL - очень маленькое специальное приложение - но очень быстрая - генерация кода на C, Antlr - хороший выбор?

По многим причинам необходимо, чтобы он был очень быстрым и внутреннимя называю множество API C ++, поэтому я не могу написать это на языке, отличном от C / C ++.

В последний раз, когда я что-то делал в компиляторах, около 5 лет назад учился в flex / bison.

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

  • Хороша ли поддержка цели C / C ++?
  • Подходит ли Antlr для создания синтаксиса Lisp, такого как DSL?
  • В целом, будет ли это лучше, чем использование flex / bison для этого конкретного приложения?

Кроме того, если бы вы могли дать мне знать, в каких темах / частях Antlr я должен быть действительно хорош, тогда было бы здорово.

Спасибо

1 Ответ

3 голосов
/ 10 августа 2010

ANTLR хорош, когда ваш синтаксис сложен.

Синтаксис LISP не является сложным, по замыслу. Все в значительной степени обрабатывается двумя правилами грамматики:

sexp  = identifier | number | string | '(' sexps ')' ;
sexps = empty | sexps sexp ;

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

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

Для создания хорошего DSL обычно требуется гораздо больше, чем просто разбор. См. Мое эссе «Жизнь после разбора» (через биографию) для получения более подробной информации.

...