define modules and tests, no compiling

This commit is contained in:
Torsten Ruger
2014-05-29 15:57:33 +03:00
parent d59370bdc7
commit c69a44f316
9 changed files with 131 additions and 16 deletions

View File

@ -9,7 +9,7 @@
module Ast
class Expression
def eval
def compile context , into
raise "abstract #{self}"
end
def compile context , into
@ -22,7 +22,7 @@ module Ast
return false unless other.class == self.class
attributes.each do |a|
left = send(a)
right = other.send( a)
right = other.send(a)
return false unless left.class == right.class
return false unless left == right
end
@ -33,10 +33,11 @@ module Ast
end
require_relative "basic_expressions"
require_relative "call_site_expression"
require_relative "compound_expressions"
require_relative "if_expression"
require_relative "while_expression"
require_relative "return_expression"
require_relative "function_expression"
require_relative "module_expression"
require_relative "operator_expressions"
require_relative "call_site_expression"
require_relative "return_expression"
require_relative "while_expression"

View File

@ -0,0 +1,34 @@
module Ast
class ModuleExpression < Expression
attr_reader :name ,:expressions
def initialize name , expressions
@name = name.to_sym
@expressions = expressions
end
def inspect
self.class.name + ".new(" + @name.inspect + " ," + @expressions.inspect + " )"
end
def to_s
"module #{name}\n #{expressions}\nend\n"
end
def attributes
[:name , :expressions]
end
def compile context , into
expression_value = expression.compile(context , into)
puts "compiled return expression #{expression_value.inspect}, now return in 7"
# copied from function expression: TODO make function
return_reg = Vm::Integer.new(7)
if expression_value.is_a?(Vm::IntegerConstant) or expression_value.is_a?(Vm::StringConstant)
return_reg.load into , expression_value if expression_value.register != return_reg.register
else
return_reg.move( into, expression_value ) if expression_value.register != return_reg.register
end
#function.set_return return_reg
return return_reg
end
end
end

View File

@ -6,6 +6,7 @@ require_relative "control"
require_relative "expression"
require_relative "call_site"
require_relative "function_definition"
require_relative "module_def"
require_relative "operators"
module Parser
@ -28,7 +29,8 @@ module Parser
include CallSite
include FunctionDefinition
include Operators
include ModuleDef
rule(:root){ (function_definition | expression | call_site | space).repeat }
rule(:root){ (function_definition | expression | call_site ).repeat }
end
end

View File

@ -3,6 +3,7 @@ module Parser
include Parslet
rule(:keyword_begin) { str('begin').as(:begin) >> space?}
rule(:keyword_class) { str('class') >> space? }
rule(:keyword_def) { str('def') >> space? }
rule(:keyword_do) { str('do').as(:do) >> space?}
rule(:keyword_else) { str('else').as(:else) >> space? }
@ -12,6 +13,7 @@ module Parser
rule(:keyword_rescue) { str('rescue').as(:rescue) >> space?}
rule(:keyword_return) { str('return').as(:return) >> space?}
rule(:keyword_true) { str('true').as(:true) >> space?}
rule(:keyword_module) { str('module') >> space? }
rule(:keyword_nil) { str('nil').as(:nil) >> space?}
rule(:keyword_unless) { str('unless').as(:unless) >> space?}
rule(:keyword_until) { str('until').as(:until) >> space?}

9
lib/parser/module_def.rb Normal file
View File

@ -0,0 +1,9 @@
module Parser
module ModuleDef
include Parslet
rule(:module_def) do
keyword_module >> name >> eol >>
( (keyword_end.absent? >> root).repeat(1)).as(:module_expressions) >> keyword_end >> newline
end
end
end

View File

@ -53,6 +53,10 @@ module Parser
Ast::OperatorExpression.new( o.to_s.strip , l ,r)
end
rule( :name => simple(:name) , :module_expressions => sequence(:module_expressions) , :end=>"end") do
Ast::ModuleExpression.new(name , module_expressions)
end
#shortcut to get the ast tree for a given string
# optional second arguement specifies a rule that will be parsed (mainly for testing)
def self.ast string , rule = :root