diff --git a/lib/parser/basic_types.rb b/lib/parser/basic_types.rb index 9e86039..9379754 100644 --- a/lib/parser/basic_types.rb +++ b/lib/parser/basic_types.rb @@ -36,7 +36,7 @@ module Parser rule(:digit) { match('[0-9]') } rule(:exponent) { (str('e')| str('E')) } - rule(:type) { (str("int") | str("ref")).as(:type) >> space } + rule(:type) { (str("int") | class_name).as(:type) >> space } # identifier must start with lower case # TODO rule forbit names like true_statements, because it starts with a keyword. a little looser please! rule(:name) { (keyword|type).absent? >> (match['a-z_'] >> match['a-zA-Z0-9_'].repeat).as(:name) >> space? } diff --git a/lib/parser/transform.rb b/lib/parser/transform.rb index 119a81b..3489dcf 100644 --- a/lib/parser/transform.rb +++ b/lib/parser/transform.rb @@ -1,7 +1,17 @@ #include is private in 1.9, who'd have known without travis Parslet::Context.send :include , AST::Sexp - +Parslet::Context.class_eval do + def type_sym t + if( t.is_a? AST::Node ) + t = t.children.first + else + t = t.to_sym + t = :Integer if t == :int + end + t + end +end module Parser class Transform < Parslet::Transform @@ -15,14 +25,14 @@ module Parser rule(:integer => simple(:value)) { s(:int ,value.to_i) } rule(:name => simple(:name)) { s(:name , name.to_sym) } # local variables - rule(:type => simple(:type), :name => simple(:name)) { s(:field_def , type.to_sym , name.to_sym) } + rule(:type => simple(:type), :name => simple(:name)) { s(:field_def , type_sym(type) , name.to_sym) } rule(:type => simple(:type), :name => simple(:name) , :value => simple(:value)) { - s(:field_def , type.to_sym , name.to_sym , value ) } + s(:field_def , type_sym(type) , name.to_sym , value ) } # class field rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name)) { - s(:class_field , type.to_sym , name.to_sym) } + s(:class_field , type_sym(type) , name.to_sym) } rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name) , :value => simple(:value)) { - s(:class_field , type.to_sym , name.to_sym , value ) } + s(:class_field , type_sym(type) , name.to_sym , value ) } rule(:l_value => simple(:l_value) , :assign => simple(:assign) , :r_value => simple(:r_value)) { s(:assignment , l_value , r_value) @@ -82,7 +92,7 @@ module Parser :function_name => simple(:function_name), :parameter_list => sequence(:parameter_list), :statements => sequence(:statements) , :end => simple(:e)) do - s(:function, type.to_sym , function_name, s(:parameters , *parameter_list ), + s(:function, type_sym(type) , function_name, s(:parameters , *parameter_list ), s(:statements , *statements)) end @@ -91,7 +101,7 @@ module Parser :function_name => simple(:function_name), :parameter_list => sequence(:parameter_list), :statements => sequence(:statements) , :end => simple(:e)) do - s(:function, type.to_sym , function_name, s(:parameters , *parameter_list ), + s(:function, type_sym(type) , function_name, s(:parameters , *parameter_list ), s(:statements , *statements) , s(:receiver , *receiver)) end diff --git a/test/cases/class_definition/big_class.tst b/test/cases/class_definition/big_class.tst index 9d62a17..bce4ce9 100644 --- a/test/cases/class_definition/big_class.tst +++ b/test/cases/class_definition/big_class.tst @@ -1,6 +1,6 @@ class String - ref self.new_string(int len ) + String self.new_string(int len ) len = len << 2 return super.new_object( len) end @@ -9,7 +9,7 @@ class String return self.length end - int plus(ref str) + int plus(String str) my_length = self.length str_len = str.length() my_length = str_len + my_length @@ -36,10 +36,10 @@ s(:statements, s(:class, :String, s(:derives, nil), s(:statements, - s(:function, :ref, + s(:function, :String, s(:name, :new_string), s(:parameters, - s(:parameter, :int, :len)), + s(:parameter, :Integer, :len)), s(:statements, s(:assignment, s(:name, :len), @@ -54,7 +54,7 @@ s(:statements, s(:receiver, s(:name, :super))))), s(:receiver, :self)), - s(:function, :int, + s(:function, :Integer, s(:name, :length), s(:parameters), s(:statements, @@ -64,10 +64,10 @@ s(:statements, s(:name, :self)), s(:field, s(:name, :length)))))), - s(:function, :int, + s(:function, :Integer, s(:name, :plus), s(:parameters, - s(:parameter, :ref, :str)), + s(:parameter, :String, :str)), s(:statements, s(:assignment, s(:name, :my_length), diff --git a/test/cases/class_definition/class_derived.tst b/test/cases/class_definition/class_derived.tst index 10a2b73..872f6b2 100644 --- a/test/cases/class_definition/class_derived.tst +++ b/test/cases/class_definition/class_derived.tst @@ -9,9 +9,9 @@ s(:statements, s(:class, :Foo, s(:derives, :Object), s(:statements, - s(:class_field, :int, :fff, + s(:class_field, :Integer, :fff, s(:int, 3)), - s(:function, :int, + s(:function, :Integer, s(:name, :func), s(:parameters), s(:statements, diff --git a/test/cases/class_definition/class_function.tst b/test/cases/class_definition/class_function.tst index 03c55a4..4e96db5 100644 --- a/test/cases/class_definition/class_function.tst +++ b/test/cases/class_definition/class_function.tst @@ -1,6 +1,6 @@ class Pifi - int self.ofthen(int n , ref m) + int self.ofthen(int n , Object m) n = n + m.index return n end @@ -10,11 +10,11 @@ s(:statements, s(:class, :Pifi, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :ofthen), s(:parameters, - s(:parameter, :int, :n), - s(:parameter, :ref, :m)), + s(:parameter, :Integer, :n), + s(:parameter, :Object, :m)), s(:statements, s(:assignment, s(:name, :n), diff --git a/test/cases/class_definition/class_if.tst b/test/cases/class_definition/class_if.tst index 9d2a067..5f3c622 100644 --- a/test/cases/class_definition/class_if.tst +++ b/test/cases/class_definition/class_if.tst @@ -12,10 +12,10 @@ s(:statements, s(:class, :Ifi, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :ofthen), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:if_statement, s(:condition, diff --git a/test/cases/class_definition/class_method.tst b/test/cases/class_definition/class_method.tst index ab3a38d..e5fcb85 100644 --- a/test/cases/class_definition/class_method.tst +++ b/test/cases/class_definition/class_method.tst @@ -8,7 +8,7 @@ s(:statements, s(:class, :Foo, s(:derives, :Object), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :test), s(:parameters), s(:statements, diff --git a/test/cases/class_definition/class_ops.tst b/test/cases/class_definition/class_ops.tst index 0880e8d..cb73998 100644 --- a/test/cases/class_definition/class_ops.tst +++ b/test/cases/class_definition/class_ops.tst @@ -9,12 +9,12 @@ s(:statements, s(:class, :Opers, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :int, :x)), + s(:parameter, :Integer, :x)), s(:statements, - s(:field_def, :int, :abba, + s(:field_def, :Integer, :abba, s(:int, 5)), s(:return, s(:operator_value, :+, diff --git a/test/cases/class_definition/simplest_class.tst b/test/cases/class_definition/simplest_class.tst index 38c5249..ead2bba 100644 --- a/test/cases/class_definition/simplest_class.tst +++ b/test/cases/class_definition/simplest_class.tst @@ -6,4 +6,4 @@ s(:statements, s(:class, :Foo, s(:derives, nil), s(:statements, - s(:class_field, :int, :x)))) + s(:class_field, :Integer, :x)))) diff --git a/test/cases/function_definition/class_function.tst b/test/cases/function_definition/class_function.tst index 7d7c0fc..d1350fe 100644 --- a/test/cases/function_definition/class_function.tst +++ b/test/cases/function_definition/class_function.tst @@ -1,12 +1,12 @@ -int self.length( ref x ) +int self.length( Object x ) return 5 end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :length), s(:parameters, - s(:parameter, :ref, :x)), + s(:parameter, :Object, :x)), s(:statements, s(:return, s(:int, 5))), diff --git a/test/cases/function_definition/function_big_while.tst b/test/cases/function_definition/function_big_while.tst index de2118f..0616032 100644 --- a/test/cases/function_definition/function_big_while.tst +++ b/test/cases/function_definition/function_big_while.tst @@ -11,10 +11,10 @@ int fibonaccit(int n) end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :fibonaccit), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:assignment, s(:name, :a), diff --git a/test/cases/function_definition/function_foo2.tst b/test/cases/function_definition/function_foo2.tst index 287a16c..14e66a9 100644 --- a/test/cases/function_definition/function_foo2.tst +++ b/test/cases/function_definition/function_foo2.tst @@ -4,12 +4,12 @@ int foo(int x) end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :int, :x)), + s(:parameter, :Integer, :x)), s(:statements, - s(:field_def, :int, :a, + s(:field_def, :Integer, :a, s(:int, 5)), s(:return, s(:name, :a))))) diff --git a/test/cases/function_definition/function_if.tst b/test/cases/function_definition/function_if.tst index 35ed295..3b37774 100644 --- a/test/cases/function_definition/function_if.tst +++ b/test/cases/function_definition/function_if.tst @@ -1,4 +1,4 @@ -ref ofthen(int n) +int ofthen(int n) if(0) isit = 42 else @@ -7,10 +7,10 @@ ref ofthen(int n) end -- -- -- s(:statements, - s(:function, :ref, + s(:function, :Integer, s(:name, :ofthen), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:if_statement, s(:condition, diff --git a/test/cases/function_definition/function_no_arg.tst b/test/cases/function_definition/function_no_arg.tst index 09b5b12..ac53ac2 100644 --- a/test/cases/function_definition/function_no_arg.tst +++ b/test/cases/function_definition/function_no_arg.tst @@ -3,7 +3,7 @@ int foo() end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters), s(:statements, diff --git a/test/cases/function_definition/function_ops.tst b/test/cases/function_definition/function_ops.tst index 84da084..3bd22b6 100644 --- a/test/cases/function_definition/function_ops.tst +++ b/test/cases/function_definition/function_ops.tst @@ -4,12 +4,12 @@ int foo(int x) end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :int, :x)), + s(:parameter, :Integer, :x)), s(:statements, - s(:field_def, :int, :abba, + s(:field_def, :Integer, :abba, s(:int, 5)), s(:assignment, s(:name, :abba), diff --git a/test/cases/function_definition/function_return.tst b/test/cases/function_definition/function_return.tst index 7fbb76e..ee45b53 100644 --- a/test/cases/function_definition/function_return.tst +++ b/test/cases/function_definition/function_return.tst @@ -1,15 +1,15 @@ -int retvar(ref n) +int retvar(Object n) int i = n.layout return i end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :retvar), s(:parameters, - s(:parameter, :ref, :n)), + s(:parameter, :Object, :n)), s(:statements, - s(:field_def, :int, :i, + s(:field_def, :Integer, :i, s(:field_access, s(:receiver, s(:name, :n)), diff --git a/test/cases/function_definition/function_return_if.tst b/test/cases/function_definition/function_return_if.tst index d518a5c..a11a0ad 100644 --- a/test/cases/function_definition/function_return_if.tst +++ b/test/cases/function_definition/function_return_if.tst @@ -7,10 +7,10 @@ int retvar(int n) end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :retvar), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:if_statement, s(:condition, diff --git a/test/cases/function_definition/function_return_while.tst b/test/cases/function_definition/function_return_while.tst index 941d05a..18edd34 100644 --- a/test/cases/function_definition/function_return_while.tst +++ b/test/cases/function_definition/function_return_while.tst @@ -6,10 +6,10 @@ int retvar(int n ) end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :retvar), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:while_statement, s(:condition, diff --git a/test/cases/function_definition/function_two_args.tst b/test/cases/function_definition/function_two_args.tst index 778ed94..faf55f2 100644 --- a/test/cases/function_definition/function_two_args.tst +++ b/test/cases/function_definition/function_two_args.tst @@ -1,13 +1,13 @@ -int foo( int n ,ref m) +int foo( int n ,String m) return n end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :int, :n), - s(:parameter, :ref, :m)), + s(:parameter, :Integer, :n), + s(:parameter, :String, :m)), s(:statements, s(:return, s(:name, :n))))) diff --git a/test/cases/function_definition/function_while.tst b/test/cases/function_definition/function_while.tst index c90f3fc..d5f042f 100644 --- a/test/cases/function_definition/function_while.tst +++ b/test/cases/function_definition/function_while.tst @@ -1,4 +1,4 @@ -ref fibonaccit(int n) +Biggie fibonaccit(int n) a = 0 while(n) some = 43 @@ -7,10 +7,10 @@ ref fibonaccit(int n) end -- -- -- s(:statements, - s(:function, :ref, + s(:function, :Biggie, s(:name, :fibonaccit), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:assignment, s(:name, :a), diff --git a/test/cases/function_definition/simplest_function.tst b/test/cases/function_definition/simplest_function.tst index 4408c2b..1420166 100644 --- a/test/cases/function_definition/simplest_function.tst +++ b/test/cases/function_definition/simplest_function.tst @@ -1,12 +1,12 @@ -int foo(ref x) +int foo(Class x) a = 1 end -- -- -- s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :ref, :x)), + s(:parameter, :Class, :x)), s(:statements, s(:assignment, s(:name, :a), diff --git a/test/cases/root/class_method.tst b/test/cases/root/class_method.tst index 2846b29..054d8d1 100644 --- a/test/cases/root/class_method.tst +++ b/test/cases/root/class_method.tst @@ -9,7 +9,7 @@ s(:statements, s(:class, :FooBo, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :main), s(:parameters), s(:statements, diff --git a/test/cases/root/double_root.tst b/test/cases/root/double_root.tst index 0d3bfad..57c1bd3 100644 --- a/test/cases/root/double_root.tst +++ b/test/cases/root/double_root.tst @@ -1,10 +1,9 @@ class Object - int foo(ref x) + int foo(String x) a = 5 end end class Other < Object - int foo() foo( 3 ) end @@ -14,10 +13,10 @@ s(:statements, s(:class, :Object, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters, - s(:parameter, :ref, :x)), + s(:parameter, :String, :x)), s(:statements, s(:assignment, s(:name, :a), @@ -25,7 +24,7 @@ s(:statements, s(:class, :Other, s(:derives, :Object), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :foo), s(:parameters), s(:statements, diff --git a/test/cases/root/fibo1.tst b/test/cases/root/fibo1.tst index 6c8eca0..f35d223 100644 --- a/test/cases/root/fibo1.tst +++ b/test/cases/root/fibo1.tst @@ -20,10 +20,10 @@ s(:statements, s(:class, :Object, s(:derives, nil), s(:statements, - s(:function, :int, + s(:function, :Integer, s(:name, :fibonaccit), s(:parameters, - s(:parameter, :int, :n)), + s(:parameter, :Integer, :n)), s(:statements, s(:assignment, s(:name, :a), @@ -57,7 +57,7 @@ s(:statements, s(:operator_value, :-, s(:name, :n), s(:int, 1))))))), - s(:function, :int, + s(:function, :Integer, s(:name, :main), s(:parameters), s(:statements,