From 25a7c3ea68f91d6b0ef6ab286b63a30b21128cb3 Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 12 May 2014 14:24:36 +0300 Subject: [PATCH] fixed fibonacci example --- lib/parser/control.rb | 4 ++-- test/parser/test_function_definition.rb | 21 ++++++++++++++++- test/parser/test_operators.rb | 6 +++++ test/parser/test_root.rb | 20 ++++++++++++++++ test/parser/test_while.rb | 31 +++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 3 deletions(-) diff --git a/lib/parser/control.rb b/lib/parser/control.rb index 40d6a94d..58be133d 100644 --- a/lib/parser/control.rb +++ b/lib/parser/control.rb @@ -4,12 +4,12 @@ module Parser rule(:conditional) do keyword_if >> (( (simple_expression|operator_expression).as(:conditional) ) | - left_parenthesis >> (simple_expression|operator_expression).as(:conditional) >> right_parenthesis) >> + left_parenthesis >> (operator_expression|simple_expression).as(:conditional) >> right_parenthesis) >> newline >> expressions_else.as(:if_true) >> newline >> expressions_end.as(:if_false) end rule(:while_do) do - keyword_while >> left_parenthesis >> (simple_expression|operator_expression).as(:while_cond) >> + keyword_while >> left_parenthesis >> (operator_expression|simple_expression).as(:while_cond) >> right_parenthesis >> keyword_do >> newline >> expressions_end.as(:body) end diff --git a/test/parser/test_function_definition.rb b/test/parser/test_function_definition.rb index ec29428a..70b22dec 100644 --- a/test/parser/test_function_definition.rb +++ b/test/parser/test_function_definition.rb @@ -86,5 +86,24 @@ HERE [Ast::OperatorExpression.new("=", Ast::NameExpression.new("some"),Ast::IntegerExpression.new(43)), Ast::OperatorExpression.new("=", Ast::NameExpression.new("other"),Ast::OperatorExpression.new("*", Ast::NameExpression.new("some"),Ast::IntegerExpression.new(4)))] )] ) @parser = @parser.function_definition - end + end + + def test_function_big_while + @string_input = < 1 ) do + tmp = a + a = b + b = tmp + b + puts(b) + n = n - 1 + end +end +HERE + @parse_output = {:function_name=>{:name=>"fibonaccit"}, :parmeter_list=>[{:parmeter=>{:name=>"n"}}], :expressions=>[{:l=>{:name=>"a"}, :o=>"= ", :r=>{:integer=>"0"}}, {:l=>{:name=>"b"}, :o=>"= ", :r=>{:integer=>"1"}}, {: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"}}}, {:function_call=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"b"}}]}, {:l=>{:name=>"n"}, :o=>"= ", :r=>{:l=>{:name=>"n"}, :o=>"- ", :r=>{:integer=>"1"}}}], :end=>"end"}}], :end=>"end"} + @transform_output = Ast::FunctionExpression.new(:fibonaccit, [Ast::NameExpression.new("n")] , [Ast::OperatorExpression.new("=", Ast::NameExpression.new("a"),Ast::IntegerExpression.new(0)),Ast::OperatorExpression.new("=", Ast::NameExpression.new("b"),Ast::IntegerExpression.new(1)),Ast::WhileExpression.new(Ast::OperatorExpression.new(">", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)), [Ast::OperatorExpression.new("=", Ast::NameExpression.new("tmp"),Ast::NameExpression.new("a")), Ast::OperatorExpression.new("=", Ast::NameExpression.new("a"),Ast::NameExpression.new("b")), Ast::OperatorExpression.new("=", Ast::NameExpression.new("b"),Ast::OperatorExpression.new("+", Ast::NameExpression.new("tmp"),Ast::NameExpression.new("b"))), Ast::FuncallExpression.new("puts", [Ast::NameExpression.new("b")] ), Ast::OperatorExpression.new("=", Ast::NameExpression.new("n"),Ast::OperatorExpression.new("-", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)))] )] ) + @parser = @parser.function_definition + end end \ No newline at end of file diff --git a/test/parser/test_operators.rb b/test/parser/test_operators.rb index fcb35e2e..2019cea5 100644 --- a/test/parser/test_operators.rb +++ b/test/parser/test_operators.rb @@ -22,6 +22,12 @@ class TestExpressions < MiniTest::Test def test_simple_minus simple_op "-" end + def test_simple_greater + simple_op ">" + end + def test_simple_smaller + simple_op "<" + end def test_op_variable @string_input = "a + 35" @parse_output = {:l=>{:name=>"a"}, :o=>"+ ", :r=>{:integer=>"35"}} diff --git a/test/parser/test_root.rb b/test/parser/test_root.rb index 5fd5593f..332d9747 100644 --- a/test/parser/test_root.rb +++ b/test/parser/test_root.rb @@ -23,6 +23,26 @@ HERE end + def test_fibo1 + @string_input = < 1 ) do + tmp = a + a = b + b = tmp + b + puts(b) + n = n - 1 + end +end + +fibonaccit( 10 ) +HERE + @parse_output = [{:function_name=>{:name=>"fibonaccit"}, :parmeter_list=>[{:parmeter=>{:name=>"n"}}], :expressions=>[{:l=>{:name=>"a"}, :o=>"= ", :r=>{:integer=>"0"}}, {:l=>{:name=>"b"}, :o=>"= ", :r=>{:integer=>"1"}}, {: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"}}}, {:function_call=>{:name=>"puts"}, :argument_list=>[{:argument=>{:name=>"b"}}]}, {:l=>{:name=>"n"}, :o=>"= ", :r=>{:l=>{:name=>"n"}, :o=>"- ", :r=>{:integer=>"1"}}}], :end=>"end"}}], :end=>"end"}, {:function_call=>{:name=>"fibonaccit"}, :argument_list=>[{:argument=>{:integer=>"10"}}]}] + @transform_output = [Ast::FunctionExpression.new(:fibonaccit, [Ast::NameExpression.new("n")] , [Ast::OperatorExpression.new("=", Ast::NameExpression.new("a"),Ast::IntegerExpression.new(0)),Ast::OperatorExpression.new("=", Ast::NameExpression.new("b"),Ast::IntegerExpression.new(1)),Ast::WhileExpression.new(Ast::OperatorExpression.new(">", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)), [Ast::OperatorExpression.new("=", Ast::NameExpression.new("tmp"),Ast::NameExpression.new("a")), Ast::OperatorExpression.new("=", Ast::NameExpression.new("a"),Ast::NameExpression.new("b")), Ast::OperatorExpression.new("=", Ast::NameExpression.new("b"),Ast::OperatorExpression.new("+", Ast::NameExpression.new("tmp"),Ast::NameExpression.new("b"))), Ast::FuncallExpression.new("puts", [Ast::NameExpression.new("b")] ), Ast::OperatorExpression.new("=", Ast::NameExpression.new("n"),Ast::OperatorExpression.new("-", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)))] )] ), Ast::FuncallExpression.new("fibonaccit", [Ast::IntegerExpression.new(10)] )] + end + end diff --git a/test/parser/test_while.rb b/test/parser/test_while.rb index 79c6f227..f8b93e90 100644 --- a/test/parser/test_while.rb +++ b/test/parser/test_while.rb @@ -23,4 +23,35 @@ HERE Ast::FuncallExpression.new("puts", [Ast::NameExpression.new("b")] )] ) @parser = @parser.while_do end + + def test_big_while + @string_input = < 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"}}}, + {:function_call=>{:name=>"puts"}, + :argument_list=>[{:argument=>{:name=>"b"}}]}, + {:l=>{:name=>"n"}, :o=>"= ", :r=>{:l=>{:name=>"n"}, :o=>"- ", :r=>{:integer=>"1"}}}], + :end=>"end"}} + @transform_output = Ast::WhileExpression.new( + Ast::OperatorExpression.new(">", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)), + [Ast::OperatorExpression.new("=", Ast::NameExpression.new("tmp"),Ast::NameExpression.new("a")), + Ast::OperatorExpression.new("=", Ast::NameExpression.new("a"),Ast::NameExpression.new("b")), + Ast::OperatorExpression.new("=", Ast::NameExpression.new("b"),Ast::OperatorExpression.new("+", Ast::NameExpression.new("tmp"), + Ast::NameExpression.new("b"))), Ast::FuncallExpression.new("puts", [Ast::NameExpression.new("b")] ), + Ast::OperatorExpression.new("=", Ast::NameExpression.new("n"),Ast::OperatorExpression.new("-", Ast::NameExpression.new("n"),Ast::IntegerExpression.new(1)))] ) + @parser = @parser.while_do + end end \ No newline at end of file