psych 3.0.0.beta2-x64-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +16 -0
 - data/.travis.yml +20 -0
 - data/CHANGELOG.rdoc +576 -0
 - data/Gemfile +3 -0
 - data/Mavenfile +7 -0
 - data/README.md +73 -0
 - data/Rakefile +46 -0
 - data/bin/console +7 -0
 - data/bin/setup +6 -0
 - data/ext/psych/.gitignore +11 -0
 - data/ext/psych/depend +3 -0
 - data/ext/psych/extconf.rb +39 -0
 - data/ext/psych/psych.c +34 -0
 - data/ext/psych/psych.h +17 -0
 - data/ext/psych/psych_emitter.c +554 -0
 - data/ext/psych/psych_emitter.h +8 -0
 - data/ext/psych/psych_parser.c +568 -0
 - data/ext/psych/psych_parser.h +6 -0
 - data/ext/psych/psych_to_ruby.c +39 -0
 - data/ext/psych/psych_to_ruby.h +8 -0
 - data/ext/psych/psych_yaml_tree.c +24 -0
 - data/ext/psych/psych_yaml_tree.h +8 -0
 - data/ext/psych/yaml/LICENSE +19 -0
 - data/ext/psych/yaml/api.c +1392 -0
 - data/ext/psych/yaml/config.h +10 -0
 - data/ext/psych/yaml/dumper.c +394 -0
 - data/ext/psych/yaml/emitter.c +2329 -0
 - data/ext/psych/yaml/loader.c +444 -0
 - data/ext/psych/yaml/parser.c +1374 -0
 - data/ext/psych/yaml/reader.c +469 -0
 - data/ext/psych/yaml/scanner.c +3576 -0
 - data/ext/psych/yaml/writer.c +141 -0
 - data/ext/psych/yaml/yaml.h +1971 -0
 - data/ext/psych/yaml/yaml_private.h +662 -0
 - data/lib/psych.rb +511 -0
 - data/lib/psych/class_loader.rb +102 -0
 - data/lib/psych/coder.rb +95 -0
 - data/lib/psych/core_ext.rb +19 -0
 - data/lib/psych/exception.rb +14 -0
 - data/lib/psych/handler.rb +250 -0
 - data/lib/psych/handlers/document_stream.rb +23 -0
 - data/lib/psych/handlers/recorder.rb +40 -0
 - data/lib/psych/json/ruby_events.rb +20 -0
 - data/lib/psych/json/stream.rb +17 -0
 - data/lib/psych/json/tree_builder.rb +13 -0
 - data/lib/psych/json/yaml_events.rb +30 -0
 - data/lib/psych/nodes.rb +78 -0
 - data/lib/psych/nodes/alias.rb +19 -0
 - data/lib/psych/nodes/document.rb +61 -0
 - data/lib/psych/nodes/mapping.rb +57 -0
 - data/lib/psych/nodes/node.rb +56 -0
 - data/lib/psych/nodes/scalar.rb +68 -0
 - data/lib/psych/nodes/sequence.rb +82 -0
 - data/lib/psych/nodes/stream.rb +38 -0
 - data/lib/psych/omap.rb +5 -0
 - data/lib/psych/parser.rb +52 -0
 - data/lib/psych/scalar_scanner.rb +149 -0
 - data/lib/psych/set.rb +5 -0
 - data/lib/psych/stream.rb +38 -0
 - data/lib/psych/streaming.rb +28 -0
 - data/lib/psych/syntax_error.rb +22 -0
 - data/lib/psych/tree_builder.rb +97 -0
 - data/lib/psych/versions.rb +9 -0
 - data/lib/psych/visitors.rb +7 -0
 - data/lib/psych/visitors/depth_first.rb +27 -0
 - data/lib/psych/visitors/emitter.rb +52 -0
 - data/lib/psych/visitors/json_tree.rb +25 -0
 - data/lib/psych/visitors/to_ruby.rb +401 -0
 - data/lib/psych/visitors/visitor.rb +20 -0
 - data/lib/psych/visitors/yaml_tree.rb +551 -0
 - data/lib/psych/y.rb +10 -0
 - data/psych.gemspec +64 -0
 - metadata +175 -0
 
| 
         @@ -0,0 +1,82 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 3 
     | 
    
         
            +
              module Nodes
         
     | 
| 
      
 4 
     | 
    
         
            +
                ###
         
     | 
| 
      
 5 
     | 
    
         
            +
                # This class represents a
         
     | 
