create some block tests and the expression
This commit is contained in:
parent
12fff4de12
commit
42b85dbb4f
26
lib/ast/block_expression.rb
Normal file
26
lib/ast/block_expression.rb
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
module Ast
|
||||||
|
class BlockExpression < Expression
|
||||||
|
attr_reader :call_exp, :args , :body_exp
|
||||||
|
|
||||||
|
def initialize call_exp, args , body_exp
|
||||||
|
@call_exp = call_exp.to_sym
|
||||||
|
@args = args
|
||||||
|
@body_exp = body_exp
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes
|
||||||
|
[:call_exp, :args , :body_exp]
|
||||||
|
end
|
||||||
|
|
||||||
|
def inspect
|
||||||
|
self.class.call_exp + ".new(" + call_exp.inspect + ", ["+
|
||||||
|
args.collect{|m| m.inspect }.join( ",") + "] ," + body_exp.inspect + ")"
|
||||||
|
end
|
||||||
|
def to_s
|
||||||
|
"#{call_exp}(" + args.join(",") + ")"
|
||||||
|
end
|
||||||
|
def attributes
|
||||||
|
[:call_exp , :args , :body_exp]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
33
test/roots/test_block.rb
Normal file
33
test/roots/test_block.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
require_relative "../parser_helper"
|
||||||
|
|
||||||
|
class RootTestBlock < MiniTest::Test
|
||||||
|
# include the magic (setup and parse -> test method translation), see there
|
||||||
|
include ParserHelper
|
||||||
|
|
||||||
|
def pest_block
|
||||||
|
@string_input = <<HERE
|
||||||
|
self.call(1) do |a , b|
|
||||||
|
tmp = a
|
||||||
|
puts(b)
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@parse_output = nil
|
||||||
|
@transform_output = nil
|
||||||
|
@parser = @parser
|
||||||
|
end
|
||||||
|
|
||||||
|
def pest_big_block
|
||||||
|
@string_input = <<HERE
|
||||||
|
self.call( true , false) do | a , b |
|
||||||
|
tmp = a
|
||||||
|
a = b
|
||||||
|
b = tmp + b
|
||||||
|
puts(b)
|
||||||
|
n = n - 1
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@parse_output = {:expression_list=>[{:while=>"while", :while_cond=>{:l=>{:name=>"n"}, :o=>"> ", :r=>{:integer=>"1"}}, :do=>"do", :body=>{:expressions=>[{:l=>{:name=>"tmp"}, :o=>"= ", :r=>{:name=>"a"}}, {:l=>{:name=>"a"}, :o=>"= ", :r=>{:name=>"b"}}, {:l=>{:name=>"b"}, :o=>"= ", :r=>{:l=>{:name=>"tmp"}, :o=>"+ ", :r=>{:name=>"b"}}}, {:call_site=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"b"}}]}, {:l=>{:name=>"n"}, :o=>"= ", :r=>{:l=>{:name=>"n"}, :o=>"- ", :r=>{:integer=>"1"}}}], :end=>"end"}}]}
|
||||||
|
@transform_output = Ast::ExpressionList.new( [Ast::BlockExpression.new(Ast::OperatorExpression.new(">", Ast::NameExpression.new(:n),Ast::IntegerExpression.new(1)), [Ast::AssignmentExpression.new(Ast::NameExpression.new(:tmp),Ast::NameExpression.new(:a)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:a),Ast::NameExpression.new(:b)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:b),Ast::OperatorExpression.new("+", Ast::NameExpression.new(:tmp),Ast::NameExpression.new(:b))), Ast::CallSiteExpression.new(:puts, [Ast::NameExpression.new(:b)] ,Ast::NameExpression.new(:self)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:n),Ast::OperatorExpression.new("-", Ast::NameExpression.new(:n),Ast::IntegerExpression.new(1)))] )])
|
||||||
|
@parser = @parser
|
||||||
|
end
|
||||||
|
end
|
48
test/unit/test_block.rb
Normal file
48
test/unit/test_block.rb
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
require_relative "../parser_helper"
|
||||||
|
|
||||||
|
class TestBlock < MiniTest::Test
|
||||||
|
# include the magic (setup and parse -> test method translation), see there
|
||||||
|
include ParserHelper
|
||||||
|
|
||||||
|
def pest_block
|
||||||
|
@string_input = <<HERE
|
||||||
|
while(1) do
|
||||||
|
tmp = a
|
||||||
|
puts(b)
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@string_input.chop!
|
||||||
|
@parse_output = {:while=>"while", :while_cond=>{:integer=>"1"}, :do=>"do", :body=>{:expressions=>[{:l=>{:name=>"tmp"}, :o=>"= ", :r=>{:name=>"a"}}, {:call_site=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"b"}}]}], :end=>"end"}}
|
||||||
|
@transform_output = Ast::BlockExpression.new(Ast::IntegerExpression.new(1), [Ast::AssignmentExpression.new(Ast::NameExpression.new(:tmp),Ast::NameExpression.new(:a)), Ast::CallSiteExpression.new(:puts, [Ast::NameExpression.new(:b)] ,Ast::NameExpression.new(:self))] )
|
||||||
|
@parser = @parser.block
|
||||||
|
end
|
||||||
|
|
||||||
|
def pest_block_method
|
||||||
|
@string_input = <<HERE
|
||||||
|
while(1) do
|
||||||
|
tmp = String.new()
|
||||||
|
tmp.puts(i)
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@string_input.chop!
|
||||||
|
@parse_output = {:while=>"while", :while_cond=>{:integer=>"1"}, :do=>"do", :body=>{:expressions=>[{:l=>{:name=>"tmp"}, :o=>"= ", :r=>{:receiver=>{:module_name=>"String"}, :call_site=>{:name=>"new"}, :argument_list=>[]}}, {:receiver=>{:name=>"tmp"}, :call_site=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"i"}}]}], :end=>"end"}}
|
||||||
|
@transform_output = Ast::BlockExpression.new(Ast::IntegerExpression.new(1), [Ast::AssignmentExpression.new(Ast::NameExpression.new(:tmp),Ast::CallSiteExpression.new(:new, [] ,Ast::ModuleName.new(:String))), Ast::CallSiteExpression.new(:puts, [Ast::NameExpression.new(:i)] ,Ast::NameExpression.new(:tmp))] )
|
||||||
|
@parser = @parser.block
|
||||||
|
end
|
||||||
|
|
||||||
|
def pest_big_block
|
||||||
|
@string_input = <<HERE
|
||||||
|
while( n > 1) do
|
||||||
|
tmp = a
|
||||||
|
a = b
|
||||||
|
b = tmp + b
|
||||||
|
puts(b)
|
||||||
|
n = n - 1
|
||||||
|
end
|
||||||
|
HERE
|
||||||
|
@string_input.chop!
|
||||||
|
@parse_output = {:while=>"while", :while_cond=>{:l=>{:name=>"n"}, :o=>"> ", :r=>{:integer=>"1"}}, :do=>"do", :body=>{:expressions=>[{:l=>{:name=>"tmp"}, :o=>"= ", :r=>{:name=>"a"}}, {:l=>{:name=>"a"}, :o=>"= ", :r=>{:name=>"b"}}, {:l=>{:name=>"b"}, :o=>"= ", :r=>{:l=>{:name=>"tmp"}, :o=>"+ ", :r=>{:name=>"b"}}}, {:call_site=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"b"}}]}, {:l=>{:name=>"n"}, :o=>"= ", :r=>{:l=>{:name=>"n"}, :o=>"- ", :r=>{:integer=>"1"}}}], :end=>"end"}}
|
||||||
|
@transform_output = Ast::BlockExpression.new(Ast::OperatorExpression.new(">", Ast::NameExpression.new(:n),Ast::IntegerExpression.new(1)), [Ast::AssignmentExpression.new(Ast::NameExpression.new(:tmp),Ast::NameExpression.new(:a)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:a),Ast::NameExpression.new(:b)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:b),Ast::OperatorExpression.new("+", Ast::NameExpression.new(:tmp),Ast::NameExpression.new(:b))), Ast::CallSiteExpression.new(:puts, [Ast::NameExpression.new(:b)] ,Ast::NameExpression.new(:self)), Ast::AssignmentExpression.new(Ast::NameExpression.new(:n),Ast::OperatorExpression.new("-", Ast::NameExpression.new(:n),Ast::IntegerExpression.new(1)))] )
|
||||||
|
@parser = @parser.block
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user