grammar Function include Statement rule more_typed_args (comma typed_arg )* { captures(:typed_arg).collect{|u| u.value } } end rule typed_argument_list (left_parenthesis typed_arg? more_typed_args right_parenthesis){ args = [ ] args << capture(:typed_arg).value if capture(:typed_arg) args += capture(:more_typed_args).value if capture(:more_typed_args) args } end rule call_site (basic_expression "." name_expression argument_list space?) { Ast::CallSiteExpression.new(capture(:name_expression).to_str , capture(:argument_list).value , capture(:basic_expression).value ) } end rule function_definition keyword_def name:function_name parameter_list newline expressions_end newline end rule parameter_list left_parenthesis parameter_list:( name:parameter? (comma name:parameter)* ) right_parenthesis end root call_site end