| 
      
 6 
     | 
    
         
            +
                # {YAML sequence}[http://yaml.org/spec/1.1/#sequence/syntax].
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                # A YAML sequence is basically a list, and looks like this:
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                #   %YAML 1.1
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   ---
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   - I am
         
     | 
| 
      
 13 
     | 
    
         
            +
                #   - a Sequence
         
     | 
| 
      
 14 
     | 
    
         
            +
                #
         
     | 
| 
      
 15 
     | 
    
         
            +
                # A YAML sequence may have an anchor like this:
         
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                #   %YAML 1.1
         
     | 
| 
      
 18 
     | 
    
         
            +
                #   ---
         
     | 
| 
      
 19 
     | 
    
         
            +
                #   &A [
         
     | 
| 
      
 20 
     | 
    
         
            +
                #     "This sequence",
         
     | 
| 
      
 21 
     | 
    
         
            +
                #     "has an anchor"
         
     | 
| 
      
 22 
     | 
    
         
            +
                #   ]
         
     | 
| 
      
 23 
     | 
    
         
            +
                #
         
     | 
| 
      
 24 
     | 
    
         
            +
                # A YAML sequence may also have a tag like this:
         
     | 
| 
      
 25 
     | 
    
         
            +
                #
         
     | 
| 
      
 26 
     | 
    
         
            +
                #   %YAML 1.1
         
     | 
| 
      
 27 
     | 
    
         
            +
                #   ---
         
     | 
| 
      
 28 
     | 
    
         
            +
                #   !!seq [
         
     | 
| 
      
 29 
     | 
    
         
            +
                #     "This sequence",
         
     | 
| 
      
 30 
     | 
    
         
            +
                #     "has a tag"
         
     | 
| 
      
 31 
     | 
    
         
            +
                #   ]
         
     | 
| 
      
 32 
     | 
    
         
            +
                #
         
     | 
| 
      
 33 
     | 
    
         
            +
                # This class represents a sequence in a YAML document.  A
         
     | 
| 
      
 34 
     | 
    
         
            +
                # Psych::Nodes::Sequence node may have 0 or more children.  Valid children
         
     | 
| 
      
 35 
     | 
    
         
            +
                # for this node are:
         
     | 
| 
      
 36 
     | 
    
         
            +
                #
         
     | 
| 
      
 37 
     | 
    
         
            +
                # * Psych::Nodes::Sequence
         
     | 
| 
      
 38 
     | 
    
         
            +
                # * Psych::Nodes::Mapping
         
     | 
| 
      
 39 
     | 
    
         
            +
                # * Psych::Nodes::Scalar
         
     | 
| 
      
 40 
     | 
    
         
            +
                # * Psych::Nodes::Alias
         
     | 
| 
      
 41 
     | 
    
         
            +
                class Sequence < Psych::Nodes::Node
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # Any Styles, emitter chooses
         
     | 
| 
      
 43 
     | 
    
         
            +
                  ANY   = 0
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  # Block style sequence
         
     | 
| 
      
 46 
     | 
    
         
            +
                  BLOCK = 1
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  # Flow style sequence
         
     | 
| 
      
 49 
     | 
    
         
            +
                  FLOW  = 2
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                  # The anchor for this sequence (if any)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  attr_accessor :anchor
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                  # The tag name for this sequence (if any)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  attr_accessor :tag
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  # Is this sequence started implicitly?
         
     | 
| 
      
 58 
     | 
    
         
            +
                  attr_accessor :implicit
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  # The sequence style used
         
     | 
| 
      
 61 
     | 
    
         
            +
                  attr_accessor :style
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  ###
         
     | 
| 
      
 64 
     | 
    
         
            +
                  # Create a new object representing a YAML sequence.
         
     | 
| 
      
 65 
     | 
    
         
            +
                  #
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # +anchor+ is the anchor associated with the sequence or nil.
         
     | 
| 
      
 67 
     | 
    
         
            +
                  # +tag+ is the tag associated with the sequence or nil.
         
     | 
| 
      
 68 
     | 
    
         
            +
                  # +implicit+ a boolean indicating whether or not the sequence was
         
     | 
| 
      
 69 
     | 
    
         
            +
                  # implicitly started.
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # +style+ is an integer indicating the list style.
         
     | 
| 
      
 71 
     | 
    
         
            +
                  #
         
     | 
| 
      
 72 
     | 
    
         
            +
                  # See Psych::Handler#start_sequence
         
     | 
| 
      
 73 
     | 
    
         
            +
                  def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK
         
     | 
| 
      
 74 
     | 
    
         
            +
                    super()
         
     | 
