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