Module: Furnace::AST::Sexp

Defined in:
lib/furnace/ast/sexp.rb

Overview

This simple module is very useful in the cases where one needs to define deeply nested ASTs from Ruby code, for example, in tests. It should be used like this:

describe YourLanguage::AST do
  include Sexp

  it "should correctly parse expressions" do
    YourLanguage.parse("1 + 2 * 3").should ==
        s(:add,
          s(:integer, 1),
          s(:multiply,
            s(:integer, 2),
            s(:integer, 3)))
  end
end

This way the amount of boilerplate code is greatly reduced.

Instance Method Summary collapse

Instance Method Details

#s(type, *children) ⇒ Object

Creates a Node with type type and children children. Note that the resulting node is of the type AST::Node and not a subclass. This would not pose a problem with comparisons, as Node#== ignores metadata.



26
27
28
# File 'lib/furnace/ast/sexp.rb', line 26

def s(type, *children)
  Node.new(type, children)
end