class Parser::Parser

Public Class Methods

new() click to toggle source
# File lib/amy/parser/parser.rb, line 7
def initialize
   @lexer = Lexer.new
end

Public Instance Methods

parse(file) click to toggle source
# File lib/amy/parser/parser.rb, line 11
def parse(file)
  @lexer.set_input(file)
  parse_tokens(@lexer)
end

Private Instance Methods

parse_defs(lexer) click to toggle source
# File lib/amy/parser/parser.rb, line 30
def parse_defs(lexer)
  defs = Defs.new
  return defs if (lexer.eof?)
  finish = false
  prop   = ""
  value  = ""
  mode   = :normal
  while (not lexer.eof? and not finish)
    token = lexer.next
    if :normal == mode and token.is_ct? then
      set_property defs, prop, value
      finish = true
    elsif :content == mode and token.is_p? and "@end" == token.value then
      mode = :normal
      set_property defs, prop, value
    elsif prop.empty? and token.is_p? then
      prop = token.value
      mode = :content if "@content" == prop
    elsif not prop.empty? and token.is_p? then
      set_property defs, prop, value
      prop = token.value
      value = ""
      mode = :content if "@content" == prop
    elsif not prop.empty? and token.is_s? then
      value << " #{token.value}"
    end
  end
  lexer.next
  defs.method = lexer.next.value
  finish = false
  lexer.next
  while(not lexer.eof? and not finish)
    token = lexer.next
    if ["'", '"'].include?(token.value) then
      finish = true
    else
      defs.url << token.value
    end
  end
  return defs
end
parse_tokens(lexer) click to toggle source
# File lib/amy/parser/parser.rb, line 18
def parse_tokens(lexer)
  defs = []
  while(not lexer.eof?)
    token = lexer.next
    if token.is_ct? then
      _def = parse_defs(lexer)
      defs << _def unless _def.empty?
    end
  end
  return defs
end
set_property(defs, prop, value) click to toggle source
# File lib/amy/parser/parser.rb, line 72
def set_property(defs, prop, value)
  if ("@params" == prop) then
    params = {}
    fields = value.split(" ")
    last_key = ""
    fields.each_with_index do |field, i|
      if (i%2 == 0) then
        last_key = field
      else
        params[last_key] = field
        last_key = ""
      end
    end
    defs.add_prop prop, params
  else
    defs.add_prop prop, value.strip
  end
end