class ExpressionTokenizer::Status

Public Class Methods

new(pos,tokenizer,args={}) click to toggle source
# File libs/lexer.rb, line 796
def initialize(pos,tokenizer,args={})
  @named_vars=[:close, :nothing_seen, :delim, :have_delim, :have_item,
               :item_seen, :delim_seen]

  @tokenizer=tokenizer

  @stat_hash={}
  @named_vars.each {|i| @stat_hash[i]=nil}  #preload for debugging
  self.have_item = self.have_delim =  self.delim_seen = false
  @stat_hash.merge!(args) #args overwrites @stat_hash where keys are equal

  self.item_seen=@stat_hash[:preload].nil?

  #If we expect to find a closing element, the delimiter will be a comma
  #Otherwise we'll discover it later
  self.delim=:comma if self.delim.nil? && !self.close.nil?

  self.skip_until_close=self.skip_until_close==true || false #enforce boolean result
end

Public Instance Methods

[](key) click to toggle source
# File libs/lexer.rb, line 841
def [](key)
  @stat_hash[key]
end
[]=(key,value) click to toggle source
# File libs/lexer.rb, line 837
def []=(key,value)
  @stat_hash[key]=value
end
args() click to toggle source
# File libs/lexer.rb, line 816
def args
  hash={}
  vars=instance_variables
  vars.delete("@tokenizer")
  vars.delete("@stat_hash")
  vars.delete("@named_vars")
  vars.each do |i|
    hash.merge!(i.split("@")[-1].to_sym=>instance_variable_get(i))
  end
  hash.merge!(@stat_hash)
end
delimiter(pos) click to toggle source
# File libs/lexer.rb, line 878
def delimiter(pos)
  if @tokenizer.of_type?(pos,:comma)
    @tokenizer.invalid_character(pos,:error=>WhitespaceExpected) if self.delim==:whitespace
    @tokenizer.invalid_character(pos,:error=>ItemExpected) if self.delim==:comma and self.have_delim
  elsif @tokenizer.of_type?(pos,:whitespace)
    self.delim=:whitespace if self.delim.nil? && self.seen_item
  else
    @tokenizer.invalid_character(pos)
  end

  self.delim_seen=true
  self.have_item=false
  self.have_delim=true
end
inspect() click to toggle source
# File libs/lexer.rb, line 833
def inspect
  "#<#{self.class}:0x#{self.__id__.to_s(16)} " + args.inspect + ">"
end
item(pos) click to toggle source
# File libs/lexer.rb, line 864
def item(pos)
  #set the delimiter to whitespace if we've never seen a delimiter but have an item
  if self.delim.nil? && self.have_item && !self.delim_seen
    self.delim=:whitespace
    self.delim_seen=true
  end

  @tokenizer.invalid_character(pos, :error=>DelimiterExpected) if
      self.have_item && self.delim!=:whitespace && !@tokenizer.of_type?(pos,[:open,:close])
  self.item_seen=true
  self.have_item=true
  self.have_delim=false
end
merge(other_hash) click to toggle source
# File libs/lexer.rb, line 828
def merge(other_hash)
  raise ZError.new("Hash Value required",:retry=>false) if other_hash.class!=Hash
  args.merge(other_hash)
end
method_missing(sym,*args) click to toggle source
Calls superclass method
# File libs/lexer.rb, line 845
def method_missing(sym,*args)
  key=sym.to_s.split("=")[0].intern
  have_equal=(key.to_s!=sym.to_s)
  val=@stat_hash[key]
  return val if val && !have_equal && args.empty?

  if have_equal
    @stat_hash[key]=*args
    return *args
  end

  #just to be sure let's kick this to the super class, otherwise return nil
  begin
    return super(sym,args)
  rescue NoMethodError
    return nil
  end
end