Лучший / самый быстрый способ написать парсер в C # - PullRequest
15 голосов
/ 01 октября 2009

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

Ответы [ 7 ]

18 голосов
/ 01 октября 2009

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

Он также предоставляет довольно хорошие средства для создания значимых AST без необходимости писать какой-либо код - для каждого грамматического производства вы указываете «критический» токен или подпроизводство, и оно становится узлом дерева. Или вы можете написать дерево производства.

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

11 голосов
/ 01 октября 2009

Я играл с Ирония . Выглядит просто и полезно.

1 голос

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

1 голос
/ 01 октября 2009

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

1 голос
/ 01 октября 2009

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

1 голос
/ 01 октября 2009

Вы можете изучить исходный код для Mono C # компилятора .

0 голосов
/ 02 октября 2009

Лекс и Як все еще мои любимые. Непонятно, если вы только начинаете, но чрезвычайно просто, быстро и легко, как только вы потеряли язык.

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

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

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

...