Когда лучше использовать такой синтаксический анализатор, как ANTLR, вместо написания собственного кода синтаксического анализа? - PullRequest
5 голосов
/ 16 марта 2010

Мне нужно проанализировать простой DSL, который выглядит следующим образом:

funcA Type1 a (funcB Type1 b) ReturnType c

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

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

Ответы [ 3 ]

4 голосов
/ 16 марта 2010

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

3 голосов
/ 16 марта 2010

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

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

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

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

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

2 голосов
/ 16 марта 2010

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

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

...