class PSON::Pure::Parser

This class implements the PSON parser that is used to parse a PSON string into a Ruby data structure.

Constants

ARRAY_CLOSE
ARRAY_OPEN
COLLECTION_DELIMITER
FALSE
FLOAT
IGNORE
INFINITY
INTEGER
MINUS_INFINITY
NAN
NULL
OBJECT_CLOSE
OBJECT_OPEN
PAIR_DELIMITER
STRING
TRUE
UNESCAPE_MAP

Unescape characters in strings.

UNPARSED

Public Class Methods

new(source, opts = {}) click to toggle source

Creates a new PSON::Pure::Parser instance for the string source.

It will be configured by the opts hash. opts can have the following keys:

  • max_nesting: The maximum depth of nesting allowed in the parsed data structures. Disable depth checking with :max_nesting => false|nil|0, it defaults to 19.

  • allow_nan: If set to true, allow NaN, Infinity and -Infinity in defiance of RFC 4627 to be parsed by the Parser. This option defaults to false.

  • create_additions: If set to false, the Parser doesn't create additions even if a matchin class and create_id was found. This option defaults to true.

  • object_class: Defaults to Hash

  • array_class: Defaults to Array

Calls superclass method
# File lib/puppet/external/pson/pure/parser.rb, line 68
def initialize(source, opts = {})
  super
  if !opts.key?(:max_nesting) # defaults to 19
    @max_nesting = 19
  elsif opts[:max_nesting]
    @max_nesting = opts[:max_nesting]
  else
    @max_nesting = 0
  end
  @allow_nan = !!opts[:allow_nan]
  ca = true
  ca = opts[:create_additions] if opts.key?(:create_additions)
  @create_id = ca ? PSON.create_id : nil
  @object_class = opts[:object_class] || Hash
  @array_class = opts[:array_class] || Array
end

Public Instance Methods

parse() click to toggle source

Parses the current PSON string source and returns the complete data structure as a result.

# File lib/puppet/external/pson/pure/parser.rb, line 89
def parse
  reset
  obj = nil
  until eos?
    case
    when scan(OBJECT_OPEN)
      obj and raise ParserError, "source '#{peek(20)}' not in PSON!"
      @current_nesting = 1
      obj = parse_object
    when scan(ARRAY_OPEN)
      obj and raise ParserError, "source '#{peek(20)}' not in PSON!"
      @current_nesting = 1
      obj = parse_array
    when skip(IGNORE)
      ;
    else
      raise ParserError, "source '#{peek(20)}' not in PSON!"
    end
  end
  obj or raise ParserError, "source did not contain any PSON!"
  obj
end