class Yagg::Parser
Constants
- ParseError
Attributes
body[RW]
header[RW]
rules[RW]
token_groups[RW]
tokens[RW]
Public Class Methods
new(text)
click to toggle source
# File lib/yagg/parsery.rb, line 6 def initialize(text) @source = text end
Public Instance Methods
parse()
click to toggle source
# File lib/yagg/parsery.rb, line 55 def parse setup_sections parse_tokens parse_rules end
parse_rule(arr)
click to toggle source
# File lib/yagg/parsery.rb, line 26 def parse_rule(arr) arr = arr[0..-1] name = arr.shift arr.shift groups = [[]] arr.each do |t| if t == '|' groups.push [] else groups.last.push t end end {name => groups} end
parse_rules()
click to toggle source
# File lib/yagg/parsery.rb, line 41 def parse_rules tokens = self.body.scan(/[^'\s]+|'.'/).to_a self.token_groups = [[]] tokens.each do |t| if t != ';' self.token_groups.last << t else self.token_groups << [] end end self.token_groups.pop if self.token_groups.last.empty? self.rules = self.token_groups.inject({}){|a, b| a.update(parse_rule(b))} end
parse_tokens()
click to toggle source
# File lib/yagg/parsery.rb, line 22 def parse_tokens self.tokens = self.header.scan(/^%token(.*)/).flat_map{|x| x.flat_map{|y| y.split(" ")}} end
result()
click to toggle source
# File lib/yagg/parsery.rb, line 10 def result self end
setup_sections()
click to toggle source
# File lib/yagg/parsery.rb, line 14 def setup_sections if @source =~ /([\w\W]*?)^%%\s*([\w\W]*?)^%%\s*/ self.header, self.body, * = $1, $2 else raise ParseError, "can't recognize format" end end