Class: JsonCompleter::Scanners::NumberToken

Inherits:
Struct
  • Object
show all
Defined in:
lib/json_completer/scanners.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(slot: nil, raw: nil, phase: nil, invalid: false) ⇒ NumberToken

Returns a new instance of NumberToken.



165
166
167
168
# File 'lib/json_completer/scanners.rb', line 165

def initialize(slot: nil, raw: nil, phase: nil, invalid: false)
  super
  self.raw ||= String.new
end

Instance Attribute Details

#invalidObject

Returns the value of attribute invalid

Returns:

  • (Object)

    the current value of invalid



164
165
166
# File 'lib/json_completer/scanners.rb', line 164

def invalid
  @invalid
end

#phaseObject

Returns the value of attribute phase

Returns:

  • (Object)

    the current value of phase



164
165
166
# File 'lib/json_completer/scanners.rb', line 164

def phase
  @phase
end

#rawObject

Returns the value of attribute raw

Returns:

  • (Object)

    the current value of raw



164
165
166
# File 'lib/json_completer/scanners.rb', line 164

def raw
  @raw
end

#slotObject

Returns the value of attribute slot

Returns:

  • (Object)

    the current value of slot



164
165
166
# File 'lib/json_completer/scanners.rb', line 164

def slot
  @slot
end

Instance Method Details

#append_byte(byte) ⇒ Object

append_byte consumes ASCII bytes, not 1-character strings: 45 = -, 46 = ., 48..57 = 0..9, 69/101 = E/e.



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/json_completer/scanners.rb', line 172

def append_byte(byte)
  case phase
  when nil
    case byte
    when 45
      raw << byte
      self.phase = :sign
    when 48
      raw << byte
      self.phase = :zero
    when 49..57
      raw << byte
      self.phase = :int
    else
      return false
    end
  when :sign
    case byte
    when 48
      raw << byte
      self.phase = :zero
    when 49..57
      raw << byte
      self.phase = :int
    when 46
      raw << byte
      self.phase = :frac_start
    else
      return false
    end
  when :zero
    if Scanners.digit_byte?(byte)
      self.invalid = true
      return false
    elsif byte == 46
      raw << byte
      self.phase = :frac_start
    elsif Scanners.exponent_byte?(byte)
      raw << byte
      self.phase = :exp_start
    else
      return false
    end
  when :int
    if Scanners.digit_byte?(byte)
      raw << byte
    elsif byte == 46
      raw << byte
      self.phase = :frac_start
    elsif Scanners.exponent_byte?(byte)
      raw << byte
      self.phase = :exp_start
    else
      return false
    end
  when :frac_start
    return false unless Scanners.digit_byte?(byte)

    raw << byte
    self.phase = :frac
  when :frac
    if Scanners.digit_byte?(byte)
      raw << byte
    elsif Scanners.exponent_byte?(byte)
      raw << byte
      self.phase = :exp_start
    else
      return false
    end
  when :exp_start
    case byte
    when 43, 45
      raw << byte
      self.phase = :exp_sign
    when 48..57
      raw << byte
      self.phase = :exp
    else
      return false
    end
  when :exp_sign
    return false unless Scanners.digit_byte?(byte)

    raw << byte
    self.phase = :exp
  when :exp
    return false unless Scanners.digit_byte?(byte)

    raw << byte
  end

  true
end

#completed_literalObject



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# File 'lib/json_completer/scanners.rb', line 266

def completed_literal
  literal = raw.dup

  case phase
  when :sign
    literal = '0'
  when :frac_start
    literal = literal == '-.' ? '-0.0' : "#{literal}0"
  when :exp_start, :exp_sign
    literal = "#{literal}0"
  end

  literal = "0#{literal}" if literal.start_with?('.')
  literal = '0' if literal.empty? || literal == '-'
  literal
end

#invalid?Boolean

Returns:

  • (Boolean)


288
289
290
# File 'lib/json_completer/scanners.rb', line 288

def invalid?
  invalid
end

#parsed_valueObject



283
284
285
286
# File 'lib/json_completer/scanners.rb', line 283

def parsed_value
  literal = completed_literal
  literal.match?(/[.eE]/) ? literal.to_f : literal.to_i
end