diff --git a/lib/parser/basic_types.rb b/lib/parser/basic_types.rb index d9d754a..33f2b7e 100644 --- a/lib/parser/basic_types.rb +++ b/lib/parser/basic_types.rb @@ -39,9 +39,9 @@ module Parser rule(:type) { (str("int") | str("ref")).as(:type) >> space } # identifier must start with lower case # TODO rule forbit names like if_true, because it starts with a keyword. a little looser please! - rule(:name) { keyword.absent? >> (match['a-z_'] >> match['a-zA-Z0-9_'].repeat).as(:name) >> space? } + rule(:name) { (keyword|type).absent? >> (match['a-z_'] >> match['a-zA-Z0-9_'].repeat).as(:name) >> space? } # fields have type - rule(:field) { type >> name } + rule(:field) { type >> name >> (assign >> value_expression.as(:value) ).maybe} # and class/module names must start with capital # (admittatly the rule matches constants too, but one step at a time) rule(:module_name) { keyword.absent? >> (match['A-Z'] >> match['a-zA-Z0-9_'].repeat).as(:module_name) >> space? } diff --git a/lib/parser/transform.rb b/lib/parser/transform.rb index 3688ab0..ec4cfab 100644 --- a/lib/parser/transform.rb +++ b/lib/parser/transform.rb @@ -15,6 +15,8 @@ module Parser rule(:integer => simple(:value)) { s(:int ,value.to_i) } rule(:name => simple(:name)) { s(:name , name.to_sym) } rule(:type => simple(:type), :name => simple(:name)) { s(:field_def , type.to_sym , name.to_sym) } + rule(:type => simple(:type), :name => simple(:name) , :value => simple(:value)) { + s(:field_def , type.to_sym , name.to_sym , value ) } rule(:module_name => simple(:module_name)) { s(:module,module_name.to_s) } diff --git a/test/cases/class_def/class_derived.tst b/test/cases/class_def/class_derived.tst index 6331f4d..fedd805 100644 --- a/test/cases/class_def/class_derived.tst +++ b/test/cases/class_def/class_derived.tst @@ -9,9 +9,7 @@ end s(:expressions, s(:class, :Foo, s(:derives, :Object), - s(:name, :int), - s(:assign, - s(:name, :field), + s(:field_def, :int, :field, s(:int, 3)), s(:function, :int, s(:name, :func), diff --git a/test/cases/class_def/class_ops.tst b/test/cases/class_def/class_ops.tst index c18c831..afc800a 100644 --- a/test/cases/class_def/class_ops.tst +++ b/test/cases/class_def/class_ops.tst @@ -13,9 +13,7 @@ s(:expressions, s(:parameters, s(:parameter, :int, :x)), s(:expressions, - s(:name, :int), - s(:assign, - s(:name, :abba), + s(:field_def, :int, :abba, s(:int, 5)), s(:operator, "+", s(:name, :abba), diff --git a/test/cases/function_definition/function_ops.tst b/test/cases/function_definition/function_ops.tst index ceab819..15d6b78 100644 --- a/test/cases/function_definition/function_ops.tst +++ b/test/cases/function_definition/function_ops.tst @@ -9,9 +9,7 @@ s(:expressions, s(:parameters, s(:parameter, :int, :x)), s(:expressions, - s(:name, :int), - s(:assign, - s(:name, :abba), + s(:field_def, :int, :abba, s(:int, 5)), s(:operator, "+", s(:name, :abba), diff --git a/test/cases/function_definition/function_return.tst b/test/cases/function_definition/function_return.tst index f4107c0..6481d19 100644 --- a/test/cases/function_definition/function_return.tst +++ b/test/cases/function_definition/function_return.tst @@ -9,9 +9,7 @@ s(:expressions, s(:parameters, s(:parameter, :ref, :n)), s(:expressions, - s(:name, :int), - s(:assign, - s(:name, :i), + s(:field_def, :int, :i, s(:field_access, s(:receiver, s(:name, :n)), diff --git a/test/cases/module_def/module_ops.tst b/test/cases/module_def/module_ops.tst index ea4e4a7..fa79b14 100644 --- a/test/cases/module_def/module_ops.tst +++ b/test/cases/module_def/module_ops.tst @@ -1,6 +1,6 @@ module Opers int foo(int x) - int abba = x + self.index + int abba = self.index return abba + 5 end end @@ -12,16 +12,12 @@ s(:expressions, s(:parameters, s(:parameter, :int, :x)), s(:expressions, - s(:name, :int), - s(:assign, - s(:name, :abba), - s(:operator, "+", - s(:name, :x), - s(:field_access, - s(:receiver, - s(:name, :self)), - s(:field, - s(:name, :index))))), + s(:field_def, :int, :abba, + s(:field_access, + s(:receiver, + s(:name, :self)), + s(:field, + s(:name, :index)))), s(:return, s(:operator, "+", s(:name, :abba), diff --git a/test/cases/root/module_method.tst b/test/cases/root/module_method.tst index b9bfed2..1e67132 100644 --- a/test/cases/root/module_method.tst +++ b/test/cases/root/module_method.tst @@ -15,9 +15,7 @@ s(:expressions, s(:parameters, s(:parameter, :int, :n)), s(:expressions, - s(:name, :int), - s(:assign, - s(:name, :a), + s(:field_def, :int, :a, s(:int, 0)), s(:return, s(:name, :a)))),