| 
      
 75 
     | 
    
         
            +
                    @anchor   = anchor
         
     | 
| 
      
 76 
     | 
    
         
            +
                    @tag      = tag
         
     | 
| 
      
 77 
     | 
    
         
            +
                    @implicit = implicit
         
     | 
| 
      
 78 
     | 
    
         
            +
                    @style    = style
         
     | 
| 
      
 79 
     | 
    
         
            +
                  end
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 3 
     | 
    
         
            +
              module Nodes
         
     | 
| 
      
 4 
     | 
    
         
            +
                ###
         
     | 
| 
      
 5 
     | 
    
         
            +
                # Represents a YAML stream.  This is the root node for any YAML parse
         
     | 
| 
      
 6 
     | 
    
         
            +
                # tree.  This node must have one or more child nodes.  The only valid
         
     | 
| 
      
 7 
     | 
    
         
            +
                # child node for a Psych::Nodes::Stream node is Psych::Nodes::Document.
         
     | 
| 
      
 8 
     | 
    
         
            +
                class Stream < Psych::Nodes::Node
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  # Encodings supported by Psych (and libyaml)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  # Any encoding
         
     | 
| 
      
 13 
     | 
    
         
            +
                  ANY     = Psych::Parser::ANY
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  # UTF-8 encoding
         
     | 
| 
      
 16 
     | 
    
         
            +
                  UTF8    = Psych::Parser::UTF8
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  # UTF-16LE encoding
         
     | 
| 
      
 19 
     | 
    
         
            +
                  UTF16LE = Psych::Parser::UTF16LE
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  # UTF-16BE encoding
         
     | 
| 
      
 22 
     | 
    
         
            +
                  UTF16BE = Psych::Parser::UTF16BE
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  # The encoding used for this stream
         
     | 
| 
      
 25 
     | 
    
         
            +
                  attr_accessor :encoding
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  ###
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # Create a new Psych::Nodes::Stream node with an +encoding+ that
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # defaults to Psych::Nodes::Stream::UTF8.
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #
         
     | 
| 
      
 31 
     | 
    
         
            +
                  # See also Psych::Handler#start_stream
         
     | 
| 
      
 32 
     | 
    
         
            +
                  def initialize encoding = UTF8
         
     | 
| 
      
 33 
     | 
    
         
            +
                    super()
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @encoding = encoding
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/psych/omap.rb
    ADDED
    
    
    
        data/lib/psych/parser.rb
    ADDED
    
    | 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 3 
     | 
    
         
            +
              ###
         
     | 
| 
      
 4 
     | 
    
         
            +
              # YAML event parser class.  This class parses a YAML document and calls
         
     | 
| 
      
 5 
     | 
    
         
            +
              # events on the handler that is passed to the constructor.  The events can
         
     | 
| 
      
 6 
     | 
    
         
            +
              # be used for things such as constructing a YAML AST or deserializing YAML
         
     | 
| 
      
 7 
     | 
    
         
            +
              # documents.  It can even be fed back to Psych::Emitter to emit the same
         
     | 
| 
      
 8 
     | 
    
         
            +
              # document that was parsed.
         
     | 
| 
      
 9 
     | 
    
         
            +
              #
         
     | 
| 
      
 10 
     | 
    
         
            +
              # See Psych::Handler for documentation on the events that Psych::Parser emits.
         
     | 
| 
      
 11 
     | 
    
         
            +
              #
         
     | 
| 
      
 12 
     | 
    
         
            +
              # Here is an example that prints out ever scalar found in a YAML document:
         
     | 
| 
      
 13 
     | 
    
         
            +
              #
         
     | 
| 
      
 14 
     | 
    
         
            +
              #   # Handler for detecting scalar values
         
     | 
| 
      
 15 
     | 
    
         
            +
              #   class ScalarHandler < Psych::Handler
         
     | 
| 
      
 16 
     | 
    
         
            +
              #     def scalar value, anchor, tag, plain, quoted, style
         
     | 
| 
      
 17 
     | 
    
         
            +
              #       puts value
         
     | 
| 
      
 18 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 19 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 20 
     | 
    
         
            +
              #
         
     | 
| 
      
 21 
     | 
    
         
            +
              #   parser = Psych::Parser.new(ScalarHandler.new)
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   parser.parse(yaml_document)
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              # Here is an example that feeds the parser back in to Psych::Emitter.  The
         
     | 
| 
      
 25 
     | 
    
         
            +
              # YAML document is read from STDIN and written back out to STDERR:
         
     | 
