From d62e996f7c0c5744bfa0f5a8e51a45e6b3b401b1 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Sun, 2 Apr 2017 12:57:05 +0300 Subject: [PATCH] add send statement --- lib/vool.rb | 4 ++-- lib/vool/compiler.rb | 33 ++++++++++++++++++------- test/vool/test_basic_values.rb | 4 ++++ test/vool/test_send_statement.rb | 41 ++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 test/vool/test_send_statement.rb diff --git a/lib/vool.rb b/lib/vool.rb index a31c4aed..2eaf0f7c 100644 --- a/lib/vool.rb +++ b/lib/vool.rb @@ -4,6 +4,7 @@ module Vool end require_relative "vool/array_statement" +require_relative "vool/assignment_statement" require_relative "vool/basic_values" require_relative "vool/class_statement" require_relative "vool/hash_statement" @@ -13,8 +14,7 @@ require_relative "vool/while_statement" require_relative "vool/if_statement" require_relative "vool/return_statement" require_relative "vool/statements" +require_relative "vool/send_statement" require_relative "vool/operator_expression" -require_relative "vool/call_site_statement" -require_relative "vool/assignment_statement" require_relative "vool/compiler" diff --git a/lib/vool/compiler.rb b/lib/vool/compiler.rb index c5b6b316..b6bd6c2f 100644 --- a/lib/vool/compiler.rb +++ b/lib/vool/compiler.rb @@ -27,6 +27,14 @@ module Vool end #basic Values + def on_self exp + SelfStatement.new + end + + def on_nil expression + NilStatement.new + end + def on_int expression IntegerStatement.new(expression.children.first) end @@ -43,10 +51,6 @@ module Vool FalseStatement.new end - def on_nil expression - NilStatement.new - end - def on_str expression StringStatement.new(expression.children.first) end @@ -80,6 +84,14 @@ module Vool hash end + #Variables + def on_lvasgn expression + puts "EXP #{expression}" + name = expression.children[0] + value = process(expression.children[1]) + LocalAssignment.new(name,value) + end + def on_return statement w = ReturnStatement.new() w.return_value = process(statement.children.first) @@ -132,12 +144,15 @@ module Vool process expression.children.first end - def on_call statement - name_s , arguments , receiver = *statement - w = CallSite.new() - w.name = name_s.children.first + def on_send statement + kids = statement.children.dup + receiver = kids.shift + name = kids.shift + arguments = kids + w = SendStatement.new() + w.receiver = process(receiver) || SelfStatement.new + w.name = name w.arguments = process_all(arguments) - w.receiver = process(receiver) w end diff --git a/test/vool/test_basic_values.rb b/test/vool/test_basic_values.rb index bdd4f452..ac896847 100644 --- a/test/vool/test_basic_values.rb +++ b/test/vool/test_basic_values.rb @@ -3,6 +3,10 @@ require_relative "../helper" module Vool class TestBasicValues < MiniTest::Test + def test_self + lst = Compiler.compile( "self") + assert_equal SelfStatement , lst.class + end def test_nil lst = Compiler.compile( "nil") assert_equal NilStatement , lst.class diff --git a/test/vool/test_send_statement.rb b/test/vool/test_send_statement.rb new file mode 100644 index 00000000..7eef28e2 --- /dev/null +++ b/test/vool/test_send_statement.rb @@ -0,0 +1,41 @@ +require_relative "../helper" + +module Vool + class TestSend < MiniTest::Test + + def test_simple + lst = Compiler.compile( "foo") + assert_equal SendStatement , lst.class + end + def test_simple_name + lst = Compiler.compile( "foo") + assert_equal :foo , lst.name + end + def test_simple_receiver + lst = Compiler.compile( "foo") + assert_equal SelfStatement , lst.receiver.class + end + def test_simple_args + lst = Compiler.compile( "foo") + assert_equal [] , lst.arguments + end + + def test_one_arg + lst = Compiler.compile( "bar(1)") + assert_equal SendStatement , lst.class + end + def test_one_arg_name + lst = Compiler.compile( "bar(1)") + assert_equal :bar , lst.name + end + def test_one_arg_receiver + lst = Compiler.compile( "bar(1)") + assert_equal SelfStatement , lst.receiver.class + end + def test_one_arg_args + lst = Compiler.compile( "bar(1)") + assert_equal 1 , lst.arguments.first.value + end + + end +end