Лучший/быстрый способ написать парсер в С#

Каков наилучший способ создания парсера в С# для анализа моего языка? В идеале я хотел бы предоставить грамматику и получить абстрактные синтаксические деревья в качестве выходных данных. Большое спасибо, Нестор

Ответы

Ответ 1

У меня был хороший опыт работы с ANTLR v3. Безусловно, самое большое преимущество заключается в том, что он позволяет писать синтаксические анализаторы LL (*) с бесконечным взглядом - они могут быть довольно субоптимальными, но грамматика может быть написана самым простым и естественным способом, без необходимости реорганизации для работы с ограничениями парсера, и производительность парсера часто не очень важна (надеюсь, вы не пишете компилятор С++), особенно в обучающих проектах.

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

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

Ответ 2

Я играл с Irony. Это выглядит просто и полезно.

Ответ 4

Пока он находится в ранней бета-версии, Oslo Моделирование языка и инструменты MGrammar от Microsoft показывают некоторые перспективы.

Ответ 5

Я также посмотрю SableCC. Его очень легко создать грамматик EBNF. Здесь - простой пример калькулятора С#.

Ответ 6

Там короткая статья здесь о построении парсера LL (1) здесь, конечно, вы тоже можете использовать генератор.

Ответ 7

Лекс и yacc все еще мои фавориты. Невероятно, если вы только начинаете, но очень просто, быстро и легко, когда у вас есть жаргон.

Вы можете сделать так, как хотите; генерировать код С#, создавать другие грамматики, эмулировать инструкции, что угодно.

Это не очень, это текстовый формат и LL1, поэтому ваш синтаксис должен соответствовать этому.

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