| 
      
 26 
     | 
    
         
            +
              #
         
     | 
| 
      
 27 
     | 
    
         
            +
              #   parser = Psych::Parser.new(Psych::Emitter.new($stderr))
         
     | 
| 
      
 28 
     | 
    
         
            +
              #   parser.parse($stdin)
         
     | 
| 
      
 29 
     | 
    
         
            +
              #
         
     | 
| 
      
 30 
     | 
    
         
            +
              # Psych uses Psych::Parser in combination with Psych::TreeBuilder to
         
     | 
| 
      
 31 
     | 
    
         
            +
              # construct an AST of the parsed YAML document.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              class Parser
         
     | 
| 
      
 34 
     | 
    
         
            +
                class Mark < Struct.new(:index, :line, :column)
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                # The handler on which events will be called
         
     | 
| 
      
 38 
     | 
    
         
            +
                attr_accessor :handler
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                # Set the encoding for this parser to +encoding+
         
     | 
| 
      
 41 
     | 
    
         
            +
                attr_writer :external_encoding
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                ###
         
     | 
| 
      
 44 
     | 
    
         
            +
                # Creates a new Psych::Parser instance with +handler+.  YAML events will
         
     | 
| 
      
 45 
     | 
    
         
            +
                # be called on +handler+.  See Psych::Parser for more details.
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                def initialize handler = Handler.new
         
     | 
| 
      
 48 
     | 
    
         
            +
                  @handler = handler
         
     | 
| 
      
 49 
     | 
    
         
            +
                  @external_encoding = ANY
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,149 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'strscan'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 5 
     | 
    
         
            +
              ###
         
     | 
| 
      
 6 
     | 
    
         
            +
              # Scan scalars for built in types
         
     | 
| 
      
 7 
     | 
    
         
            +
              class ScalarScanner
         
     | 
| 
      
 8 
     | 
    
         
            +
                # Taken from http://yaml.org/type/timestamp.html
         
     | 
| 
      
 9 
     | 
    
         
            +
                TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                # Taken from http://yaml.org/type/float.html
         
     | 
| 
      
 12 
     | 
    
         
            +
                FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10)
         
     | 
