Когда лучше для использования синтаксического анализатора, такого как ANTLR по сравнению с написанием собственного кода парсинга?

Я должен проанализировать простой DSL, который похож на это:

funcA Type1 a (funcB Type1 b) ReturnType c

Поскольку у меня нет опыта с grammer парсинг инструментов, я думал, что это будет более быстро для записи основного синтаксического анализатора сам (в Java).

Это было бы лучше, даже для простого DSL, чтобы я использовал что-то как ANTLR, и создайте надлежащее grammer определение?

5
задан Viral Shah 16 March 2010 в 17:07
поделиться

3 ответа

Простой ответ: когда легче написать правила, описывающие вашу грамматику, чем написать код, который принимает язык, описанный вашей грамматикой.

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

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

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

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

3
ответ дан 14 December 2019 в 01:05
поделиться

Лучше использовать готовый парсер (генератор), такой как ANTLR, когда вы хотите разработать и использовать собственный язык. Лучше написать свой собственный парсер, если ваша цель - написать парсер.

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

2
ответ дан 14 December 2019 в 01:05
поделиться

Грамматики имеют тенденцию развиваться, (как и требования). Домашние парсеры трудно поддерживать и это приводит к повторному изобретению колеса. Если вы думаете, что можете быстро написать парсер на java, то вы должны знать, что быстрее будет использовать любой из решений lex/yacc/компилятор-компилятор. Лексеры писать проще, но тогда вам понадобится собственная семантика старшинства правил, которую нелегко тестировать или поддерживать. ANTLR также предоставляет идею для визуализации AST. Дополнительным преимуществом является возможность генерировать промежуточный код с помощью шаблонов строк, что является совершенно другим аспектом.

4
ответ дан 14 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: