Недавно я взял копию The Definitive ANTLR 4 Reference
и так как я опытный, когда дело доходит до работы с грамматикой и языками, я хотел работать над моим DSL, который я однажды написал, используя yacc
а также bison
, Общая идея — написать переводчик (с включенной проверкой безопасности типов).(1)), который переводит DSL в JavaScript во время выполнения, который затем выполняется v8.
Хотя ANTLR был разработан для включения в приложения Java, я хотел бы остановиться на нативном C ++. Может ли ANTLR 4 создавать такой синтаксический анализатор / лексер(2) что я могу включить, используя оболочку в стиле C ++? И как это сделать?
(1) В книге есть несколько хороших примеров, которые я буду использовать в качестве шаблона.
(2) Я не уверен, но я думаю, что где-то читал, что ANTLR не поддерживает вывод в C ++, я прав?
ANTLR v3 имеет различные цели, особенно Java (конечно), C, C #, JavaScript и Python. Для полного списка, см .: http://www.antlr.org/wiki/display/ANTLR3/Code+Generation+Targets
ANTLR v4, однако, имеет только цель Java на данный момент.
Я обнаружил, что цель ANTLR 3 C / C ++ почти непригодна для использования. Он содержит так много хаков, чтобы обойти отсутствие исключений в Си, что было рекомендовано только для экспертов. Хотя это вызов Терра, я надеюсь, что ANTLR 4 не поддерживает целевые языки без собственных исключений, если только он не может изолировать любые хакерские действия, требуемые для этого от конечных пользователей. Цель ANTLR 2 C ++ чище, чем цель ANTLR 3, но сама ANTLR 2 имеет ограничения, в том числе чрезвычайно грязное лицензирование (что затрудняет использование в коммерческих продуктах).
Если вы все еще заинтересованы, версия 4.7 antlr имеет цель c ++.
Джону Дж. Ответь
Я согласен, что цель ANTLR3 C очень хакерская. Я, эксперт по C / C ++ с 20-летним стажем, не смог даже догадаться, как его использовать, без ответов автора. Да, идеи были довольно хорошими, но без документов почти невозможно понять.
Я не согласен, что главная проблема с исключениями. Во времена реализации ANTLR2 и C ++ для fir v2 исключения существовали … И было мнение, что, если удалить исключения, это будет быстрее. В v3 они пытаются это сделать, но …
Но скорость не стала лучше. Мы надеялись переключиться с ANTRL2 на ANTLR3 в нашем движке базы данных Valentina, мы потратили месяцы на переписывание грамматики v3 и … ускорились до нуля. Просто ноль. Таким образом, мы используем до сих пор v2 ANTLR.
Я думаю, что основной проблемой, если скорость в ANTLR является тот факт, что для каждого правила она выдает отдельную функцию. Да, это его сильная сторона, и это его слабая сторона.
В v4 Терренс изобрел, как использовать конечные автоматы в Lexer. Если бы мы могли получить это и для парсеров. Я думаю, что в идеале ANTLR мог бы производить функции, как сейчас, пока мы разрабатываем грамматику и конечные автоматы для выпуска. Но это пока мечта.