Class: PuppetDB::Lexer

Inherits:
Racc::Parser
  • Object
show all
Defined in:
lib/puppetdb/lexer.rb

Direct Known Subclasses

Parser

Defined Under Namespace

Classes: ScanError

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#filenameObject (readonly)

Returns the value of attribute filename.


19
20
21
# File 'lib/puppetdb/lexer.rb', line 19

def filename
  @filename
end

#linenoObject (readonly)

Returns the value of attribute lineno.


18
19
20
# File 'lib/puppetdb/lexer.rb', line 18

def lineno
  @lineno
end

Instance Method Details

#action(&block) ⇒ Object

[View source]

23
24
25
# File 'lib/puppetdb/lexer.rb', line 23

def action &block
  yield
end

#load_file(filename) ⇒ Object

[View source]

32
33
34
35
36
37
# File 'lib/puppetdb/lexer.rb', line 32

def load_file( filename )
  @filename = filename
  open(filename, "r") do |f|
    scan_evaluate  f.read
  end
end

#next_tokenObject

[View source]

44
45
46
# File 'lib/puppetdb/lexer.rb', line 44

def next_token
  @rex_tokens.shift
end

#scan_evaluate(str) ⇒ Object

[View source]

48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/puppetdb/lexer.rb', line 48

def scan_evaluate( str )
  scan_setup
  @rex_tokens = []
  @lineno  =  1
  ss = StringScanner.new(str)
  state = nil
  until ss.eos?
    text = ss.peek(1)
    @lineno  +=  1  if text == "\n"
    case state
    when nil
      case
      when (text = ss.scan(/\s/))
        ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      when (text = ss.scan(/@@/))
         @rex_tokens.push action { [:EXPORTED, 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
  end  # until ss
end

#scan_file(filename) ⇒ Object

[View source]

39
40
41
42
# File 'lib/puppetdb/lexer.rb', line 39

def scan_file( filename )
  load_file  filename
  do_parse
end

#scan_setupObject

[View source]

21
# File 'lib/puppetdb/lexer.rb', line 21

def scan_setup ; end

#scan_str(str) ⇒ Object

[View source]

27
28
29
30
# File 'lib/puppetdb/lexer.rb', line 27

def scan_str( str )
  scan_evaluate  str
  do_parse
end