Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I work with the AST in Irony now?

I have a grammar that works and parses in the Irony console just fine, but I don't get anything in the AST treeview. I was following along with the BASIC->Javascript article found here: http://www.codeproject.com/Articles/25069/JSBasic-A-BASIC-to-JavaScript-Compiler, but it seems that the Ast stuff has all been moved/removed. I found the Irony.Interpreter .dll, which has some Ast stuff in it, but it seems all tied up in the Expression sample implementation.

What am I missing here? I want to walk my tree and generate source code, and I'm not sure where to start.

I've seen some mention of using the visitor pattern, which I'm fine with, but I don't know how to implement it and run it in a way that Irony likes.

like image 841
Christopher Karper Avatar asked Feb 21 '13 21:02

Christopher Karper


People also ask

What does AST parse do?

In Python, the ast. parse() function splits the source code into tokens based on the grammar. These tokens are then transformed to build an Abstract Syntax Tree (AST). It is a tree representation of a source code.

What is AST expression?

The AST expressions are conceptually divided into two classes: constructive expressions (those that can be used in parsing rules) and destructive expressions (those that can be used in pretty printing rules).


1 Answers

Check out the aptly named Sarcasm project for a reference implementation of a grammar, parser, and AST built on Irony. I found this blog entry by the author to be helpful in building the AST.

The following is a general purpose guide to getting the AST up and running.

  1. Define your grammar (example)
  2. Create an abstract base class (MyBaseNode) deriving from AstNode (example). Copy/Paste the methods from the example
  3. For each terminal and non-terminal create a new class derived from MyBaseNode and

    1. Override Accept method (example):

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

    1. Override Init (mostly on terminals) or InitChildren (non-terminals) as appropriate. This is where the AST magic happens.
  4. Add an interface IMyNodeVisitor and add a Visit method for each class defined in the previous step (example):

    void Visit(MyDerivedNode1 node);

  5. Set the ASTNodeType for each of your terminals and non-terminals in your grammar from step 1.

    1. For terminals - (example)

      MyTerminal1.AstConfig.NodeType = typeof(MyDerivedNode1);

    2. For non-terminals - (example)

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

  6. In the grammar enable AST creation: (example)

    LanguageFlags = LanguageFlags.CreateAst;

like image 65
Jay Walker Avatar answered Oct 02 '22 09:10

Jay Walker