add derivation possibility to class definition
This commit is contained in:
@ -24,7 +24,7 @@ module Ast
|
||||
@name = name.to_sym
|
||||
end
|
||||
def inspect
|
||||
"#{self.class.name}.new(#{name})"
|
||||
"#{self.class.name}.new(#{name.inspect})"
|
||||
end
|
||||
def to_s
|
||||
name.to_s
|
||||
|
@ -20,5 +20,22 @@ module Ast
|
||||
|
||||
class ClassExpression < ModuleExpression
|
||||
|
||||
def initialize name , derived , expressions
|
||||
super(name , expressions)
|
||||
@derived_from = derived
|
||||
end
|
||||
def inspect
|
||||
self.class.name + ".new(" + @name.inspect + " ," +
|
||||
@derived_from.inspect + ", " + @expressions.inspect + " )"
|
||||
end
|
||||
def derived_from
|
||||
@derived_from ? @derived_from : :Object
|
||||
end
|
||||
def to_s
|
||||
s = "class #{name} < #{derived_from}\n #{expressions}\nend\n"
|
||||
end
|
||||
def attributes
|
||||
[:name , :derived_from , :expressions]
|
||||
end
|
||||
end
|
||||
end
|
@ -7,7 +7,7 @@ module Parser
|
||||
end
|
||||
|
||||
rule(:class_definition) do
|
||||
keyword_class >> module_name >> eol >>
|
||||
keyword_class >> module_name >> (smaller >> module_name).maybe.as(:derived_name) >> eol >>
|
||||
( (keyword_end.absent? >> root_body).repeat()).as(:class_expressions) >> keyword_end >> newline
|
||||
end
|
||||
|
||||
|
@ -72,8 +72,8 @@ module Parser
|
||||
rule( :module_name => simple(:module_name) , :module_expressions => sequence(:module_expressions) , :end=>"end") do
|
||||
Ast::ModuleExpression.new(module_name , module_expressions)
|
||||
end
|
||||
rule( :module_name => simple(:module_name) , :class_expressions => sequence(:class_expressions) , :end=>"end") do
|
||||
Ast::ClassExpression.new(module_name , class_expressions)
|
||||
rule( :module_name => simple(:module_name) , :derived_name => simple(:derived_name) , :class_expressions => sequence(:class_expressions) , :end=>"end") do
|
||||
Ast::ClassExpression.new(module_name , derived_name ? derived_name.name : nil , class_expressions)
|
||||
end
|
||||
|
||||
#shortcut to get the ast tree for a given string
|
||||
|
Reference in New Issue
Block a user