#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.4.9
# from Racc grammer file "".
#

require 'racc/parser.rb'
module Nagios
  class Parser < Racc::Parser

module_eval(<<'...end grammar.ry/module_eval...', 'grammar.ry', 50)
require 'strscan'

class ::Nagios::Parser::SyntaxError < RuntimeError; end

def parse(src)
  if (RUBY_VERSION < '2.1.0') && src.respond_to?("force_encoding") then
    src.force_encoding("ASCII-8BIT")
  end
  @ss = StringScanner.new(src)

  # state variables
  @in_parameter_value = false
  @in_object_definition = false
  @done = false

  @line = 1
  @yydebug = true

  do_parse
end

# This tokenizes the outside of object definitions,
# and detects when we start defining an object.
# We ignore whitespaces, comments and inline comments.
# We yield when finding newlines, the "define" keyword,
#     the object name and the opening curly bracket.
def tokenize_outside_definitions
  case
  when (chars = @ss.skip(/[ \t]+/))             # ignore whitespace /\s+/
    ;

  when (text = @ss.scan(/\#.*$/))               # ignore comments
    ;

  when (text = @ss.scan(/;.*$/))                # ignore inline comments
    ;

  when (text = @ss.scan(/\n/))                  # newline
    [:RETURN, text]

  when (text = @ss.scan(/\b(define)\b/))        # the "define" keyword 
    [:DEFINE, text]

  when (text = @ss.scan(/[^{ \t\n]+/))          # the name of the object being defined (everything not an opening curly bracket or a separator)
    [:NAME, text]

  when (text = @ss.scan(/\{/))                  # the opening curly bracket - we enter object definition
    @in_object_definition = true
    [:LCURLY, text]

  else
    text = @ss.string[@ss.pos .. -1]
    raise  ScanError, "can not match: '#{text}'"
  end  # case
end

# This tokenizes until we find the parameter name.
def tokenize_parameter_name
  case
  when (chars = @ss.skip(/[ \t]+/))             # ignore whitespace /\s+/
    ;

  when (text = @ss.scan(/\#.*$/))               # ignore comments
    ;

  when (text = @ss.scan(/;.*$/))                # ignore inline comments
    ;

  when (text = @ss.scan(/\n/))                  # newline
    [:RETURN, text]

  when (text = @ss.scan(/\}/))                  # closing curly bracket : end of definition
    @in_object_definition = false
    [:RCURLY, text]

  when (not @in_parameter_value and (text = @ss.scan(/\S+/)))    # This is the name of the parameter
    @in_parameter_value = true
    [:PARAM, text]

  else
    text = @ss.string[@ss.pos .. -1]
    raise  ScanError, "can not match: '#{text}'"
  end  # case
end

# This tokenizes the parameter value.
# There is a special handling for lines containing semicolons :
#     - unescaped semicolons are line comments (and should stop parsing of the line)
#     - escaped (with backslash \) semicolons should be kept in the parameter value (without the backslash)
def tokenize_parameter_value
  case
  when (chars = @ss.skip(/[ \t]+/))             # ignore whitespace /\s+/
    ;

  when (text = @ss.scan(/\#.*$/))               # ignore comments
    ;

  when (text = @ss.scan(/\n/))                  # newline
    @in_parameter_value = false
    [:RETURN, text]

  when (text = @ss.scan(/.+$/))                 # Value of parameter
    @in_parameter_value = false

    # Special handling of inline comments (;) and escaped semicolons (\;)

    # We split the string on escaped semicolons (\;),
    # Then we rebuild it as long as there are no inline comments (;)
    # We join the rebuilt string with unescaped semicolons (on purpose)
    array = text.split('\;', 0)

    text = ""

    array.each do |elt|

      # Now we split at inline comments. If we have more than 1 element in the array
      # it means we have an inline comment, so we are able to stop parsing
      # However we still want to reconstruct the string with its first part (before the comment)
      linearray = elt.split(';', 0)

      # Let's reconstruct the string with a (unescaped) semicolon
      if text != "" then
        text += ';'
      end
      text += linearray[0]

      # Now we can stop
      if linearray.length > 1 then
        break                                
      end
    end


    # We strip the text to remove spaces between end of string and beginning of inline comment
    [:VALUE, text.strip]

  else
    text = @ss.string[@ss.pos .. -1]
    raise  ScanError, "can not match: '#{text}'"
  end  # case
end

# This tokenizes inside an object definition.
# Two cases : parameter name and parameter value
def tokenize_inside_definitions
  if @in_parameter_value
    tokenize_parameter_value
  else
    tokenize_parameter_name
  end
end

# The lexer.  Very simple.
def token
  text = @ss.peek(1)
  @line  +=  1  if text == "\n"

  token = if @in_object_definition
    tokenize_inside_definitions
  else
    tokenize_outside_definitions
  end
  token
end

def next_token
  return if @ss.eos?

  # skips empty actions
  until _next_token = token or @ss.eos?; end
  _next_token
end

def yydebug
  1
end

def yywrap
  0
end

def on_error(token, value, vstack )
  #    text = @ss.string[@ss.pos .. -1]
  text = @ss.peek(20)
  msg = ""
  unless value.nil?
    msg = "line #{@line}: syntax error at value '#{value}' : #{text}"
  else
    msg = "line #{@line}: syntax error at token '#{token}' : #{text}"
  end
  if @ss.eos?
    msg = "line #{@line}: Unexpected end of file"
  end
  if token == '$end'.intern
    puts "okay, this is silly"
  else
    raise ::Nagios::Parser::SyntaxError, msg
  end
end
...end grammar.ry/module_eval...
##### State transition tables begin ###

racc_action_table = [
     8,     3,     3,    14,    12,    18,    10,     4,     4,    20,
    12,    14,    12,     9,     6,    12 ]

racc_action_check = [
     5,     0,     5,    13,     9,    13,     8,     0,     5,    14,
    14,    11,    12,     6,     3,    20 ]

racc_action_pointer = [
    -1,   nil,   nil,    11,   nil,     0,     8,   nil,     6,    -4,
   nil,     7,     4,    -1,     2,   nil,   nil,   nil,   nil,   nil,
     7,   nil ]

racc_action_default = [
   -12,    -1,    -3,   -12,    -4,   -12,   -12,    -2,   -12,   -12,
    22,   -12,   -10,   -12,   -12,    -6,   -11,    -7,    -5,    -9,
   -12,    -8 ]

racc_goto_table = [
    11,     1,    15,    16,    17,    19,     7,    13,     5,   nil,
   nil,    21 ]

racc_goto_check = [
     4,     2,     6,     4,     6,     4,     2,     5,     1,   nil,
   nil,     4 ]

racc_goto_pointer = [
   nil,     8,     1,   nil,    -9,    -4,    -9 ]

racc_goto_default = [
   nil,   nil,   nil,     2,   nil,   nil,   nil ]

racc_reduce_table = [
  0, 0, :racc_error,
  1, 10, :_reduce_1,
  2, 10, :_reduce_2,
  1, 11, :_reduce_3,
  1, 11, :_reduce_4,
  6, 12, :_reduce_5,
  1, 14, :_reduce_none,
  2, 14, :_reduce_7,
  3, 15, :_reduce_8,
  2, 15, :_reduce_9,
  1, 13, :_reduce_none,
  2, 13, :_reduce_none ]

racc_reduce_n = 12

racc_shift_n = 22

racc_token_table = {
  false => 0,
  :error => 1,
  :DEFINE => 2,
  :NAME => 3,
  :PARAM => 4,
  :LCURLY => 5,
  :RCURLY => 6,
  :VALUE => 7,
  :RETURN => 8 }

racc_nt_base = 9

racc_use_result_var = true

Racc_arg = [
  racc_action_table,
  racc_action_check,
  racc_action_default,
  racc_action_pointer,
  racc_goto_table,
  racc_goto_check,
  racc_goto_default,
  racc_goto_pointer,
  racc_nt_base,
  racc_reduce_table,
  racc_token_table,
  racc_shift_n,
  racc_reduce_n,
  racc_use_result_var ]

Racc_token_to_s_table = [
  "$end",
  "error",
  "DEFINE",
  "NAME",
  "PARAM",
  "LCURLY",
  "RCURLY",
  "VALUE",
  "RETURN",
  "$start",
  "decls",
  "decl",
  "object",
  "returns",
  "vars",
  "var" ]

Racc_debug_parser = false

##### State transition tables end #####

# reduce 0 omitted

module_eval(<<'.,.,', 'grammar.ry', 6)
  def _reduce_1(val, _values, result)
     return val[0] if val[0] 
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 8)
  def _reduce_2(val, _values, result)
            if val[1].nil?
            result = val[0]
        else
            if val[0].nil?
                result = val[1]
            else
                result = [ val[0], val[1] ].flatten
            end
        end
    
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 20)
  def _reduce_3(val, _values, result)
     result = [val[0]] 
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 21)
  def _reduce_4(val, _values, result)
     result = nil 
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 25)
  def _reduce_5(val, _values, result)
            result = Nagios::Base.create(val[1],val[4])
    
    result
  end
.,.,

# reduce 6 omitted

module_eval(<<'.,.,', 'grammar.ry', 31)
  def _reduce_7(val, _values, result)
            val[1].each {|p,v|
            val[0][p] = v
        }
        result = val[0]
    
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 38)
  def _reduce_8(val, _values, result)
     result = {val[0] => val[1]} 
    result
  end
.,.,

module_eval(<<'.,.,', 'grammar.ry', 39)
  def _reduce_9(val, _values, result)
     result = {val[0] => "" } 
    result
  end
.,.,

# reduce 10 omitted

# reduce 11 omitted

def _reduce_none(val, _values, result)
  val[0]
end

  end   # class Parser
end   # module Nagios
