add return and argument types
This commit is contained in:
@ -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") | 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? }
|
||||
|
@ -3,14 +3,13 @@ module Parser
|
||||
include Parslet
|
||||
|
||||
rule(:function_definition) {
|
||||
keyword_def >> ((module_name|name).as(:receiver) >> str(".")).maybe >> #possibly qualified
|
||||
name.as(:function_name) >> parameter_list.maybe >> space >> expressions_end >> space?
|
||||
type >> ((module_name|name).as(:receiver) >> str(".")).maybe >> #possibly qualified
|
||||
name.as(:function_name) >> left_parenthesis >>
|
||||
parameter_list.maybe >> right_parenthesis >> expressions_end >> space?
|
||||
}
|
||||
|
||||
rule(:parameter_list) {
|
||||
left_parenthesis >>
|
||||
((name.as(:parameter) >> (comma >> name.as(:parameter)).repeat(0)).repeat(0,1)).as(:parameter_list) >>
|
||||
right_parenthesis
|
||||
((field.as(:parameter) >> (comma >> field.as(:parameter)).repeat(0)).repeat(0,1)).as(:parameter_list)
|
||||
}
|
||||
|
||||
end
|
||||
|
@ -4,7 +4,6 @@ module Parser
|
||||
|
||||
rule(:keyword_begin) { str('begin').as(:begin) >> space?}
|
||||
rule(:keyword_class) { str('class') >> space? }
|
||||
rule(:keyword_def) { str('def') >> space? }
|
||||
rule(:keyword_do) { str('do').as(:do) >> space?}
|
||||
rule(:keyword_else) { str('else').as(:else) >> space? }
|
||||
rule(:keyword_end) { str('end').as(:end) >> space? }
|
||||
|
@ -17,6 +17,7 @@ module Parser
|
||||
rule(:integer => simple(:value)) { s(:int ,value.to_i) }
|
||||
rule(:name => simple(:name)) { s(:name , name.to_s) }
|
||||
rule(:type => simple(:type), :name => simple(:name)) { s(:field , type.to_sym , name.to_sym) }
|
||||
|
||||
rule(:module_name => simple(:module_name)) { s(:module,module_name.to_s) }
|
||||
|
||||
rule(:array_constant => sequence(:array_constant) ) { s(:array , array_constant) }
|
||||
@ -63,22 +64,23 @@ module Parser
|
||||
rule(:parameter_list => sequence(:parameter_list)) { parameter_list }
|
||||
|
||||
# Also two rules for function definitions, unqualified and qualified
|
||||
rule(:function_name => simple(:function_name),
|
||||
:parameter_list => sequence(:parameter_list),
|
||||
:expressions => sequence(:expressions) , :end => simple(:e)) do
|
||||
s(:function, function_name, parameter_list, expressions)
|
||||
end
|
||||
|
||||
rule(:function_name => simple(:function_name),
|
||||
:expressions => sequence(:expressions) , :end => simple(:e)) do
|
||||
s(:function , function_name, [], expressions)
|
||||
end
|
||||
|
||||
rule(:receiver=> simple(:receiver),
|
||||
rule(:type => simple(:type) ,
|
||||
:function_name => simple(:function_name),
|
||||
:parameter_list => sequence(:parameter_list),
|
||||
:expressions => sequence(:expressions) , :end => simple(:e)) do
|
||||
s(:function, function_name, parameter_list, expressions , receiver)
|
||||
s(:function, type.to_sym , function_name, parameter_list, expressions)
|
||||
end
|
||||
|
||||
rule(:type => simple(:type) , :function_name => simple(:function_name),
|
||||
:expressions => sequence(:expressions) , :end => simple(:e)) do
|
||||
s(:function , type.to_sym, function_name, [], expressions)
|
||||
end
|
||||
|
||||
rule(:type => simple(:type) , :receiver=> simple(:receiver),
|
||||
:function_name => simple(:function_name),
|
||||
:parameter_list => sequence(:parameter_list),
|
||||
:expressions => sequence(:expressions) , :end => simple(:e)) do
|
||||
s(:function, type.to_sym , function_name, parameter_list, expressions , receiver)
|
||||
end
|
||||
|
||||
rule(l: simple(:l), o: simple(:o) , r: simple(:r)) do
|
||||
|
Reference in New Issue
Block a user