2013-02-21 4 views
8

У меня есть грамматика, которая работает и разбирает в консоли Иронии просто отлично, но я ничего не получаю в дереве дерева АСТ. Я следовал вместе со статьей BASIC-> Javascript, найденной здесь: http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler, но кажется, что материал Ast был перемещен/удален. Я нашел файл Irony.Interpreter .dll, в котором есть некоторые материалы Ast, но, похоже, все они связаны с реализацией примера Expression.Как мне теперь работать с АСТ в Иронии?

Что мне здесь не хватает? Я хочу, чтобы мое дерево и генерировать исходный код, и я не знаю, с чего начать.

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

+2

Я просто перешел на ANTLR, поэтому я предполагаю, что это все спорно в настоящее время. Так мало помогает, больно. О, хорошо, спасибо за то, что уделило время, чтобы посмотреть! –

ответ

5

Отметьте метко названный проект Sarcasm для эталонной реализации грамматики, анализатора и AST, основанного на Иронии. Я нашел этот blog entry автором, чтобы помочь в создании АСТ.

Ниже приведено руководство общего назначения для запуска АСТ.

  1. Определение грамматики (example)
  2. Создать абстрактный базовый класс (MyBaseNode), производный от AstNode (example).Копировать/Вставить методы из примера
  3. для каждого терминала и не-терминал создать новый класс, производный от MyBaseNode и

    1. Override Accept методы (example):

    public override void Accept(IMyNodeVisitor visitor) { visitor.Visit(this); }

    1. Переопределение Init (в основном на терминалах) или InitChildren (без термина ls). Здесь и происходит магия АСТ.
  4. Добавить интерфейс IMyNodeVisitor и добавить метод Visit для каждого класса, определенного в предыдущем шаге (example):

    void Visit(MyDerivedNode1 node);

  5. Установите ASTNodeType для каждого из терминалов и не- терминалов в грамматике с этапа 1.

    1. Для терминалов - (example)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. Для нетерминалов - (example)

      var MyNonTerminal2 = new NonTerminal("MyNonTerminal2", typeof(MyDerivedNode2));

  6. в полнофункциональном создания AST грамматики: (example)

    LanguageFlags = LanguageFlags.CreateAst;

+0

Святой курит. Сарказм - это не просто эталонная реализация, а «Сарказм», подобный EBNF DSL, который генерирует Ирония! Это похоже на начало, смешанное с оуробором. – fostandy

+0

Ссылка на проект Sarcasm мертва. (Или это какая-то умышленная «кто на первой» шутке, которую я не получил?) – alx9r

3

В анализе Иронии делается в 2 этапа. Сначала он создает дерево разбора, а затем создает свое дерево AST.

Вы видите только первый шаг. Для того, чтобы Иронии для создания AST вы можете:

  1. Назови его, как сопоставить ваши нетерминалы к AST узлов:

    Э.Г. глядя на Иронию образец грамматике ExpressionEvaluatorGrammar мы видим:

    var BinExpr = new NonTerminal("BinExpr", typeof(BinaryOperationNode));`  
    

    Здесь мы говорим ирония карта BinExpr Нетерминальных к BinaryOperationNode, которая является нашим AST узла.

  2. Сделать это сгенерировать AST при разборе:

    Когда вы установите этот флаг дерево AST будет сгенерирован, когда вы разбираете.

    this.LanguageFlags = LanguageFlags.CreateAst; 
    

Корень вашего AST дерева будет тогда:

parseTree.Root.AstNode 

Я нашел this источник отличной отправной точкой.

Смежные вопросы