class PuppetDB::Lexer

Attributes

filename[R]
lineno[R]
state[RW]

Public Instance Methods

_next_token() click to toggle source
# File lib/puppetdb/lexer.rb, line 59
def _next_token
  text = @ss.peek(1)
  @lineno  +=  1  if text == "\n"
  token = case @state
  when nil
    case
    when (text = @ss.scan(/\s/))
      ;

    when (text = @ss.scan(/\(/))
       action { [:LPAREN, text] }

    when (text = @ss.scan(/\)/))
       action { [:RPAREN, text] }

    when (text = @ss.scan(/\[/))
       action { [:LBRACK, text] }

    when (text = @ss.scan(/\]/))
       action { [:RBRACK, text] }

    when (text = @ss.scan(/\{/))
       action { [:LBRACE, text] }

    when (text = @ss.scan(/\}/))
       action { [:RBRACE, text] }

    when (text = @ss.scan(/=/))
       action { [:EQUALS, text] }

    when (text = @ss.scan(/\!=/))
       action { [:NOTEQUALS, text] }

    when (text = @ss.scan(/~/))
       action { [:MATCH, text] }

    when (text = @ss.scan(/\!~/))
       action { [:NOTMATCH, text] }

    when (text = @ss.scan(/<=/))
       action { [:LESSTHANEQ, text] }

    when (text = @ss.scan(/</))
       action { [:LESSTHAN, text] }

    when (text = @ss.scan(/>=/))
       action { [:GREATERTHANEQ, text] }

    when (text = @ss.scan(/>/))
       action { [:GREATERTHAN, text] }

    when (text = @ss.scan(/\*/))
       action { [:ASTERISK, text] }

    when (text = @ss.scan(/\#/))
       action { [:HASH, text] }

    when (text = @ss.scan(/\./))
       action { [:DOT, text] }

    when (text = @ss.scan(/not(?![\w_:])/))
       action { [:NOT, text] }

    when (text = @ss.scan(/and(?![\w_:])/))
       action { [:AND, text] }

    when (text = @ss.scan(/or(?![\w_:])/))
       action { [:OR, text] }

    when (text = @ss.scan(/true(?![\w_:])/))
       action { [:BOOLEAN, true]}

    when (text = @ss.scan(/false(?![\w_:])/))
       action { [:BOOLEAN, false]}

    when (text = @ss.scan(/-?\d+/))
       action { [:NUMBER, text.to_i] }

    when (text = @ss.scan(/\"(\\.|[^\\"])*\"/))
       action { [:STRING, YAML.load(text)] }

    when (text = @ss.scan(/\'(\\.|[^\\'])*\'/))
       action { [:STRING, YAML.load(text)] }

    when (text = @ss.scan(/[\w_:]+/))
       action { [:STRING, text] }

    when (text = @ss.scan(/@@/))
       action { [:EXPORTED, text] }

    when (text = @ss.scan(/@/))
       action { [:AT, text] }

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

  else
    raise  ScanError, "undefined state: '" + state.to_s + "'"
  end  # case state
  token
end
action() { || ... } click to toggle source
# File lib/puppetdb/lexer.rb, line 28
def action
  yield
end
load_file( filename ) click to toggle source
# File lib/puppetdb/lexer.rb, line 38
def load_file( filename )
  @filename = filename
  open(filename, "r") do |f|
    scan_setup(f.read)
  end
end
next_token() click to toggle source
# File lib/puppetdb/lexer.rb, line 51
def next_token
  return if @ss.eos?
  
  # skips empty actions
  until token = _next_token or @ss.eos?; end
  token
end
scan(str)
Alias for: scan_str
scan_file( filename ) click to toggle source
# File lib/puppetdb/lexer.rb, line 45
def scan_file( filename )
  load_file(filename)
  do_parse
end
scan_setup(str) click to toggle source
# File lib/puppetdb/lexer.rb, line 22
def scan_setup(str)
  @ss = StringScanner.new(str)
  @lineno =  1
  @state  = nil
end
scan_str(str) click to toggle source
# File lib/puppetdb/lexer.rb, line 32
def scan_str(str)
  scan_setup(str)
  do_parse
end
Also aliased as: scan