Должен ли я использовать Workflow или fsYacc?

#f# #workflow #fsyacc #fparsec #fslex

#f# #рабочий процесс #fsyacc #fparsec #fslex

Вопрос:

У меня есть очень простой DSL, который мне нужно проанализировать на платформе .Net. Не имея большого опыта работы с синтаксическими анализаторами, я рассматривал примеры с использованием F # (fsLex, fsYacc, FParsec). Я не очень хорошо знаком с F #, но у меня есть некоторый опыт работы с Workflow и LINQ.

Учитывая простоту DSL, мне может сойти с рук использование LINQ для реализации лексера. Workflow (я бы использовал V4) привлекателен для реализации грамматики, поскольку я с ней лучше знаком, ее легче объяснить другим, учитывая ее графический характер, и она поддерживается Microsoft и, предположительно, будет продолжать развиваться.

Однако, если мой DSL становится более сложным, я могу представить, что реализация WF превращается во вложенный ад действий, а лексер на основе LINQ работает таким же образом. На этом этапе изучение F # и использование одного из инструментов F # имело бы больше смысла.

Мне интересно, сравнивали ли другие инструменты синтаксического анализа WF и F # для реализации простого интерпретатора DSL и каковы могут быть выводы.

Ответ №1:

Трудно дать ответ, не зная немного больше о том, что должен делать DSL, и насколько сложным он может стать в будущем. Если ваш DSL касается workflow, то WF кажется очень логичным выбором для хранения ваших проанализированных результатов.

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

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

Лично мне очень нравится FParsec для синтаксического анализа. Это требует некоторых знаний о F #, но когда вы разбираетесь в этом, он настолько безумно эффективен для превращения текста в AST, и он очень скуден тем, что нет никаких «волшебных шагов», которые превращают ваш EBNF в тарабарский код, вы можете увидеть, как это работает, и настроить его.

Когда у вас нет времени углубляться в F # и FParsec, есть также ирония, которая похожа на FParsec, но тогда для C #.

Это то, что я могу сказать из того, что вы нам рассказали, если у вас есть какие-либо конкретные проблемы, сообщите нам.

Rgds GJ