lib/starlark_compiler/ast.rb in starlark_compiler-0.3.0 vs lib/starlark_compiler/ast.rb in starlark_compiler-0.4.0
- old
+ new
@@ -44,10 +44,12 @@
def self.build(&blk)
Builder.new.instance_exec(&blk)
end
class Node
+ TYPE = :Expression
+
%i[- + / * % == < <= >= >].each do |op|
define_method(op) { |rhs| BinaryOperator.new(self, rhs, operator: op) }
end
# TODO: ==, eql?, hash
@@ -71,11 +73,11 @@
when FalseClass
False.new
when Numeric
Number.new(obj)
else
- raise Error, "#{obj.inspect} not convertible to Node"
+ raise Error, "Ruby stdlib type #{obj.inspect} not convertible to Node"
end
end
end
class None < Node
@@ -99,13 +101,37 @@
def initialize(str)
@str = str
end
end
+ class VariableReference < Node
+ attr_reader :var
+ def initialize(var)
+ unless var.is_a?(::String)
+ raise "Variable Reference must be a string, not #{var.class}"
+ end
+
+ @var = var
+ end
+ end
+
class Array < Node
attr_reader :elements
def initialize(elements)
@elements = elements.map(&method(:node))
+ end
+ end
+
+ class VariableAssignment < Node
+ TYPE = :Statement
+ attr_reader :name, :var
+ def initialize(name, var)
+ @name = name
+ if node(var).class::TYPE != :Expression
+ raise "Unsupported type on rhs for assignment: #{var.class}"
+ end
+
+ @var = node(var)
end
end
class FunctionCall < Node
attr_reader :name, :args, :kwargs