there goes the module

it was ruby after all
should be reborn as twins: namespace and aspect
This commit is contained in:
Torsten Ruger
2015-10-08 22:57:39 +03:00
parent 58b3553251
commit 486e24514b
16 changed files with 25 additions and 202 deletions

View File

@ -44,7 +44,7 @@ module Parser
rule(:field) { type >> name >> (assign >> value_expression.as(:value) ).maybe}
rule(:class_field) { keyword_field >> field }
# and class/module names must start with capital
rule(:module_name) { keyword.absent? >> (match['A-Z'] >> match['a-zA-Z0-9_'].repeat).as(:module_name) >> space? }
rule(:class_name) { keyword.absent? >> (match['A-Z'] >> match['a-zA-Z0-9_'].repeat).as(:class_name) >> space? }
rule(:escape) { str('\\') >> any.as(:esc) }
rule(:string) { quote >> (
@ -56,7 +56,7 @@ module Parser
rule(:float) { integer >> dot >> integer >>
(exponent >> sign.maybe >> digit.repeat(1,3)).maybe >> space?}
rule(:basic_type){ integer | name | string | float | field | module_name |
rule(:basic_type){ integer | name | string | float | field | class_name |
keyword_true | keyword_false | keyword_nil }
end
end

View File

@ -0,0 +1,11 @@
module Parser
module ModuleDef
include Parslet
rule(:class_definition) do
keyword_class >> class_name >> (smaller >> class_name).maybe.as(:derived_name) >>
( (keyword_end.absent? >> root_body).repeat()).as(:class_expressions) >> keyword_end
end
end
end

View File

@ -3,7 +3,7 @@ module Parser
include Parslet
rule(:function_definition) {
type >> ((module_name|name).as(:receiver) >> str(".")).maybe >> #possibly qualified
type >> ((class_name|name).as(:receiver) >> str(".")).maybe >> #possibly qualified
name.as(:function_name) >> left_parenthesis >>
parameter_list.maybe >> right_parenthesis >> expressions_end >> space?
}

View File

@ -1,15 +0,0 @@
module Parser
module ModuleDef
include Parslet
rule(:module_definition) do
keyword_module >> module_name >>
( (keyword_end.absent? >> root_body).repeat()).as(:module_expressions) >> keyword_end
end
rule(:class_definition) do
keyword_class >> module_name >> (smaller >> module_name).maybe.as(:derived_name) >>
( (keyword_end.absent? >> root_body).repeat()).as(:class_expressions) >> keyword_end
end
end
end

View File

@ -6,7 +6,7 @@ require_relative "control"
require_relative "expression"
require_relative "call_site"
require_relative "function_definition"
require_relative "module_definition"
require_relative "class_definition"
require_relative "operators"
module Parser
@ -31,7 +31,7 @@ module Parser
include Operators
include ModuleDef
rule(:root_body) {(module_definition | class_definition | function_definition |
rule(:root_body) {( class_definition | function_definition |
expression | operator_expression | call_site )}
rule(:root) { root_body.repeat.as(:expression_list) }
end

View File

@ -24,7 +24,7 @@ module Parser
rule(:field => simple(:field) , :type => simple(:type), :name => simple(:name) , :value => simple(:value)) {
s(:class_field , type.to_sym , name.to_sym , value ) }
rule(:module_name => simple(:module_name)) { s(:module,module_name.to_s) }
rule(:class_name => simple(:class_name)) { s(:module,class_name.to_s) }
rule(:array_constant => sequence(:array_constant) ) { s(:array , *array_constant) }
rule(:array_element => simple(:array_element)) { array_element }
@ -99,13 +99,13 @@ module Parser
end
#modules and classes are understandibly quite similar Class < Module
rule( :module_name => simple(:module_name) , :derived_name => simple(:derived_name) , :class_expressions => sequence(:class_expressions) , :end=>"end") do
s(:class , module_name.to_s.to_sym ,
rule( :class_name => simple(:class_name) , :derived_name => simple(:derived_name) , :class_expressions => sequence(:class_expressions) , :end=>"end") do
s(:class , class_name.to_s.to_sym ,
s(:derives, derived_name ? derived_name.to_a.first.to_sym : nil) ,
s(:expressions, *class_expressions) )
end
rule( :module_name => simple(:module_name) , :module_expressions => sequence(:module_expressions) , :end=>"end") do
s(:module , module_name.to_s.to_sym , s(:expressions, *module_expressions))
rule( :class_name => simple(:class_name) , :module_expressions => sequence(:module_expressions) , :end=>"end") do
s(:module , class_name.to_s.to_sym , s(:expressions, *module_expressions))
end
rule(:expression_list => sequence(:expression_list)) {