start on vool, the virtual oo language
start with syntax tree, not linked into existing code until finished
This commit is contained in:
parent
b756d275e4
commit
295782d9e6
@ -13,5 +13,5 @@ require "risc"
|
||||
require "risc/builtin/space"
|
||||
require "arm/arm_machine"
|
||||
require "arm/translator"
|
||||
|
||||
require "rubyx/ruby_compiler"
|
||||
require "vool.rb"
|
||||
|
2
lib/vool.rb
Normal file
2
lib/vool.rb
Normal file
@ -0,0 +1,2 @@
|
||||
require_relative "vool/compiler"
|
||||
require_relative "vool/class_statement"
|
10
lib/vool/class_statement.rb
Normal file
10
lib/vool/class_statement.rb
Normal file
@ -0,0 +1,10 @@
|
||||
module Vool
|
||||
class ClassStatement
|
||||
attr_reader :name, :super_class_name , :body
|
||||
|
||||
def initialize( name , supe , body)
|
||||
@name , @super_class_name , @body = name , supe , body
|
||||
end
|
||||
|
||||
end
|
||||
end
|
23
lib/vool/compiler.rb
Normal file
23
lib/vool/compiler.rb
Normal file
@ -0,0 +1,23 @@
|
||||
module Vool
|
||||
class Compiler < ::Rubyx::Passes::TotalProcessor
|
||||
|
||||
def self.compile(input)
|
||||
ast = Parser::Ruby22.parse( input )
|
||||
self.new.process(ast)
|
||||
end
|
||||
|
||||
def on_class( statement )
|
||||
name , sup , body = *statement
|
||||
ClassStatement.new( get_name(name) , get_name(sup) , body )
|
||||
end
|
||||
|
||||
def get_name( statement )
|
||||
return nil unless statement
|
||||
raise "Not const #{statement}" unless statement.type == :const
|
||||
name = statement.children[1]
|
||||
raise "Not symbol #{name}" unless name.is_a? Symbol
|
||||
name
|
||||
end
|
||||
|
||||
end
|
||||
end
|
1
test/vool/helper.rb
Normal file
1
test/vool/helper.rb
Normal file
@ -0,0 +1 @@
|
||||
require_relative "../helper"
|
24
test/vool/test_class_statement.rb
Normal file
24
test/vool/test_class_statement.rb
Normal file
@ -0,0 +1,24 @@
|
||||
require_relative "../helper"
|
||||
|
||||
module Vool
|
||||
class TestClassStatement < MiniTest::Test
|
||||
|
||||
def setup
|
||||
input = "class Tryout < Base;end"
|
||||
@lst = Compiler.compile( input )
|
||||
end
|
||||
|
||||
def test_compile_class
|
||||
assert_equal ClassStatement , @lst.class
|
||||
end
|
||||
|
||||
def test_compile_class_name
|
||||
assert_equal :Tryout , @lst.name
|
||||
end
|
||||
|
||||
def test_compile_class_super
|
||||
assert_equal :Base , @lst.super_class_name
|
||||
end
|
||||
|
||||
end
|
||||
end
|
2
test/vool/test_compiler.rb
Normal file
2
test/vool/test_compiler.rb
Normal file
@ -0,0 +1,2 @@
|
||||
require_relative "helper"
|
||||
require_relative "test_class_statement"
|
Loading…
Reference in New Issue
Block a user