Здравствуйте, Аноним, Вы писали:
VD>>Статьи есть. Кто хочет, то пользуется гуглем. Например, вотАвтор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.
или вот. Чтобы убедиться в крутости не надо даже статей читать. Качаешь инсталлятор и тратишь пол часа на эксперименты.
А>За ссылки спасибо, прочитал. Ничего революционного не увидел. Еще один антлр, только другой и на Н. На "... considered harmful" не тянет. А жаль.
Отвечаю не тебе, а просто, чтобы тот кто будет читать дискуссию не купился на очередное "ну что тут такого?". Плюсов по сравнению с Антлр достаточно.
Антлр не встроен в язык, все что он может — сгенерить достаточно неоптимальный код на C#. Отлаживать этот код удовольствие не из приятных. Делать AST за один проход в антлр достаточно проблематично, обычно там делают лексер, парсер и treeparser
. Антлр не PEG, у него другая грамматика. AST получаемый антлром завязан как на парсер так и на антлр, в PEG мы создаем его сами.
Итак антлр проигрывает по скорости парсинга, объему кода, качеству получаемого AST, удобству отладки и интеграции в проект на .net. Единственная причина по которой можно использовать антлр — это вероятность разжиться готовой грамматикой. К сожалению все, что мне попадались были в полурабочем состоянии и AST подходил мне не совсем.
Для сравнения могу привести парсер json
на PEG и
на antrl3.
AST
для antrl3 (все данные в Object) и
для PEG, все строго типизировано.
Скорость я не сравнивал, только глядя на реализацию на антлр уже видны проблемы производительности.
Здравствуйте, Ziaw, Вы писали:
Z>Для сравнения могу привести парсер json на PEG
Ссылку забыл дать.
Z> и на antrl3.
Особо порадовало, что для столь простой вещи пришлось применять семантические придикаты (т.е. "приседания"):
number : n=Number {Pattern.matches("(0|(-?[1-9]\\d*))(\\.\\d+)?", n.getText())}?
Exponent?
-> ^(NUMBER Number Exponent?)
;