class Praat::Parser
Public Instance Methods
parse(input)
click to toggle source
# File lib/praat_parser.rb, line 4 def parse input output = Praat::Root.new @current_node = output @current_indent = 0 input.each do |item| begin case item.shift when :indent process_indent item when :collection @current_node.add_property "#{item.first}s", create_collection(item.first) @current_node = @current_node.send("#{item.first}s") when :object @current_node << create_object(item.first) @current_node.last.parent = @current_node @current_node = @current_node.last when :property @current_node.add_property(*item) end rescue Exception => ex puts print "item: #{item}\n" print "current node: #{@current_node}\n" raise ex end end output end
Private Instance Methods
create_collection(klass)
click to toggle source
# File lib/praat_parser.rb, line 47 def create_collection klass klass = klass.capitalize << "s" unless Object.const_defined? "Praat::#{klass}" Praat.class_eval "class #{klass} < Praat::MetaCollection; end" end (Praat.const_get "#{klass}").new end
create_object(klass)
click to toggle source
# File lib/praat_parser.rb, line 55 def create_object klass klass = klass.capitalize unless Object.const_defined? "Praat::#{klass}" Praat.class_eval "class #{klass} < Praat::MetaObject; end" end (Praat.const_get "#{klass}").new end
process_indent(item)
click to toggle source
# File lib/praat_parser.rb, line 35 def process_indent item indent = item.first # If the new indent is a backstep if indent < @current_indent # Go back (@current_indent - indent).times do @current_node = @current_node.parent end end @current_indent = item.first end