2013-02-21 17 views
8

Mam gramatykę, która działa i parsuje w konsoli Irony, ale nie dostaję niczego w widoku drzewa AST. Śledziłem razem z artykułem BASIC-> Javascript tutaj: http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler, ale wygląda na to, że wszystkie pliki Ast zostały przeniesione/usunięte. Znalazłem Irony.Interpreter .dll, który zawiera pewne rzeczy Ast, ale wydaje się, że wszystkie są powiązane w przykładowej implementacji Expression.Jak mam teraz pracować z AST w Irony?

Czego mi tu brakuje? Chcę chodzić po drzewie i generować kod źródłowy, i nie jestem pewien, od czego zacząć.

Widziałem wzmiankę o używaniu wzoru gościa, z którym jestem w porządku, ale nie wiem jak go wdrożyć i uruchomić w sposób, który lubi Irony.

+2

Po prostu przełączyłem się na ANTLR, więc myślę, że teraz to wszystko jest dyskusyjne. Tak mało pomocy, to boli. No cóż, dziękuję za wszystko, za co trzeba było spojrzeć! –

Odpowiedz

5

Zapoznaj się z trafnie nazwanym projektem Sarcasm dla referencyjnej implementacji gramatyki, analizatora składni i AST opartej na Irony. Znalazłem to autorstwo, aby pomóc w budowaniu AST.

Poniżej znajduje się ogólny przewodnik po przygotowaniu i uruchomieniu AST.

  1. Zdefiniować gramatykę (example)
  2. Tworzenie abstrakcyjnej klasy bazowej (MyBaseNode) pochodzącej z AstNode (example).Kopiowanie/Pasta metody z przykładu
  3. dla każdego terminala i nieterminalny stworzyć nową klasę pochodzący z MyBaseNode i

    1. override Accept metody (example):

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

    1. Zastąp Init (najczęściej na terminalach) lub InitChildren (bez terminarza) ls) w razie potrzeby. To tutaj dzieje się magia AST.
  4. Dodaj interfejs IMyNodeVisitor i dodać metodę Visit dla każdej klasy określonej w poprzednim etapie (example):

    void Visit(MyDerivedNode1 node);

  5. Ustaw ASTNodeType dla każdego z terminali i nie- terminale w gramatyce od kroku 1.

    1. Dla terminali - (example)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. Dla nie terminali - (example)

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

  6. W umożliwienia tworzenia AST gramatyki: (example)

    LanguageFlags = LanguageFlags.CreateAst;

+0

Holy smokes. Sarkazm to nie tylko implementacja referencyjna, to "Sarkazm, podobny do EBNF DSL, który generuje Irony"! To jest jak początek zmieszany z ouroboros. – fostandy

+0

Link do projektu Sarcasm jest martwy. (Czy jest to jakiś celowy żart "kto pierwszy", którego nie dostałem?) – alx9r

3

W Irony parsowanie odbywa się w 2 fazach. Najpierw tworzy drzewo analizy, a następnie tworzy twoje drzewo AST.

Widzisz tylko pierwszy krok. Aby Irony stworzenia AST można:

  1. powiedzieć, że jak do mapowania nieterminali do węzłów AST:

    Np patrząc na Grammer próbki Irony ExpressionEvaluatorGrammar widzimy:

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

    Tu ironia mówimy mapować BinExpr nieterminalowi do BinaryOperationNode który jest naszym węzeł AST.

  2. Zrób to wygenerować AST podczas parsowania:

    Po ustawieniu tej flagi drzewo AST zostanie wygenerowany podczas analizowania.

    this.LanguageFlags = LanguageFlags.CreateAst; 
    

Korzeń drzewa AST będzie wtedy:

parseTree.Root.AstNode 

znalazłem this źródło doskonałym punktem wyjścia.