| 
      
 13 
     | 
    
         
            +
                          |[-+]?\.(inf|Inf|INF)(?# infinity)
         
     | 
| 
      
 14 
     | 
    
         
            +
                          |\.(nan|NaN|NAN)(?# not a number))$/x
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                # Taken from http://yaml.org/type/int.html
         
     | 
| 
      
 17 
     | 
    
         
            +
                INTEGER = /^(?:[-+]?0b[0-1_]+          (?# base 2)
         
     | 
| 
      
 18 
     | 
    
         
            +
                              |[-+]?0[0-7_]+           (?# base 8)
         
     | 
| 
      
 19 
     | 
    
         
            +
                              |[-+]?(?:0|[1-9][0-9_]*) (?# base 10)
         
     | 
| 
      
 20 
     | 
    
         
            +
                              |[-+]?0x[0-9a-fA-F_]+    (?# base 16))$/x
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                attr_reader :class_loader
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                # Create a new scanner
         
     | 
| 
      
 25 
     | 
    
         
            +
                def initialize class_loader
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @string_cache = {}
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @symbol_cache = {}
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @class_loader = class_loader
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                # Tokenize +string+ returning the Ruby object
         
     | 
| 
      
 32 
     | 
    
         
            +
                def tokenize string
         
     | 
| 
      
 33 
     | 
    
         
            +
                  return nil if string.empty?
         
     | 
| 
      
 34 
     | 
    
         
            +
                  return string if @string_cache.key?(string)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  return @symbol_cache[string] if @symbol_cache.key?(string)
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  case string
         
     | 
| 
      
 38 
     | 
    
         
            +
                  # Check for a String type, being careful not to get caught by hash keys, hex values, and
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # special floats (e.g., -.inf).
         
     | 
| 
      
 40 
     | 
    
         
            +
                  when /^[^\d\.:-]?[A-Za-z_\s!@#\$%\^&\*\(\)\{\}\<\>\|\/\\~;=]+/, /\n/
         
     | 
| 
      
 41 
     | 
    
         
            +
                    if string.length > 5
         
     | 
| 
      
 42 
     | 
    
         
            +
                      @string_cache[string] = true
         
     | 
| 
      
 43 
     | 
    
         
            +
                      return string
         
     | 
| 
      
 44 
     | 
    
         
            +
                    end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    case string
         
     | 
| 
      
 47 
     | 
    
         
            +
                    when /^[^ytonf~]/i
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @string_cache[string] = true
         
     | 
| 
      
 49 
     | 
    
         
            +
                      string
         
     | 
| 
      
 50 
     | 
    
         
            +
                    when '~', /^null$/i
         
     | 
| 
      
 51 
     | 
    
         
            +
                      nil
         
     | 
| 
      
 52 
     | 
    
         
            +
                    when /^(yes|true|on)$/i
         
     | 
| 
      
 53 
     | 
    
         
            +
                      true
         
     | 
| 
      
 54 
     | 
    
         
            +
                    when /^(no|false|off)$/i
         
     | 
| 
      
 55 
     | 
    
         
            +
                      false
         
     | 
| 
      
 56 
     | 
    
         
            +
                    else
         
     | 
| 
      
 57 
     | 
    
         
            +
                      @string_cache[string] = true
         
     | 
| 
      
 58 
     | 
    
         
            +
                      string
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  when TIME
         
     | 
| 
      
 61 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 62 
     | 
    
         
            +
                      parse_time string
         
     | 
| 
      
 63 
     | 
    
         
            +
                    rescue ArgumentError
         
     | 
| 
      
 64 
     | 
    
         
            +
                      string
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  when /^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/
         
     | 
| 
      
 67 
     | 
    
         
            +
                    require 'date'
         
     | 
| 
      
 68 
     | 
    
         
            +
                    begin
         
     | 
| 
      
 69 
     | 
    
         
            +
                      class_loader.date.strptime(string, '%Y-%m-%d')
         
     | 
| 
      
 70 
     | 
    
         
            +
                    rescue ArgumentError
         
     | 
| 
      
 71 
     | 
    
         
            +
                      string
         
     | 
| 
      
 72 
     | 
    
         
            +
                    end
         
     | 
| 
      
 73 
     | 
    
         
            +
                  when /^\.inf$/i
         
     | 
| 
      
 74 
     | 
    
         
            +
                    Float::INFINITY
         
     | 
| 
      
 75 
     | 
    
         
            +
                  when /^-\.inf$/i
         
     | 
| 
      
 76 
     | 
    
         
            +
                    -Float::INFINITY
         
     | 
| 
      
 77 
     | 
    
         
            +
                  when /^\.nan$/i
         
     | 
| 
      
 78 
     | 
    
         
            +
                    Float::NAN
         
     | 
| 
      
 79 
     | 
    
         
            +
                  when /^:./
         
     | 
| 
      
 80 
     | 
    
         
            +
                    if string =~ /^:(["'])(.*)\1/
         
     | 
| 
      
 81 
     | 
    
         
            +
                      @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
         
     | 
| 
      
 82 
     | 
    
         
            +
                    else
         
     | 
| 
      
 83 
     | 
    
         
            +
                      @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, ''))
         
     | 
| 
      
 84 
     | 
    
         
            +
                    end
         
     | 
| 
      
 85 
     | 
    
         
            +
                  when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/
         
     | 
| 
      
 86 
     | 
    
         
            +
                    i = 0
         
     | 
| 
      
 87 
     | 
    
         
            +
                    string.split(':').each_with_index do |n,e|
         
     | 
| 
      
 88 
     | 
    
         
            +
                      i += (n.to_i * 60 ** (e - 2).abs)
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
                    i
         
     | 
| 
      
 91 
     | 
    
         
            +
                  when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/
         
     | 
| 
      
 92 
     | 
    
         
            +
                    i = 0
         
     | 
| 
      
 93 
     | 
    
         
            +
                    string.split(':').each_with_index do |n,e|
         
     | 
| 
      
 94 
     | 
    
         
            +
                      i += (n.to_f * 60 ** (e - 2).abs)
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
      
 96 
     | 
    
         
            +
                    i
         
     | 
| 
      
 97 
     | 
    
         
            +
                  when FLOAT
         
     | 
| 
      
 98 
     | 
    
         
            +
                    if string =~ /\A[-+]?\.\Z/
         
     | 
| 
      
 99 
     | 
    
         
            +
                      @string_cache[string] = true
         
     | 
| 
      
 100 
     | 
    
         
            +
                      string
         
     | 
| 
      
 101 
     | 
    
         
            +
                    else
         
     | 
| 
      
 102 
     | 
    
         
            +
                      Float(string.gsub(/[,_]|\.([Ee]|$)/, '\1'))
         
     | 
| 
      
 103 
     | 
    
         
            +
                    end
         
     | 
| 
      
 104 
     | 
    
         
            +
                  else
         
     | 
| 
      
 105 
     | 
    
         
            +
                    int = parse_int string.gsub(/[,_]/, '')
         
     | 
| 
      
 106 
     | 
    
         
            +
                    return int if int
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                    @string_cache[string] = true
         
     | 
| 
      
 109 
     | 
    
         
            +
                    string
         
     | 
| 
      
 110 
     | 
    
         
            +
                  end
         
     | 
| 
      
 111 
     | 
    
         
            +
                end
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
      
 113 
     | 
    
         
            +
                ###
         
     | 
| 
      
 114 
     | 
    
         
            +
                # Parse and return an int from +string+
         
     | 
| 
      
 115 
     | 
    
         
            +
                def parse_int string
         
     | 
| 
      
 116 
     | 
    
         
            +
                  return unless INTEGER === string
         
     | 
| 
      
 117 
     | 
    
         
            +
                  Integer(string)
         
     | 
| 
      
 118 
     | 
    
         
            +
                end
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
                ###
         
     | 
| 
      
 121 
     | 
    
         
            +
                # Parse and return a Time from +string+
         
     | 
| 
      
 122 
     | 
    
         
            +
                def parse_time string
         
     | 
| 
      
 123 
     | 
    
         
            +
                  klass = class_loader.load 'Time'
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
                  date, time = *(string.split(/[ tT]/, 2))
         
     | 
| 
      
 126 
     | 
    
         
            +
                  (yy, m, dd) = date.match(/^(-?\d{4})-(\d{1,2})-(\d{1,2})/).captures.map { |x| x.to_i }
         
     | 
| 
      
 127 
     | 
    
         
            +
                  md = time.match(/(\d+:\d+:\d+)(?:\.(\d*))?\s*(Z|[-+]\d+(:\d\d)?)?/)
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                  (hh, mm, ss) = md[1].split(':').map { |x| x.to_i }
         
     | 
| 
      
 130 
     | 
    
         
            +
                  us = (md[2] ? Rational("0.#{md[2]}") : 0) * 1000000
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                  time = klass.utc(yy, m, dd, hh, mm, ss, us)
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                  return time if 'Z' == md[3]
         
     | 
| 
      
 135 
     | 
    
         
            +
                  return klass.at(time.to_i, us) unless md[3]
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                  tz = md[3].match(/^([+\-]?\d{1,2})\:?(\d{1,2})?$/)[1..-1].compact.map { |digit| Integer(digit, 10) }
         
     | 
| 
      
 138 
     | 
    
         
            +
                  offset = tz.first * 3600
         
     | 
| 
      
 139 
     | 
    
         
            +
             
     | 
| 
      
 140 
     | 
    
         
            +
                  if offset < 0
         
     | 
| 
      
 141 
     | 
    
         
            +
                    offset -= ((tz[1] || 0) * 60)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  else
         
     | 
| 
      
 143 
     | 
    
         
            +
                    offset += ((tz[1] || 0) * 60)
         
     | 
| 
      
 144 
     | 
    
         
            +
                  end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
                  klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset)
         
     | 
| 
      
 147 
     | 
    
         
            +
                end
         
     | 
| 
      
 148 
     | 
    
         
            +
              end
         
     | 
| 
      
 149 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/psych/set.rb
    ADDED
    
    
    
        data/lib/psych/stream.rb
    ADDED
    
    | 
         @@ -0,0 +1,38 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 3 
     | 
    
         
            +
              ###
         
     | 
| 
      
 4 
     | 
    
         
            +
              # Psych::Stream is a streaming YAML emitter.  It will not buffer your YAML,
         
     | 
| 
      
 5 
     | 
    
         
            +
              # but send it straight to an IO.
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              # Here is an example use:
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              #   stream = Psych::Stream.new($stdout)
         
     | 
| 
      
 10 
     | 
    
         
            +
              #   stream.start
         
     | 
| 
      
 11 
     | 
    
         
            +
              #   stream.push({:foo => 'bar'})
         
     | 
| 
      
 12 
     | 
    
         
            +
              #   stream.finish
         
     | 
| 
      
 13 
     | 
    
         
            +
              #
         
     | 
| 
      
 14 
     | 
    
         
            +
              # YAML will be immediately emitted to $stdout with no buffering.
         
     | 
| 
      
 15 
     | 
    
         
            +
              #
         
     | 
| 
      
 16 
     | 
    
         
            +
              # Psych::Stream#start will take a block and ensure that Psych::Stream#finish
         
     | 
| 
      
 17 
     | 
    
         
            +
              # is called, so you can do this form:
         
     | 
| 
      
 18 
     | 
    
         
            +
              #
         
     | 
| 
      
 19 
     | 
    
         
            +
              #   stream = Psych::Stream.new($stdout)
         
     | 
| 
      
 20 
     | 
    
         
            +
              #   stream.start do |em|
         
     | 
| 
      
 21 
     | 
    
         
            +
              #     em.push(:foo => 'bar')
         
     | 
| 
      
 22 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 23 
     | 
    
         
            +
              #
         
     | 
| 
      
 24 
     | 
    
         
            +
              class Stream < Psych::Visitors::YAMLTree
         
     | 
| 
      
 25 
     | 
    
         
            +
                class Emitter < Psych::Emitter # :nodoc:
         
     | 
| 
      
 26 
     | 
    
         
            +
                  def end_document implicit_end = !streaming?
         
     | 
| 
      
 27 
     | 
    
         
            +
                    super
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  def streaming?
         
     | 
| 
      
 31 
     | 
    
         
            +
                    true
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                include Psych::Streaming
         
     | 
| 
      
 36 
     | 
    
         
            +
                extend Psych::Streaming::ClassMethods
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 3 
     | 
    
         
            +
              module Streaming
         
     | 
| 
      
 4 
     | 
    
         
            +
                module ClassMethods
         
     | 
| 
      
 5 
     | 
    
         
            +
                  ###
         
     | 
| 
      
 6 
     | 
    
         
            +
                  # Create a new streaming emitter.  Emitter will print to +io+.  See
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # Psych::Stream for an example.
         
     | 
| 
      
 8 
     | 
    
         
            +
                  def new io
         
     | 
| 
      
 9 
     | 
    
         
            +
                    emitter      = const_get(:Emitter).new(io)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    class_loader = ClassLoader.new
         
     | 
| 
      
 11 
     | 
    
         
            +
                    ss           = ScalarScanner.new class_loader
         
     | 
| 
      
 12 
     | 
    
         
            +
                    super(emitter, ss, {})
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                ###
         
     | 
| 
      
 17 
     | 
    
         
            +
                # Start streaming using +encoding+
         
     | 
| 
      
 18 
     | 
    
         
            +
                def start encoding = Nodes::Stream::UTF8
         
     | 
| 
      
 19 
     | 
    
         
            +
                  super.tap { yield self if block_given?  }
         
     | 
| 
      
 20 
     | 
    
         
            +
                ensure
         
     | 
| 
      
 21 
     | 
    
         
            +
                  finish if block_given?
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                private
         
     | 
| 
      
 25 
     | 
    
         
            +
                def register target, obj
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'psych/exception'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 5 
     | 
    
         
            +
              class SyntaxError < Psych::Exception
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_reader :file, :line, :column, :offset, :problem, :context
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def initialize file, line, col, offset, problem, context
         
     | 
| 
      
 9 
     | 
    
         
            +
                  err      = [problem, context].compact.join ' '
         
     | 
| 
      
 10 
     | 
    
         
            +
                  filename = file || '<unknown>'
         
     | 
| 
      
 11 
     | 
    
         
            +
                  message  = "(%s): %s at line %d column %d" % [filename, err, line, col]
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  @file    = file
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @line    = line
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @column  = col
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @offset  = offset
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @problem = problem
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @context = context
         
     | 
| 
      
 19 
     | 
    
         
            +
                  super(message)
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,97 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'psych/handler'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Psych
         
     | 
| 
      
 5 
     | 
    
         
            +
              ###
         
     | 
| 
      
 6 
     | 
    
         
            +
              # This class works in conjunction with Psych::Parser to build an in-memory
         
     | 
| 
      
 7 
     | 
    
         
            +
              # parse tree that represents a YAML document.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # == Example
         
     | 
| 
      
 10 
     | 
    
         
            +
              #
         
     | 
| 
      
 11 
     | 
    
         
            +
              #   parser = Psych::Parser.new Psych::TreeBuilder.new
         
     | 
| 
      
 12 
     | 
    
         
            +
              #   parser.parse('--- foo')
         
     | 
| 
      
 13 
     | 
    
         
            +
              #   tree = parser.handler.root
         
     | 
| 
      
 14 
     | 
    
         
            +
              #
         
     | 
| 
      
 15 
     | 
    
         
            +
              # See Psych::Handler for documentation on the event methods used in this
         
     | 
| 
      
 16 
     | 
    
         
            +
              # class.
         
     | 
| 
      
 17 
     | 
    
         
            +
              class TreeBuilder < Psych::Handler
         
     | 
| 
      
 18 
     | 
    
         
            +
                # Returns the root node for the built tree
         
     | 
| 
      
 19 
     | 
    
         
            +
                attr_reader :root
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                # Create a new TreeBuilder instance
         
     | 
| 
      
 22 
     | 
    
         
            +
                def initialize
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @stack = []
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @last  = nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                  @root  = nil
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                %w{
         
     | 
| 
      
 29 
     | 
    
         
            +
                  Sequence
         
     | 
| 
      
 30 
     | 
    
         
            +
                  Mapping
         
     | 
| 
      
 31 
     | 
    
         
            +
                }.each do |node|
         
     | 
| 
      
 32 
     | 
    
         
            +
                  class_eval %{
         
     | 
| 
      
 33 
     | 
    
         
            +
                    def start_#{node.downcase}(anchor, tag, implicit, style)
         
     | 
| 
      
 34 
     | 
    
         
            +
                      n = Nodes::#{node}.new(anchor, tag, implicit, style)
         
     | 
| 
      
 35 
     | 
    
         
            +
                      @last.children << n
         
     | 
| 
      
 36 
     | 
    
         
            +
                      push n
         
     | 
| 
      
 37 
     | 
    
         
            +
                    end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    def end_#{node.downcase}
         
     | 
| 
      
 40 
     | 
    
         
            +
                      pop
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  }
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                ###
         
     | 
| 
      
 46 
     | 
    
         
            +
                # Handles start_document events with +version+, +tag_directives+,
         
     | 
| 
      
 47 
     | 
    
         
            +
                # and +implicit+ styling.
         
     | 
| 
      
 48 
     | 
    
         
            +
                #
         
     | 
| 
      
 49 
     | 
    
         
            +
                # See Psych::Handler#start_document
         
     | 
| 
      
 50 
     | 
    
         
            +
                def start_document version, tag_directives, implicit
         
     | 
| 
      
 51 
     | 
    
         
            +
                  n = Nodes::Document.new version, tag_directives, implicit
         
     | 
| 
      
 52 
     | 
    
         
            +
                  @last.children << n
         
     | 
| 
      
 53 
     | 
    
         
            +
                  push n
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                ###
         
     | 
| 
      
 57 
     | 
    
         
            +
                # Handles end_document events with +version+, +tag_directives+,
         
     | 
| 
      
 58 
     | 
    
         
            +
                # and +implicit+ styling.
         
     | 
| 
      
 59 
     | 
    
         
            +
                #
         
     | 
| 
      
 60 
     | 
    
         
            +
                # See Psych::Handler#start_document
         
     | 
| 
      
 61 
     | 
    
         
            +
                def end_document implicit_end = !streaming?
         
     | 
| 
      
 62 
     | 
    
         
            +
                  @last.implicit_end = implicit_end
         
     | 
| 
      
 63 
     | 
    
         
            +
                  pop
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                def start_stream encoding
         
     | 
| 
      
 67 
     | 
    
         
            +
                  @root = Nodes::Stream.new(encoding)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  push @root
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                def end_stream
         
     | 
| 
      
 72 
     | 
    
         
            +
                  pop
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
                def scalar value, anchor, tag, plain, quoted, style
         
     | 
| 
      
 76 
     | 
    
         
            +
                  s = Nodes::Scalar.new(value,anchor,tag,plain,quoted,style)
         
     | 
| 
      
 77 
     | 
    
         
            +
                  @last.children << s
         
     | 
| 
      
 78 
     | 
    
         
            +
                  s
         
     | 
| 
      
 79 
     | 
    
         
            +
                end
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                def alias anchor
         
     | 
| 
      
 82 
     | 
    
         
            +
                  @last.children << Nodes::Alias.new(anchor)
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                private
         
     | 
| 
      
 86 
     | 
    
         
            +
                def push value
         
     | 
| 
      
 87 
     | 
    
         
            +
                  @stack.push value
         
     | 
| 
      
 88 
     | 
    
         
            +
                  @last = value
         
     | 
| 
      
 89 
     | 
    
         
            +
                end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                def pop
         
     | 
| 
      
 92 
     | 
    
         
            +
                  x = @stack.pop
         
     | 
| 
      
 93 
     | 
    
         
            +
                  @last = @stack.last
         
     | 
| 
      
 94 
     | 
    
         
            +
                  x
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
              end
         
     | 
| 
      
 97 
     | 
    
         
            +
            end
         
     |