# begin: ragel

begin

%%{

machine bel;

include 'common.rl';
include 'identifier.rl';

action add_name {
  trace('UNSET add_name')
  key = @buffers.delete(:ident)
  @buffers[:unset_name] = key
}

action unset_end {
  trace('UNSET unset_end')
  name = @buffers.delete(:unset_name)
  unless name.nil?
    unset_node = unset(name, complete: name.complete)
  else
    unset_node = unset(complete: false)
  end
  @buffers[:unset] = unset_node
}

action yield_unset {
  trace('UNSET yield_unset')
  yield @buffers[:unset]
}

action set_node_eof {
  trace('UNSET set_node_eof')
}

an_unset =
  KW_UNSET
  SP+
  an_ident
  %add_name
  @eof(set_node_eof)
  %unset_end
  ;

unset_ast_node :=
  KW_UNSET
  SP+?
  an_ident?
  %add_name
  @eof(set_node_eof)
  %unset_end
  %yield_unset
  ;

}%%

end

# end: ragel

require_relative '../ast/node' require_relative '../mixin/buffer' require_relative '../nonblocking_io_wrapper' require_relative '../tracer'

module BELParser

module Parsers
  module BELScript
    module Unset

      class << self

        MAX_LENGTH = 1024 * 128 # 128K

        def parse(content)
          return nil unless content

          Parser.new(content).each do |obj|
            yield obj
          end
        end
      end

      private

      class Parser
        include Enumerable
        include BELParser::Parsers::Buffer
        include BELParser::Parsers::AST::Sexp
        include BELParser::Parsers::Tracer

        def initialize(content)
          @content = content
    # begin: ragel
          %% write data;
    # end: ragel
        end

        def each
          @buffers    = {}
          @incomplete = {}
          data        = @content.unpack('C*')
          p           = 0
          pe          = data.length
          eof         = data.length

    # begin: ragel
          %% write init;
          %% write exec;
    # end: ragel
        end
      end
    end
  end
end

end

if __FILE__ == $0

$stdin.each_line do |line|
  BELParser::Parsers::BELScript::Unset.parse(line) { |obj|
    puts obj.inspect
  }
end

end

# vim: ft=ruby ts=2 sw=2: # encoding: utf-8