Module: Purple

Defined in:
lib/purple/infix.rb,
lib/purple/sexp_vm.rb,
lib/purple/syntax_nodes.rb

Defined Under Namespace

Modules: Infix Classes: SexpVM

Constant Summary collapse

Program =
node_def -> { [:program] + elements.map { |e| e.to_a } }
Statement =
node_def -> { elements.map { |e| e.to_a } }
NilLiteral =
node_def -> { [:nil] }
TrueLiteral =
node_def -> { [:true] }
FalseLiteral =
node_def -> { [:false] }
IntegerLiteral =
node_def -> { [:int, text_value.to_i] }
Assignment =
node_def -> { [:assign, elements.first.to_a, elements.last.to_a ] }
InfixExpression =
node_def -> {
  unordered = elements.first.elements.map { |e| e.to_a } << elements.last.to_a
  Purple::Infix.process_infix unordered
}
InfixOperationChain =
node_def -> { elements.map { |e| e.to_a } }
AssignmentOperator =
node_def -> { }
AdditionOperator =
node_def -> { :+ }
SubtractionOperator =
node_def -> { :- }
MultiplicationOperator =
node_def -> { :* }
DivisionOperator =
node_def -> { :/ }
Identifier =
node_def -> { [:ident, text_value] }
Expression =
node_def -> {
  # TODO: fix this shit
  if elements.first.class == InfixExpression
    elements.first.to_a
  else
    elements.map { |e| e.to_a }
  end
}

Class Method Summary collapse

Class Method Details

.node_def(to_ast) ⇒ Object

given a proc which generates ast for a node, create a subclass of Treetop::Runtime::SyntaxNode for it.

e.g., these two are equivalent:

IntegerLiteral = node_def -> { [:int, text_value.to_i] }

class FalseLiteral < Treetop::Runtime::SyntaxNode
  def to_a
    [:int, text_value.to_i]
  end
end


16
17
18
19
20
21
22
23
# File 'lib/purple/syntax_nodes.rb', line 16

def self.node_def(to_ast)
  klass = Class.new(Treetop::Runtime::SyntaxNode) do
    @to_a_proc = to_ast
    def to_a
      self.instance_exec(&self.class.instance_variable_get(:@to_a_proc))
    end
  end
end