Wie arbeite ich jetzt mit dem AST in Irony?

8

Ich habe eine Grammatik, die in der Irony-Konsole funktioniert und analysiert, aber ich bekomme nichts in der AST-Baumansicht. Ich folgte dem BASIC- & gt; Javascript-Artikel, der hier gefunden wurde: Ссылка , aber es scheint, dass das Ast-Zeug alle bewegt / entfernt wurde. Ich habe die Irony.Interpreter .dll gefunden, die etwas Ast-Zeug enthält, aber es scheint alles in der Expression-Beispielimplementierung gebunden zu sein.

Was fehlt mir hier? Ich möchte meinen Baum gehen und Quellcode generieren, und ich bin mir nicht sicher, wo ich anfangen soll.

Ich habe schon erwähnt, dass ich das Besuchermuster benutze, mit dem es mir gut geht, aber ich weiß nicht, wie ich es implementieren und es so ausführen soll, wie Ironie es mag.

    
Christopher Karper 21.02.2013, 21:47
quelle

2 Antworten

5

Sehen Sie sich das Sarkasmus -Projekt für eine Referenzimplementierung von Grammatik, Parser und AST an, die auf Irony basieren. Ich fand diesen Blogeintrag vom Autor als hilfreich beim Aufbau der AST.

Das Folgende ist ein allgemeiner Leitfaden, um den AST zum Laufen zu bringen.

  1. Definieren Sie Ihre Grammatik ( Beispiel )
  2. Erstellen Sie eine abstrakte Basisklasse ( MyBaseNode ) Ableiten von AstNode ( Beispiel ). Kopieren Sie die Methoden aus dem Beispiel
  3. Erstellen Sie für jedes Terminal und Nicht-Terminal eine neue Klasse, die von MyBaseNode und

    abgeleitet ist
    1. Aufschalten Accept -Methode ( Beispiel ):

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

    1. Init (meist auf Terminals) oder < a href="https://github.com/akfish/Sarcasm/blob/38f1555b756c30cd66a2bbda523e51db3c6b9033/Sarcasm/Ast/SarcasmNode.cs#L344"> InitChildren (Nicht-Terminals). Hier findet die AST Magie statt.
  4. Fügen Sie eine Schnittstelle IMyNodeVisitor hinzu und fügen Sie eine Visit -Methode für jede Klasse hinzu, die im vorherigen Schritt definiert wurde ( Beispiel ):

    void Visit(MyDerivedNode1 node);

  5. Legen Sie% code% für jedes Ihrer Terminals und Nicht-Terminals in Ihrer Grammatik aus Schritt 1 fest.

    1. Für Terminals - ( Beispiel )

      ASTNodeType

    2. Für Nicht-Terminals - ( Beispiel )

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

  6. In der Grammatik AST Schaffung aktivieren: ( Beispiel )

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

Jay Walker 22.09.2015, 05:47
quelle
3

In Irony wird das Parsen in zwei Phasen durchgeführt. Zuerst erstellt er einen Syntaxbaum und dann erstellt er Ihren AST-Baum.

Sie sehen nur den ersten Schritt. Damit Irony den AST erstellen kann, kannst du:

  1. Sagen Sie ihm, wie Sie Ihre Nonterminals zu AST-Knoten mappen:

    z. Beim Betrachten der Irony-Beispiel-Grammatik ExpressionEvaluatorGrammar sehen wir:

    %Vor%

    Hier empfehlen wir Irony, das BinExpr NonTerminal einem BinaryOperationNode zuzuordnen, der unser AST-Knoten ist.

  2. Erzeuge die AST beim Parsen:

    Wenn Sie dieses Flag setzen, wird beim Analysieren der AST-Baum erzeugt.

    %Vor%

Die Wurzel Ihres AST-Baums ist dann:

%Vor%

Ich fand diese Quelle einen guten Ausgangspunkt.

    
Co-der 18.10.2013 10:08
quelle