adds logical statements to vool

This commit is contained in:
Torsten Ruger 2017-04-04 18:35:15 +03:00
parent 91fdfb0c1e
commit de8b48975b
5 changed files with 64 additions and 5 deletions

View File

@ -8,15 +8,14 @@ require_relative "vool/assignment_statement"
require_relative "vool/basic_values"
require_relative "vool/class_statement"
require_relative "vool/hash_statement"
require_relative "vool/if_statement"
require_relative "vool/logical_statement"
require_relative "vool/method_statement"
require_relative "vool/while_statement"
require_relative "vool/if_statement"
require_relative "vool/return_statement"
require_relative "vool/return_statement"
require_relative "vool/statements"
require_relative "vool/send_statement"
require_relative "vool/operator_expression"
require_relative "vool/variables"
require_relative "vool/while_statement"
require_relative "vool/compiler"

View File

@ -155,6 +155,14 @@ module Vool
w
end
def on_and expression
name = expression.type
left = process(expression.children[0])
right = process( expression.children[1] )
LogicalStatement.new( name , left , right)
end
alias :on_or :on_and
# this is a call to super without args (z = zero arity)
def on_zsuper exp
w = SendStatement.new( nil )

View File

@ -0,0 +1,11 @@
module Vool
# Logical Statements are guaranteed to return boolean
# either :and or :or, which may be written as && and ||
class LogicalStatement < Statement
attr_reader :name , :left , :right
def initialize(name , left , right)
@name , @left , @right = name , left , right
end
end
end

View File

@ -4,8 +4,9 @@ require_relative "test_basic_values"
require_relative "test_class_statement"
require_relative "test_hash_statement"
require_relative "test_if_statement"
require_relative "test_logical_statement"
require_relative "test_method_statement"
require_relative "test_send_statement"
require_relative "test_return_statement"
require_relative "test_send_statement"
require_relative "test_variables"
require_relative "test_while_statement"

View File

@ -0,0 +1,40 @@
require_relative "../helper"
module Vool
class TestLogical < MiniTest::Test
def simple
Compiler.compile( "@a and @b")
end
def test_simple
lst = simple
assert_equal LogicalStatement , lst.class
end
def test_simple_name
lst = simple
assert_equal :and , lst.name
end
def test_simple_left
lst = simple
assert_equal InstanceVariable , lst.left.class
end
def test_simple_right
lst = simple
assert_equal InstanceVariable , lst.right.class
end
def test_or
lst = Compiler.compile( "@a or @b")
assert_equal :or , lst.name
end
def test_or2
lst = Compiler.compile( "@a || @b")
assert_equal :or , lst.name
end
def test_and2
lst = Compiler.compile( "@a && @b")
assert_equal :and , lst.name
end
end
end