fix field default values

This commit is contained in:
Torsten Ruger 2015-09-20 14:43:08 +03:00
parent d0b950eed9
commit c331bdd80a
8 changed files with 16 additions and 28 deletions

View File

@ -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? }

View File

@ -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) }

View File

@ -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),

View File

@ -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),

View File

@ -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),

View File

@ -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)),

View File

@ -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),

View File

@ -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)))),