From 3651856fc5032be80fdc8c2d73e315a5112918cc Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Fri, 9 Oct 2015 17:32:05 +0300 Subject: [PATCH] fix class defs --- lib/parser/class_definition.rb | 9 ++- test/cases/class_definition/big_class.tst | 56 +++++++++---------- test/cases/class_definition/class_derived.tst | 14 ++--- .../cases/class_definition/class_function.tst | 16 ++---- test/cases/class_definition/class_if.tst | 16 +++--- test/cases/class_definition/class_method.tst | 11 ++-- test/cases/class_definition/class_ops.tst | 15 ++--- .../cases/class_definition/simplest_class.tst | 8 +-- test/cases/root/module_method.tst | 21 ------- 9 files changed, 70 insertions(+), 96 deletions(-) delete mode 100644 test/cases/root/module_method.tst diff --git a/lib/parser/class_definition.rb b/lib/parser/class_definition.rb index d862c26..1e7cff0 100644 --- a/lib/parser/class_definition.rb +++ b/lib/parser/class_definition.rb @@ -2,9 +2,14 @@ module Parser module ModuleDef include Parslet + rule(:class_field) { keyword_field >> field_def } + + rule(:class_body) { + function_definition | class_field + } rule(:class_definition) do - keyword_class >> class_name >> (smaller >> class_name).maybe.as(:derived_name) >> - ( (keyword_end.absent? >> root_body).repeat()).as(:class_expressions) >> keyword_end + keyword_class >> class_name >> (str("<") >> space >> class_name).maybe.as(:derived_name) >> + ( (keyword_end.absent? >> class_body).repeat()).as(:class_statements) >> keyword_end end end diff --git a/test/cases/class_definition/big_class.tst b/test/cases/class_definition/big_class.tst index 1b8d024..9d62a17 100644 --- a/test/cases/class_definition/big_class.tst +++ b/test/cases/class_definition/big_class.tst @@ -32,18 +32,18 @@ class String end -- -- -- -s(:expressions, +s(:statements, s(:class, :String, s(:derives, nil), - s(:expressions, + s(:statements, s(:function, :ref, s(:name, :new_string), s(:parameters, s(:parameter, :int, :len)), - s(:expressions, - s(:assign, + s(:statements, + s(:assignment, s(:name, :len), - s(:operator, "<<", + s(:operator_value, :<<, s(:name, :len), s(:int, 2))), s(:return, @@ -57,7 +57,7 @@ s(:expressions, s(:function, :int, s(:name, :length), s(:parameters), - s(:expressions, + s(:statements, s(:return, s(:field_access, s(:receiver, @@ -68,27 +68,27 @@ s(:expressions, s(:name, :plus), s(:parameters, s(:parameter, :ref, :str)), - s(:expressions, - s(:assign, + s(:statements, + s(:assignment, s(:name, :my_length), s(:field_access, s(:receiver, s(:name, :self)), s(:field, s(:name, :length)))), - s(:assign, + s(:assignment, s(:name, :str_len), s(:call, s(:name, :length), s(:arguments), s(:receiver, s(:name, :str)))), - s(:assign, + s(:assignment, s(:name, :my_length), - s(:operator, "+", + s(:operator_value, :+, s(:name, :str_len), s(:name, :my_length))), - s(:assign, + s(:assignment, s(:name, :new_string), s(:call, s(:name, :new_string), @@ -96,16 +96,16 @@ s(:expressions, s(:name, :my_length)), s(:receiver, s(:name, :self)))), - s(:assign, + s(:assignment, s(:name, :i), s(:int, 0)), - s(:while, + s(:while_statement, s(:condition, - s(:operator, "<", + s(:operator_value, :<, s(:name, :i), s(:name, :my_length))), - s(:expressions, - s(:assign, + s(:statements, + s(:assignment, s(:name, :char), s(:call, s(:name, :get), @@ -118,21 +118,21 @@ s(:expressions, s(:name, :char)), s(:receiver, s(:name, :new_string))), - s(:assign, + s(:assignment, s(:name, :i), - s(:operator, "+", + s(:operator_value, :+, s(:name, :i), s(:int, 1))))), - s(:assign, + s(:assignment, s(:name, :i), s(:int, 0)), - s(:while, + s(:while_statement, s(:condition, - s(:operator, "<", + s(:operator_value, :<, s(:name, :i), s(:name, :str_len))), - s(:expressions, - s(:assign, + s(:statements, + s(:assignment, s(:name, :char), s(:call, s(:name, :get), @@ -140,9 +140,9 @@ s(:expressions, s(:name, :i)), s(:receiver, s(:name, :str)))), - s(:assign, + s(:assignment, s(:name, :len), - s(:operator, "+", + s(:operator_value, :+, s(:name, :i), s(:name, :my_length))), s(:call, @@ -152,9 +152,9 @@ s(:expressions, s(:name, :char)), s(:receiver, s(:name, :new_string))), - s(:assign, + s(:assignment, s(:name, :i), - s(:operator, "+", + s(:operator_value, :+, s(:name, :i), s(:int, 1))))), s(:return, diff --git a/test/cases/class_definition/class_derived.tst b/test/cases/class_definition/class_derived.tst index a650c7e..10a2b73 100644 --- a/test/cases/class_definition/class_derived.tst +++ b/test/cases/class_definition/class_derived.tst @@ -3,27 +3,21 @@ class Foo < Object int func() return self.fff end - ofthen(3 , var) end -- -- -- -s(:expressions, +s(:statements, s(:class, :Foo, s(:derives, :Object), - s(:expressions, + s(:statements, s(:class_field, :int, :fff, s(:int, 3)), s(:function, :int, s(:name, :func), s(:parameters), - s(:expressions, + s(:statements, s(:return, s(:field_access, s(:receiver, s(:name, :self)), s(:field, - s(:name, :fff)))))), - s(:call, - s(:name, :ofthen), - s(:arguments, - s(:int, 3), - s(:name, :var)))))) + s(:name, :fff))))))))) diff --git a/test/cases/class_definition/class_function.tst b/test/cases/class_definition/class_function.tst index 0a4732e..03c55a4 100644 --- a/test/cases/class_definition/class_function.tst +++ b/test/cases/class_definition/class_function.tst @@ -1,5 +1,4 @@ class Pifi - ofthen(3 , var) int self.ofthen(int n , ref m) n = n + m.index @@ -7,24 +6,19 @@ class Pifi end end -- -- -- -s(:expressions, +s(:statements, s(:class, :Pifi, s(:derives, nil), - s(:expressions, - s(:call, - s(:name, :ofthen), - s(:arguments, - s(:int, 3), - s(:name, :var))), + s(:statements, s(:function, :int, s(:name, :ofthen), s(:parameters, s(:parameter, :int, :n), s(:parameter, :ref, :m)), - s(:expressions, - s(:assign, + s(:statements, + s(:assignment, s(:name, :n), - s(:operator, "+", + s(:operator_value, :+, s(:name, :n), s(:field_access, s(:receiver, diff --git a/test/cases/class_definition/class_if.tst b/test/cases/class_definition/class_if.tst index 76bd86d..9d2a067 100644 --- a/test/cases/class_definition/class_if.tst +++ b/test/cases/class_definition/class_if.tst @@ -8,23 +8,23 @@ class Ifi end end -- -- -- -s(:expressions, +s(:statements, s(:class, :Ifi, s(:derives, nil), - s(:expressions, + s(:statements, s(:function, :int, s(:name, :ofthen), s(:parameters, s(:parameter, :int, :n)), - s(:expressions, - s(:if, + s(:statements, + s(:if_statement, s(:condition, s(:int, 0)), - s(:if_true, - s(:assign, + s(:true_statements, + s(:assignment, s(:name, :isit), s(:int, 42))), - s(:if_false, - s(:assign, + s(:false_statements, + s(:assignment, s(:name, :maybenot), s(:int, 667))))))))) diff --git a/test/cases/class_definition/class_method.tst b/test/cases/class_definition/class_method.tst index 243b8d3..ab3a38d 100644 --- a/test/cases/class_definition/class_method.tst +++ b/test/cases/class_definition/class_method.tst @@ -1,15 +1,16 @@ class Foo < Object int test() - 43 + return 43 end end -- -- -- -s(:expressions, +s(:statements, s(:class, :Foo, s(:derives, :Object), - s(:expressions, + s(:statements, s(:function, :int, s(:name, :test), s(:parameters), - s(:expressions, - s(:int, 43)))))) + s(:statements, + s(:return, + s(:int, 43))))))) diff --git a/test/cases/class_definition/class_ops.tst b/test/cases/class_definition/class_ops.tst index bcae6f7..0880e8d 100644 --- a/test/cases/class_definition/class_ops.tst +++ b/test/cases/class_definition/class_ops.tst @@ -1,21 +1,22 @@ class Opers int foo(int x) int abba = 5 - abba + 5 + return abba + 5 end end -- -- -- -s(:expressions, +s(:statements, s(:class, :Opers, s(:derives, nil), - s(:expressions, + s(:statements, s(:function, :int, s(:name, :foo), s(:parameters, s(:parameter, :int, :x)), - s(:expressions, + s(:statements, s(:field_def, :int, :abba, s(:int, 5)), - s(:operator, "+", - s(:name, :abba), - s(:int, 5))))))) + s(:return, + s(:operator_value, :+, + s(:name, :abba), + s(:int, 5)))))))) diff --git a/test/cases/class_definition/simplest_class.tst b/test/cases/class_definition/simplest_class.tst index f5674e6..38c5249 100644 --- a/test/cases/class_definition/simplest_class.tst +++ b/test/cases/class_definition/simplest_class.tst @@ -1,9 +1,9 @@ class Foo - 5 + field int x end -- -- -- -s(:expressions, +s(:statements, s(:class, :Foo, s(:derives, nil), - s(:expressions, - s(:int, 5)))) + s(:statements, + s(:class_field, :int, :x)))) diff --git a/test/cases/root/module_method.tst b/test/cases/root/module_method.tst deleted file mode 100644 index c44cd95..0000000 --- a/test/cases/root/module_method.tst +++ /dev/null @@ -1,21 +0,0 @@ -class Fibo - int fibonaccit(int n) - int a = 0 - return a - end -end - --- -- -- -s(:expressions, - s(:class, :Fibo, - s(:derives, nil), - s(:expressions, - s(:function, :int, - s(:name, :fibonaccit), - s(:parameters, - s(:parameter, :int, :n)), - s(:expressions, - s(:field_def, :int, :a, - s(:int, 0)), - s(:return, - s(:name, :a)))))))