[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 0.25.5-639-g8f94f35

test branch puppet-dev at googlegroups.com
Wed Jul 14 10:32:06 UTC 2010


The following commit has been merged in the upstream branch:
commit b7015d7610497f113479fad5f360aa5e03a458c5
Author: Markus Roberts <Markus at reality.com>
Date:   Mon Nov 23 10:03:47 2009 -0800

    Moving the string interpolation parsing to the parser/lexer
    
    This patch moves the syntactic aspects of string interpolation up
    into the lexer/parser phase, preparatory to moving the semantic
    portions down to the as yet unnamed futures resolution phase.
    
    This is an enabling move, designed to allow:
    
    * Futures resolution in and between interpolated strings
    * Interpolation of hash elements into strings
    * Removal of certain order-dependent paths
    * Further modularization of the lexer/parser
    
    The key change is switching from viewing strings with interpolation
    as single lexical entities (which await later special case processing)
    to viewing them as formulas for constructing strings, with the internal
    structure of the string exposed by the parser.
    
    Thus a string like:
    
        "Hello $name, are you enjoying ${language_feature}?"
    
    internally becomes something like:
    
        concat("Hello ",$name,", are you enjoying ",$language_feature,"?")
    
    where "concat" is an internal string concatenation function.
    
    A few test cases to show the user observable effects of this change:
    
        notice("string with ${'a nested single quoted string'} inside it.")
        $v2 = 3+4
        notice("string with ${['an array ',3,'+',4,'=',$v2]} in it.")
        notice("string with ${(3+5)/4} nested math ops in it.")
    
    ...and so forth.
    
    The key changes in the internals are:
    
    * Unification of SQTEXT and DQTEXT into a new token type STRING (since
      nothing past the lexer cares about the distinction.
    * Creation of several new token types to represent the components of
      an interpolated string:
    
          DQPRE    The initial portion of an interpolated string
          DQMID    The portion of a string betwixt two interpolations
          DQPOST   The final portion of an interpolated string
          DQCONT   The as-yet-unlexed portion after an interpolation
    
      Thus, in the example above (phantom curly braces added for clarity),
    
          DQPRE    "Hello ${
          DQMID    }, are you enjoying ${
          DQPOST   }?"
    
      DQCONT is a bookkeeping token and is never generated.
    * Creation of a DOLLAR_VAR token to strip the "$" off of variables
      with explicit dollar signs, so that the VARIABLEs produced from
      things like "Test ${x}" (where the "$" has already been consumed)
      do not fail for want of a "$"
    * Reworking the grammar rules in the obvious way
    * Introduction of a "concatenation" AST node type (which will be going
      away in a subsequent refactor).
    
    Note finally that this is a component of a set of interrelated refactors,
    and some of the changes around the edges of the above will only makes
    sense in context of the other parts.

diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index 4ad1f9f..caf1d13 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -52,10 +52,8 @@ class Puppet::Parser::AST
 
     # The base string class.
     class String < AST::Leaf
-        # Interpolate the string looking for variables, and then return
-        # the result.
         def evaluate(scope)
-            return scope.strinterp(@value, file, line)
+            @value
         end
 
         def to_s
@@ -74,6 +72,16 @@ class Puppet::Parser::AST
         end
     end
 
+    class Concat < AST::Leaf
+        def evaluate(scope)
+            @value.collect { |x| x.evaluate(scope) }.join
+        end
+
+        def to_s
+            "concat(#{@value.join(',')})"
+        end
+    end
+
     # The 'default' option on case statements and selectors.
     class Default < AST::Leaf; end
 
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index 3e11b25..79bc2b0 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -4,7 +4,8 @@
 
 class Puppet::Parser::Parser
 
-token LBRACK DQTEXT SQTEXT RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE
+token STRING DQPRE DQMID DQPOST
+token LBRACK  RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE
 token FALSE EQUALS APPENDS LESSEQUAL NOTEQUAL DOT COLON LLCOLLECT RRCOLLECT
 token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN
 token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
@@ -428,11 +429,13 @@ funcrvalue:   NAME LPAREN funcvalues RPAREN {
         :ftype => :rvalue
 }
 
-quotedtext: DQTEXT {
-    result = ast AST::String, :value => val[0][:value], :line => val[0][:line]
-}           | SQTEXT {
-    result = ast AST::FlatString, :value => val[0][:value], :line => val[0][:line]
-}
+quotedtext: STRING       { result = ast AST::String, :value => val[0][:value],                  :line => val[0][:line] }           
+          | DQPRE dqrval { result = ast AST::Concat, :value => [ast(AST::String,val[0])]+val[1], :line => val[0][:line] }
+
+dqrval: expression dqtail { result = [val[0]] + val[1] }
+
+dqtail: DQPOST        { result = [ast(AST::String,val[0])]          }
+      | DQMID dqrval  { result = [ast(AST::String,val[0])] + val[1] }
 
 boolean:    BOOLEAN {
     result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
@@ -704,8 +707,7 @@ nodename: hostname {
 }
 
 hostname: NAME { result = val[0][:value] }
-        | SQTEXT { result = val[0][:value] }
-        | DQTEXT { result = val[0][:value] }
+        | STRING { result = val[0][:value] }
         | DEFAULT { result = val[0][:value] }
         | regex
 
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index bb4fdf9..26e6b60 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -11,11 +11,14 @@ end
 module Puppet::Parser; end
 
 class Puppet::Parser::Lexer
-    attr_reader :last, :file, :lexing_context
+    attr_reader :last, :file, :lexing_context, :token_queue
 
     attr_accessor :line, :indefine
 
-    # Our base token class.
+    def lex_error msg
+        raise Puppet::LexError.new(msg)
+    end
+        
     class Token
         attr_accessor :regex, :name, :string, :skip, :incr_line, :skip_text, :accumulate
 
@@ -28,6 +31,7 @@ class Puppet::Parser::Lexer
             end
         end
 
+        # MQR: Why not just alias?
         %w{skip accumulate}.each do |method|
             define_method(method+"?") do
                 self.send(method)
@@ -142,10 +146,13 @@ class Puppet::Parser::Lexer
         '=~' => :MATCH,
         '!~' => :NOMATCH,
         %r{([a-z][-\w]*)?(::[a-z][-\w]*)+} => :CLASSNAME, # Require '::' in the class name, else we'd compete with NAME
-        %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF
-    )
-
-    TOKENS.add_tokens "Whatever" => :DQTEXT, "Nomatter" => :SQTEXT, "alsonomatter" => :BOOLEAN
+        %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF,
+        "<string>" => :STRING, 
+        "<dqstring up to first interpolation>" => :DQPRE,
+        "<dqstring between two interpolations>" => :DQMID,
+        "<dqstring after final interpolation>" => :DQPOST,
+        "<boolean>" => :BOOLEAN
+        )
 
     TOKENS.add_token :NUMBER, %r{\b(?:0[xX][0-9A-Fa-f]+|0?\d+(?:\.\d+)?(?:[eE]-?\d+)?)\b} do |lexer, value|
         [TOKENS[:NAME], value]
@@ -163,6 +170,9 @@ class Puppet::Parser::Lexer
         end
         [string_token, value]
     end
+    def (TOKENS[:NAME]).acceptable?(context={})
+        ![:DQPRE,:DQMID].include? context[:after]
+    end
 
     TOKENS.add_token :COMMENT, %r{#.*}, :accumulate => true, :skip => true do |lexer,value|
         value.sub!(/# ?/,'')
@@ -176,7 +186,7 @@ class Puppet::Parser::Lexer
         [self,value]
     end
 
-    regex_token = TOKENS.add_token :REGEX, %r{/[^/\n]*/} do |lexer, value|
+    TOKENS.add_token :REGEX, %r{/[^/\n]*/} do |lexer, value|
         # Make sure we haven't matched an escaped /
         while value[-2..-2] == '\\'
             other = lexer.scan_until(%r{/})
@@ -186,27 +196,40 @@ class Puppet::Parser::Lexer
         [self, Regexp.new(regex)]
     end
 
-    def regex_token.acceptable?(context={})
+    def (TOKENS[:REGEX]).acceptable?(context={})
         [:NODE,:LBRACE,:RBRACE,:MATCH,:NOMATCH,:COMMA].include? context[:after]
     end
 
     TOKENS.add_token :RETURN, "\n", :skip => true, :incr_line => true, :skip_text => true
 
     TOKENS.add_token :SQUOTE, "'" do |lexer, value|
-        value = lexer.slurpstring(value)
-        [TOKENS[:SQTEXT], value]
+        [TOKENS[:STRING], lexer.slurpstring(value).first ]
     end
 
-    TOKENS.add_token :DQUOTE, '"' do |lexer, value|
-        value = lexer.slurpstring(value)
-        [TOKENS[:DQTEXT], value]
+    DQ_initial_token_types      = {'$' => :DQPRE,'"' => :STRING}
+    DQ_continuation_token_types = {'$' => :DQMID,'"' => :DQPOST}
+
+    TOKENS.add_token :DQUOTE, /"/ do |lexer, value| 
+         lexer.tokenize_interpolated_string(DQ_initial_token_types)
     end
 
-    TOKENS.add_token :VARIABLE, %r{\$(\w*::)*\w+} do |lexer, value|
-        value = value.sub(/^\$/, '')
-        [self, value]
+    TOKENS.add_token :DQCONT, /\}/ do |lexer, value|
+        lexer.tokenize_interpolated_string(DQ_continuation_token_types)
+    end
+    def (TOKENS[:DQCONT]).acceptable?(context={})
+        context[:string_interpolation_depth] > 0
     end
 
+    TOKENS.add_token :DOLLAR_VAR, %r{\$(\w*::)*\w+} do |lexer, value|
+        [TOKENS[:VARIABLE],value[1..-1]]
+    end
+
+    TOKENS.add_token :VARIABLE, %r{(\w*::)*\w+}
+    def (TOKENS[:VARIABLE]).acceptable?(context={})
+        [:DQPRE,:DQMID].include? context[:after]
+    end
+
+
     TOKENS.sort_tokens
 
     @@pairs = {
@@ -244,9 +267,7 @@ class Puppet::Parser::Lexer
     def expected
         return nil if @expected.empty?
         name = @expected[-1]
-        raise "Could not find expected token %s" % name unless token = TOKENS.lookup(name)
-
-        return token
+        TOKENS.lookup(name) or lex_error "Could not find expected token #{name}"
     end
 
     # scan the whole file
@@ -274,22 +295,19 @@ class Puppet::Parser::Lexer
         }
     end
 
-    def find_string_token
-        matched_token = value = nil
+    def shift_token
+        @token_queue.shift
+    end
 
+    def find_string_token
         # We know our longest string token is three chars, so try each size in turn
         # until we either match or run out of chars.  This way our worst-case is three
-        # tries, where it is otherwise the number of string chars we have.  Also,
+        # tries, where it is otherwise the number of string token we have.  Also,
         # the lookups are optimized hash lookups, instead of regex scans.
-        [3, 2, 1].each do |i|
-            str = @scanner.peek(i)
-            if matched_token = TOKENS.lookup(str)
-                value = @scanner.scan(matched_token.regex)
-                break
-            end
-        end
-
-        return matched_token, value
+        # 
+        s = @scanner.peek(3)
+        token = TOKENS.lookup(s[0,3]) || TOKENS.lookup(s[0,2]) || TOKENS.lookup(s[0,1])
+        [ token, token && @scanner.scan(token.regex) ]
     end
 
     # Find the next token that matches a regex.  We look for these first.
@@ -316,7 +334,7 @@ class Puppet::Parser::Lexer
     # Find the next token, returning the string and the token.
     def find_token
         @find += 1
-        find_regex_token || find_string_token
+        shift_token || find_regex_token || find_string_token
     end
 
     def indefine?
@@ -343,10 +361,15 @@ class Puppet::Parser::Lexer
         @skip = %r{[ \t]+}
 
         @namestack = []
+        @token_queue = []
         @indefine = false
         @expected = []
         @commentstack = [ ['', @line] ]
-        @lexing_context = {:after => nil, :start_of_line => true}
+        @lexing_context = {
+            :after => nil, 
+            :start_of_line => true, 
+            :string_interpolation_depth => 0
+            }
     end
 
     # Make any necessary changes to the token and/or value.
@@ -396,28 +419,17 @@ class Puppet::Parser::Lexer
     # this is the heart of the lexer
     def scan
         #Puppet.debug("entering scan")
-        raise Puppet::LexError.new("Invalid or empty string") unless @scanner
+        lex_error "Invalid or empty string" unless @scanner
 
         # Skip any initial whitespace.
         skip()
 
-        until @scanner.eos? do
+        until token_queue.empty? and @scanner.eos? do
             yielded = false
             matched_token, value = find_token
 
             # error out if we didn't match anything at all
-            if matched_token.nil?
-                nword = nil
-                # Try to pull a 'word' out of the remaining string.
-                if @scanner.rest =~ /^(\S+)/
-                    nword = $1
-                elsif @scanner.rest =~ /^(\s+)/
-                    nword = $1
-                else
-                    nword = @scanner.rest
-                end
-                raise "Could not match '%s'" % nword
-            end
+            lex_error "Could not match #{@scanner.rest[/^(\S+|\s+|.*)/]}" unless matched_token
 
             newline = matched_token.name == :RETURN
 
@@ -433,6 +445,8 @@ class Puppet::Parser::Lexer
             end
 
             lexing_context[:after]         = final_token.name unless newline
+            lexing_context[:string_interpolation_depth] += 1 if final_token.name == :DQPRE
+            lexing_context[:string_interpolation_depth] -= 1 if final_token.name == :DQPOST
 
             value = token_value[:value]
 
@@ -481,24 +495,40 @@ class Puppet::Parser::Lexer
         @scanner.scan_until(regex)
     end
 
-    # we've encountered an opening quote...
+    # we've encountered the start of a string...
     # slurp in the rest of the string and return it
-    def slurpstring(quote)
+    Valid_escapes_in_strings = %w{ \\  $ ' " n t s }+["\n"]
+    def slurpstring(terminators)
         # we search for the next quote that isn't preceded by a
         # backslash; the caret is there to match empty strings
-        str = @scanner.scan_until(/([^\\]|^)#{quote}/)
-        if str.nil?
-            raise Puppet::LexError.new("Unclosed quote after '%s' in '%s'" %
-                [self.last,self.rest])
-        else
-            str.sub!(/#{quote}\Z/,"")
-            str.gsub!(/\\#{quote}/,quote)
-        end
-
-        # Add to our line count for every carriage return in multi-line strings.
-        @line += str.count("\n")
+        str = @scanner.scan_until(/([^\\]|^)[#{terminators}]/) or lex_error "Unclosed quote after '#{last}' in '#{rest}'"
+        @line += str.count("\n") # literal carriage returns add to the line count.
+        str.gsub!(/\\(.)/) {
+            case ch=$1
+            when 'n'; "\n"
+            when 't'; "\t"
+            when 's'; " "
+            else
+                if Valid_escapes_in_strings.include? ch
+                    ch
+                else
+                    Puppet.warning "Unrecognised escape sequence '\\#{ch}'#{file && " in file #{file}"}#{line && " at line #{line}"}"
+                     "\\#{ch}"
+                end
+            end
+        }
+        [ str[0..-2],str[-1,1] ]
+    end
 
-        return str
+    def tokenize_interpolated_string(token_type)
+        value,terminator = slurpstring('"$')
+        token_queue << [TOKENS[token_type[terminator]],value]
+        while terminator == '$' and not @scanner.scan(/\{/)
+            token_queue << [TOKENS[:VARIABLE], at scanner.scan(%r{(\w*::)*\w+|[0-9]})]
+            value,terminator = slurpstring('"$')
+            token_queue << [TOKENS[DQ_continuation_token_types[terminator]],value]
+        end
+        token_queue.shift
     end
 
     # just parse a string, not a whole file
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 5eb9e0a..4b274bd 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -25,7 +25,7 @@ module Puppet
 
     class Parser < Racc::Parser
 
-module_eval <<'..end grammar.ra modeval..idfe2b94e6d1', 'grammar.ra', 850
+module_eval <<'..end grammar.ra modeval..id912450e20a', 'grammar.ra', 852
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -37,871 +37,909 @@ require 'puppet/parser/parser_support'
 
 # $Id$
 
-..end grammar.ra modeval..idfe2b94e6d1
+..end grammar.ra modeval..id912450e20a
 
 ##### racc 1.4.5 generates ###
 
 racc_reduce_table = [
  0, 0, :racc_error,
- 1, 63, :_reduce_1,
- 1, 63, :_reduce_none,
- 1, 64, :_reduce_none,
- 2, 64, :_reduce_4,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 1, 66, :_reduce_none,
- 4, 74, :_reduce_18,
- 5, 74, :_reduce_19,
- 3, 74, :_reduce_20,
- 2, 74, :_reduce_21,
- 1, 80, :_reduce_none,
- 1, 80, :_reduce_none,
- 3, 80, :_reduce_24,
- 3, 80, :_reduce_25,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 81, :_reduce_34,
- 5, 67, :_reduce_35,
- 5, 67, :_reduce_36,
- 5, 67, :_reduce_37,
- 5, 78, :_reduce_38,
- 2, 68, :_reduce_39,
- 1, 98, :_reduce_40,
- 2, 98, :_reduce_41,
- 6, 69, :_reduce_42,
- 2, 69, :_reduce_43,
- 3, 99, :_reduce_44,
- 3, 99, :_reduce_45,
- 1, 100, :_reduce_none,
- 1, 100, :_reduce_none,
- 3, 100, :_reduce_48,
- 1, 101, :_reduce_none,
- 3, 101, :_reduce_50,
- 1, 102, :_reduce_51,
- 1, 102, :_reduce_52,
- 3, 103, :_reduce_53,
- 3, 103, :_reduce_54,
+ 1, 67, :_reduce_1,
+ 1, 67, :_reduce_none,
+ 1, 68, :_reduce_none,
+ 2, 68, :_reduce_4,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 1, 70, :_reduce_none,
+ 4, 78, :_reduce_18,
+ 5, 78, :_reduce_19,
+ 3, 78, :_reduce_20,
+ 2, 78, :_reduce_21,
+ 1, 84, :_reduce_none,
+ 1, 84, :_reduce_none,
+ 3, 84, :_reduce_24,
+ 3, 84, :_reduce_25,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_none,
+ 1, 85, :_reduce_34,
+ 5, 71, :_reduce_35,
+ 5, 71, :_reduce_36,
+ 5, 71, :_reduce_37,
+ 5, 82, :_reduce_38,
+ 2, 72, :_reduce_39,
+ 1, 102, :_reduce_40,
+ 2, 102, :_reduce_41,
+ 6, 73, :_reduce_42,
+ 2, 73, :_reduce_43,
+ 3, 103, :_reduce_44,
+ 3, 103, :_reduce_45,
  1, 104, :_reduce_none,
  1, 104, :_reduce_none,
- 4, 106, :_reduce_57,
- 1, 92, :_reduce_none,
- 3, 92, :_reduce_59,
- 0, 93, :_reduce_none,
- 1, 93, :_reduce_none,
- 1, 108, :_reduce_62,
- 1, 83, :_reduce_63,
- 1, 85, :_reduce_64,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 1, 107, :_reduce_none,
- 3, 70, :_reduce_72,
- 3, 70, :_reduce_73,
- 3, 79, :_reduce_74,
- 0, 94, :_reduce_75,
- 1, 94, :_reduce_76,
- 3, 94, :_reduce_77,
- 3, 112, :_reduce_78,
- 3, 114, :_reduce_79,
- 1, 115, :_reduce_none,
- 1, 115, :_reduce_none,
- 0, 97, :_reduce_82,
- 1, 97, :_reduce_83,
- 3, 97, :_reduce_84,
- 1, 116, :_reduce_none,
- 3, 116, :_reduce_86,
+ 3, 104, :_reduce_48,
  1, 105, :_reduce_none,
- 1, 105, :_reduce_none,
- 1, 105, :_reduce_none,
- 1, 105, :_reduce_none,
- 1, 105, :_reduce_none,
- 1, 105, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 1, 113, :_reduce_none,
- 4, 87, :_reduce_105,
- 3, 87, :_reduce_106,
- 1, 89, :_reduce_107,
- 1, 89, :_reduce_108,
- 1, 86, :_reduce_109,
- 4, 82, :_reduce_110,
- 4, 82, :_reduce_111,
- 6, 72, :_reduce_112,
- 5, 72, :_reduce_113,
- 0, 119, :_reduce_none,
- 4, 119, :_reduce_115,
- 3, 119, :_reduce_116,
- 1, 110, :_reduce_none,
- 3, 110, :_reduce_118,
- 3, 110, :_reduce_119,
- 3, 110, :_reduce_120,
- 3, 110, :_reduce_121,
- 3, 110, :_reduce_122,
- 3, 110, :_reduce_123,
- 3, 110, :_reduce_124,
- 3, 110, :_reduce_125,
- 2, 110, :_reduce_126,
- 3, 110, :_reduce_127,
- 3, 110, :_reduce_128,
- 3, 110, :_reduce_129,
- 3, 110, :_reduce_130,
- 3, 110, :_reduce_131,
- 3, 110, :_reduce_132,
- 2, 110, :_reduce_133,
- 3, 110, :_reduce_134,
- 3, 110, :_reduce_135,
- 3, 110, :_reduce_136,
- 5, 71, :_reduce_137,
- 1, 121, :_reduce_none,
- 2, 121, :_reduce_139,
- 5, 122, :_reduce_140,
- 4, 122, :_reduce_141,
- 1, 123, :_reduce_none,
- 3, 123, :_reduce_143,
- 3, 88, :_reduce_144,
- 1, 125, :_reduce_none,
- 4, 125, :_reduce_146,
+ 3, 105, :_reduce_50,
+ 1, 106, :_reduce_51,
+ 1, 106, :_reduce_52,
+ 3, 107, :_reduce_53,
+ 3, 107, :_reduce_54,
+ 1, 108, :_reduce_none,
+ 1, 108, :_reduce_none,
+ 4, 110, :_reduce_57,
+ 1, 96, :_reduce_none,
+ 3, 96, :_reduce_59,
+ 0, 97, :_reduce_none,
+ 1, 97, :_reduce_none,
+ 1, 112, :_reduce_62,
+ 1, 87, :_reduce_63,
+ 1, 89, :_reduce_64,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 1, 111, :_reduce_none,
+ 3, 74, :_reduce_72,
+ 3, 74, :_reduce_73,
+ 3, 83, :_reduce_74,
+ 0, 98, :_reduce_75,
+ 1, 98, :_reduce_76,
+ 3, 98, :_reduce_77,
+ 3, 116, :_reduce_78,
+ 3, 118, :_reduce_79,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 0, 101, :_reduce_82,
+ 1, 101, :_reduce_83,
+ 3, 101, :_reduce_84,
+ 1, 120, :_reduce_none,
+ 3, 120, :_reduce_86,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 1, 109, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 1, 117, :_reduce_none,
+ 4, 91, :_reduce_105,
+ 3, 91, :_reduce_106,
+ 1, 93, :_reduce_107,
+ 2, 93, :_reduce_108,
+ 2, 123, :_reduce_109,
+ 1, 124, :_reduce_110,
+ 2, 124, :_reduce_111,
+ 1, 90, :_reduce_112,
+ 4, 86, :_reduce_113,
+ 4, 86, :_reduce_114,
+ 6, 76, :_reduce_115,
+ 5, 76, :_reduce_116,
+ 0, 125, :_reduce_none,
+ 4, 125, :_reduce_118,
+ 3, 125, :_reduce_119,
+ 1, 114, :_reduce_none,
+ 3, 114, :_reduce_121,
+ 3, 114, :_reduce_122,
+ 3, 114, :_reduce_123,
+ 3, 114, :_reduce_124,
+ 3, 114, :_reduce_125,
+ 3, 114, :_reduce_126,
+ 3, 114, :_reduce_127,
+ 3, 114, :_reduce_128,
+ 2, 114, :_reduce_129,
+ 3, 114, :_reduce_130,
+ 3, 114, :_reduce_131,
+ 3, 114, :_reduce_132,
+ 3, 114, :_reduce_133,
+ 3, 114, :_reduce_134,
+ 3, 114, :_reduce_135,
+ 2, 114, :_reduce_136,
+ 3, 114, :_reduce_137,
+ 3, 114, :_reduce_138,
+ 3, 114, :_reduce_139,
+ 5, 75, :_reduce_140,
  1, 127, :_reduce_none,
- 3, 127, :_reduce_148,
- 3, 126, :_reduce_149,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_none,
- 1, 124, :_reduce_157,
- 1, 124, :_reduce_none,
- 1, 128, :_reduce_159,
- 3, 128, :_reduce_160,
- 2, 73, :_reduce_161,
- 6, 75, :_reduce_162,
- 5, 75, :_reduce_163,
- 7, 76, :_reduce_164,
- 6, 76, :_reduce_165,
- 6, 77, :_reduce_166,
- 5, 77, :_reduce_167,
- 1, 96, :_reduce_168,
- 1, 91, :_reduce_169,
- 1, 91, :_reduce_170,
- 1, 91, :_reduce_171,
- 1, 131, :_reduce_none,
- 3, 131, :_reduce_173,
- 1, 133, :_reduce_174,
- 1, 134, :_reduce_175,
- 1, 134, :_reduce_176,
- 1, 134, :_reduce_177,
- 1, 134, :_reduce_178,
- 1, 134, :_reduce_none,
- 0, 65, :_reduce_180,
- 0, 135, :_reduce_181,
+ 2, 127, :_reduce_142,
+ 5, 128, :_reduce_143,
+ 4, 128, :_reduce_144,
  1, 129, :_reduce_none,
- 3, 129, :_reduce_183,
- 3, 129, :_reduce_184,
- 1, 136, :_reduce_none,
- 3, 136, :_reduce_186,
- 3, 137, :_reduce_187,
- 1, 137, :_reduce_188,
- 3, 137, :_reduce_189,
- 1, 137, :_reduce_190,
- 1, 132, :_reduce_none,
- 2, 132, :_reduce_192,
+ 3, 129, :_reduce_146,
+ 3, 92, :_reduce_147,
+ 1, 131, :_reduce_none,
+ 4, 131, :_reduce_149,
+ 1, 133, :_reduce_none,
+ 3, 133, :_reduce_151,
+ 3, 132, :_reduce_152,
  1, 130, :_reduce_none,
- 2, 130, :_reduce_194,
- 1, 138, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_none,
+ 1, 130, :_reduce_160,
+ 1, 130, :_reduce_none,
+ 1, 134, :_reduce_162,
+ 3, 134, :_reduce_163,
+ 2, 77, :_reduce_164,
+ 6, 79, :_reduce_165,
+ 5, 79, :_reduce_166,
+ 7, 80, :_reduce_167,
+ 6, 80, :_reduce_168,
+ 6, 81, :_reduce_169,
+ 5, 81, :_reduce_170,
+ 1, 100, :_reduce_171,
+ 1, 95, :_reduce_172,
+ 1, 95, :_reduce_173,
+ 1, 95, :_reduce_174,
+ 1, 137, :_reduce_none,
+ 3, 137, :_reduce_176,
+ 1, 139, :_reduce_177,
+ 1, 140, :_reduce_178,
+ 1, 140, :_reduce_179,
+ 1, 140, :_reduce_180,
+ 1, 140, :_reduce_none,
+ 0, 69, :_reduce_182,
+ 0, 141, :_reduce_183,
+ 1, 135, :_reduce_none,
+ 3, 135, :_reduce_185,
+ 3, 135, :_reduce_186,
+ 1, 142, :_reduce_none,
+ 3, 142, :_reduce_188,
+ 3, 143, :_reduce_189,
+ 1, 143, :_reduce_190,
+ 3, 143, :_reduce_191,
+ 1, 143, :_reduce_192,
  1, 138, :_reduce_none,
- 1, 84, :_reduce_197,
- 3, 109, :_reduce_198,
- 4, 109, :_reduce_199,
- 2, 109, :_reduce_200,
- 1, 117, :_reduce_none,
- 1, 117, :_reduce_none,
- 0, 95, :_reduce_none,
- 1, 95, :_reduce_204,
- 1, 120, :_reduce_205,
- 3, 118, :_reduce_206,
- 4, 118, :_reduce_207,
- 2, 118, :_reduce_208,
- 1, 139, :_reduce_none,
- 3, 139, :_reduce_210,
- 3, 140, :_reduce_211,
- 1, 141, :_reduce_212,
- 1, 141, :_reduce_213,
- 1, 141, :_reduce_214,
- 4, 111, :_reduce_215,
- 1, 90, :_reduce_none,
- 4, 90, :_reduce_217 ]
-
-racc_reduce_n = 218
-
-racc_shift_n = 360
+ 2, 138, :_reduce_194,
+ 1, 136, :_reduce_none,
+ 2, 136, :_reduce_196,
+ 1, 144, :_reduce_none,
+ 1, 144, :_reduce_none,
+ 1, 88, :_reduce_199,
+ 3, 113, :_reduce_200,
+ 4, 113, :_reduce_201,
+ 2, 113, :_reduce_202,
+ 1, 121, :_reduce_none,
+ 1, 121, :_reduce_none,
+ 0, 99, :_reduce_none,
+ 1, 99, :_reduce_206,
+ 1, 126, :_reduce_207,
+ 3, 122, :_reduce_208,
+ 4, 122, :_reduce_209,
+ 2, 122, :_reduce_210,
+ 1, 145, :_reduce_none,
+ 3, 145, :_reduce_212,
+ 3, 146, :_reduce_213,
+ 1, 147, :_reduce_214,
+ 1, 147, :_reduce_215,
+ 1, 147, :_reduce_216,
+ 4, 115, :_reduce_217,
+ 1, 94, :_reduce_none,
+ 4, 94, :_reduce_219 ]
+
+racc_reduce_n = 220
+
+racc_shift_n = 365
 
 racc_action_table = [
-    83,    62,    65,   322,    88,   173,   174,   214,   188,   313,
-   279,   216,    43,    44,   150,   281,   122,   282,   278,   187,
-    79,    83,    62,    65,   192,    88,   102,   308,   275,   276,
-   103,    52,   283,    43,    44,    64,    67,    43,    44,    72,
-   175,   120,  -156,   104,    59,    85,   286,    45,    69,   218,
-    47,    93,    52,    58,   173,   174,    64,    67,   176,    46,
-    72,   285,    83,    62,    65,    59,    88,   105,    45,    69,
-    46,    47,    45,   151,   284,    47,   277,   222,   319,   214,
-    46,  -155,    79,    83,    62,    65,   318,    88,    34,   175,
-   221,    46,   151,    52,   290,    46,  -153,    64,    67,    35,
-    36,    72,   293,    79,   275,   276,    59,    85,   164,   188,
-    69,  -150,   201,    93,    52,  -154,   155,   204,    64,    67,
-   187,    46,    72,   262,   296,   192,   263,    59,    85,    37,
-   185,    69,   185,    39,    93,    83,    62,    65,  -152,    88,
-     4,     9,    46,   188,   167,   168,   169,   153,   154,   156,
-   300,   161,   165,   188,   187,    79,    83,    62,    65,   192,
-    88,    37,   201,   142,   187,    39,    52,   204,   289,   192,
-    64,    67,     4,    37,    72,  -154,    79,    39,   303,    59,
-    85,   164,  -155,    69,     4,   305,    93,    52,   151,   155,
-  -151,    64,    67,   181,    46,    72,  -151,   164,    62,    65,
-    59,    85,    37,    46,    69,   155,    39,    93,    83,    62,
-    65,   182,    88,     4,   183,    46,   102,   167,   168,   169,
-   153,   154,   156,  -153,   161,   165,    62,    65,    79,    58,
-    62,    65,  -150,   167,   168,   169,   153,   154,   156,    52,
-   161,   165,   185,    64,    67,   150,   164,    72,   149,    54,
-   226,   344,    59,    85,   155,    46,    69,   169,   153,    93,
-    52,   309,   161,   165,    64,    67,   260,    46,    72,  -168,
-   226,   261,    56,    59,    83,    62,    65,    69,    88,   161,
-   165,   198,   167,   168,   169,   153,   154,   156,    46,   161,
-   165,   161,   165,   115,    79,    83,    62,    65,   214,    88,
-   167,   168,   169,   153,   312,    52,   103,   161,   165,    64,
-    67,   169,   153,    72,  -152,   146,   161,   165,    59,    85,
-   200,   220,    69,   271,   321,    93,    52,   226,   227,   206,
-    64,    67,   209,    46,    72,    34,    83,    62,    65,    59,
-    88,   142,  -152,    69,   167,   168,   169,   153,   154,   156,
-   115,   161,   165,   213,    46,  -150,    79,    83,    62,    65,
-   220,    88,   167,   168,   169,   153,   108,    52,   264,   161,
-   165,    64,    67,   216,   280,    72,   142,    79,   275,   276,
-    59,    85,   345,   309,    69,   224,   347,    93,    52,   226,
-   227,   106,    64,    67,   349,    46,    72,  -152,  -150,  -153,
-  -151,    59,    85,  -155,   216,    69,    51,    50,    93,    83,
-    62,    65,   353,    88,  -204,    40,    46,   167,   168,   169,
-   153,   154,   156,   217,   161,   165,  -151,  -153,   nil,    79,
-    83,    62,    65,   nil,    88,   nil,   nil,   nil,   nil,   nil,
-    52,   nil,   nil,   nil,    64,    67,   nil,   nil,    72,   nil,
-   nil,   nil,   nil,    59,    85,   nil,   nil,    69,   nil,   nil,
-    93,    52,   nil,   nil,   nil,    64,    67,   nil,    46,    72,
-   nil,    83,    62,    65,    59,    88,   nil,   nil,    69,   nil,
-   nil,    83,    62,    65,   nil,    88,   nil,   nil,   nil,    46,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    83,    62,    65,
-   nil,    88,    52,   nil,   nil,   nil,    64,    67,   nil,   nil,
-    72,   nil,    52,   nil,   nil,    59,    64,    67,   nil,    69,
-    72,   nil,    83,    62,    65,    59,    88,   nil,    52,    69,
-    46,   nil,    64,    67,   nil,   nil,    72,   nil,   nil,   nil,
-    46,    59,   nil,   nil,   nil,    69,   nil,    83,    62,    65,
-   nil,    88,   nil,    52,   nil,   nil,    46,    64,    67,   nil,
-   nil,    72,   nil,   nil,   nil,   nil,    59,    79,   nil,   nil,
-    69,   nil,   nil,    83,    62,    65,   nil,    88,    52,   nil,
-   nil,    46,    64,    67,   nil,   nil,    72,   nil,   nil,   nil,
-   nil,    59,    85,    79,   nil,    69,   nil,   nil,    93,    83,
-    62,    65,   nil,    88,    52,   nil,    46,   nil,    64,    67,
-   nil,   nil,    72,   nil,   nil,   nil,   nil,    59,    85,   nil,
-   nil,    69,   nil,   nil,    93,    83,    62,    65,   nil,    88,
-    52,   nil,    46,   nil,    64,    67,   nil,   nil,    72,   nil,
-   nil,   nil,   nil,    59,   nil,    79,   nil,    69,   nil,   nil,
-   nil,    83,    62,    65,   nil,    88,    52,   nil,    46,   nil,
-    64,    67,   nil,   nil,    72,   nil,   nil,   nil,   nil,    59,
-    85,    79,   nil,    69,   nil,   nil,    93,    83,    62,    65,
-   nil,   nil,    52,   nil,    46,   nil,    64,    67,   nil,   nil,
-    72,   nil,   nil,   nil,   nil,    59,    85,   nil,   nil,    69,
-   nil,   nil,    93,    83,    62,    65,   nil,    88,    52,   nil,
-    46,   nil,    64,   129,   nil,   nil,    72,   nil,   nil,   nil,
-   nil,   127,   nil,    79,   nil,    69,   nil,   nil,   nil,    83,
-    62,    65,   nil,    88,    52,   nil,    46,   nil,    64,    67,
-   nil,   nil,    72,   nil,   nil,   nil,   nil,    59,    85,    79,
-   nil,    69,   nil,   nil,    93,    83,    62,    65,   nil,    88,
-    52,   nil,    46,   nil,    64,    67,   nil,   nil,    72,   nil,
-   nil,   nil,   nil,    59,    85,    79,   nil,    69,   nil,   nil,
-    93,    83,    62,    65,   nil,    88,    52,   nil,    46,   nil,
-    64,    67,   nil,   nil,    72,   nil,   nil,   nil,   nil,    59,
-    85,    79,   nil,    69,   nil,   nil,    93,    83,    62,    65,
-   nil,    88,    52,   nil,    46,   nil,    64,    67,   nil,   nil,
-    72,   nil,   nil,   nil,   nil,    59,    85,    62,    65,    69,
-   nil,   nil,    93,    83,    62,    65,   nil,    88,    52,   nil,
-    46,   nil,    64,    67,   nil,   nil,    72,    83,    62,    65,
-   nil,    59,   nil,   nil,   nil,    69,   nil,   187,   nil,   nil,
-   nil,    64,   232,   nil,    52,    72,    46,   nil,    64,    67,
-   127,   nil,    72,   nil,    69,   nil,   nil,    59,    52,    62,
-    65,    69,    64,   232,   nil,    46,    72,   nil,   nil,   nil,
-   nil,   127,    46,   nil,   nil,    69,    83,    62,    65,   302,
-    88,   nil,   nil,    83,    62,    65,    46,    88,   nil,    52,
-   nil,   nil,   nil,    64,    67,   nil,   nil,    72,   nil,   nil,
-   nil,    56,    59,    79,   nil,   nil,    69,    52,   nil,   nil,
-   nil,    64,    67,   nil,    52,    72,   nil,    46,    64,    67,
-    59,   nil,    72,   nil,    69,   nil,   nil,    59,    85,   nil,
-   nil,    69,   nil,   nil,    93,    46,    83,    62,    65,   170,
-    88,   nil,    46,    83,    62,    65,   nil,    88,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    83,    62,    65,   nil,    88,   nil,    52,   nil,   nil,
-   nil,    64,    67,   nil,    52,    72,   nil,   nil,    64,    67,
-    59,    79,    72,   nil,    69,   nil,   nil,    59,    62,    65,
-   nil,    69,    52,   nil,   nil,    46,    64,    67,   nil,   nil,
-    72,   nil,    46,   nil,   nil,    59,    85,    62,    65,    69,
-   nil,   nil,    93,    83,    62,    65,   nil,    88,   187,   nil,
-    46,   nil,    64,   232,   nil,   nil,    72,   nil,   nil,   nil,
-   nil,   127,   nil,    79,   nil,    69,   nil,   187,   nil,    62,
-    65,    64,   232,   nil,    52,    72,    46,   nil,    64,    67,
-   127,   nil,    72,   nil,    69,   nil,   nil,    59,    85,   nil,
-   nil,    69,   nil,   nil,    93,    46,   nil,   nil,   nil,   187,
-    62,    65,    46,    64,   232,   nil,   nil,    72,   nil,   nil,
-    62,    65,   127,   234,   nil,   nil,    69,   nil,   nil,   nil,
-   239,   nil,   nil,   nil,   nil,   nil,   nil,    46,   nil,   nil,
-    52,    62,    65,   nil,    64,    67,   nil,   nil,    72,   nil,
-   187,   nil,    56,    59,    64,   232,   nil,    69,    72,    62,
-    65,   nil,   nil,   127,   nil,   nil,   nil,    69,    46,   nil,
-   nil,    52,   nil,    62,    65,    64,    67,   nil,    46,    72,
-   nil,   nil,   nil,    56,    59,   nil,   nil,   nil,    69,   187,
-   nil,    62,    65,    64,   232,   317,   nil,    72,   nil,    46,
-   nil,   nil,   127,   187,   nil,   nil,    69,    64,   232,   nil,
-   nil,    72,    62,    65,   nil,   nil,   127,    46,   nil,   nil,
-    69,   187,   nil,   nil,   nil,    64,   232,   nil,   nil,    72,
-   nil,    46,   144,   nil,   127,   nil,   nil,   nil,    69,   nil,
-   nil,   nil,    52,   166,   nil,   nil,    64,    67,   nil,    46,
-    72,   nil,   159,   164,    56,    59,   nil,   nil,   nil,    69,
-   nil,   155,   157,   160,   163,   159,   164,   nil,   nil,   nil,
-    46,   nil,   nil,   nil,   155,   157,   160,   163,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   158,   162,   nil,   nil,   167,
-   168,   169,   153,   154,   156,   nil,   161,   165,   nil,   162,
-   nil,   nil,   167,   168,   169,   153,   154,   156,   nil,   161,
-   165,   159,   164,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   155,   157,   160,   163,   159,   164,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   155,   157,   160,   163,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   167,   168,
-   169,   153,   154,   156,   nil,   161,   165,   158,   162,   nil,
-   nil,   167,   168,   169,   153,   154,   156,   nil,   161,   165,
-   159,   164,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   155,
-   157,   160,   163,   159,   164,   nil,   nil,   nil,   nil,   nil,
-   nil,   241,   155,   157,   160,   163,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   158,   162,   nil,   nil,   167,   168,   169,
-   153,   154,   156,   nil,   161,   165,   158,   162,   nil,   nil,
-   167,   168,   169,   153,   154,   156,   337,   161,   165,   159,
-   164,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   155,   157,
-   160,   163,   nil,   nil,   nil,   nil,   nil,    19,   nil,    23,
-    27,   nil,     1,     5,   354,    12,   nil,    17,   nil,    21,
-   nil,    28,   158,   162,     4,     9,   167,   168,   169,   153,
-   154,   156,   nil,   161,   165,    19,   356,    23,    27,   nil,
-     1,     5,   nil,    12,   nil,    17,   nil,    21,   nil,    28,
-   nil,   nil,     4,     9,   nil,   350,   nil,    19,   nil,    23,
-    27,   nil,     1,     5,   nil,    12,   nil,    17,   nil,    21,
-   nil,    28,   nil,   nil,     4,     9,    19,   339,    23,    27,
-   nil,     1,     5,   nil,    12,   nil,    17,   nil,    21,   nil,
-    28,   nil,   nil,     4,     9,   nil,   351,   nil,    19,   nil,
-    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,   nil,
-    21,   nil,    28,   nil,   nil,     4,     9,    19,   332,    23,
-    27,   nil,     1,     5,   nil,    12,   nil,    17,   nil,    21,
-   nil,    28,   nil,   nil,     4,     9,   nil,   255,   nil,    19,
-   nil,    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,
-   nil,    21,   nil,    28,   nil,   nil,     4,     9,    19,   291,
-    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,   nil,
-    21,   nil,    28,   nil,   nil,     4,     9,   nil,   311,   nil,
-    19,   nil,    23,    27,   nil,     1,     5,   nil,    12,   nil,
-    17,   nil,    21,   nil,    28,   nil,   nil,     4,     9,    19,
-   358,    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,
-   nil,    21,   nil,    28,   nil,   nil,     4,     9,   nil,   359,
-   nil,    19,   nil,    23,    27,   nil,     1,     5,   nil,    12,
-   nil,    17,   nil,    21,   nil,    28,   nil,   nil,     4,     9,
-    19,   nil,    23,    27,   nil,     1,     5,   nil,    12,   nil,
-    17,   nil,    21,   nil,    28,   nil,   nil,     4,     9,    19,
-   nil,    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,
-   nil,    21,   nil,    28,   nil,   nil,     4,     9,    19,   nil,
-    23,    27,   nil,     1,     5,   nil,    12,   nil,    17,   nil,
-    21,   nil,    28,   nil,   nil,     4,     9 ]
+    66,    69,    51,   330,   101,   116,   104,    51,    77,   219,
+   293,   219,   202,   316,   136,   289,   115,   203,   234,    66,
+    69,   120,    92,   101,   162,   104,   162,   202,   290,    66,
+    69,   235,   203,    64,   190,   209,   210,    78,    80,   138,
+    54,    86,   286,    58,   287,    54,    72,    99,    58,   288,
+    82,   284,    64,    88,    66,    69,    78,    80,   191,   193,
+    86,    56,   115,    56,   283,    72,    78,   249,    56,    82,
+    86,   163,    66,    69,    34,   149,  -153,   241,    35,    82,
+    56,    40,   116,    41,   321,    10,    51,    64,    66,    69,
+    56,    78,    80,   115,   276,    86,    42,   275,   120,    70,
+    72,  -154,    66,    69,    82,    64,   101,   277,   104,    78,
+    80,   192,   116,    86,   164,    56,   222,    70,    72,   163,
+    38,   115,    82,   115,    54,    78,   249,    58,   120,    86,
+   116,    66,    69,    56,   149,    64,   283,   250,    82,    78,
+    80,   115,   190,    86,   209,   210,   120,    56,    72,    56,
+   334,    34,    82,    66,    69,    35,  -159,   101,   335,   104,
+  -155,    46,    10,    56,   115,   213,   191,   193,    78,   249,
+    44,    45,    86,   212,   306,    92,   128,   149,    34,    66,
+    69,    82,    35,    77,    34,   310,    64,  -158,    35,    10,
+    78,    80,    56,   274,    86,    10,    15,   215,   273,    72,
+    99,    68,   311,    82,    66,    69,    88,   160,   101,   128,
+   104,  -171,    64,  -156,    56,   317,    78,    80,    66,    69,
+    86,  -157,   168,   169,    70,    72,    92,   177,   181,    82,
+    66,    69,   177,   181,   101,  -158,   104,    64,   168,   169,
+    56,    78,    80,   177,   181,    86,   177,   181,   215,   350,
+    72,    99,    66,    69,    82,   240,   101,    88,   104,   215,
+   217,    66,    69,    64,   320,    56,    56,    78,    80,   162,
+    46,    86,   324,  -157,    92,  -155,    72,    66,    69,  -153,
+    82,   101,   218,   104,    56,    64,   215,   217,   194,    78,
+    80,    56,   208,    86,   197,  -154,   209,   210,    72,    99,
+    40,  -156,    82,    66,    69,    88,   200,   101,    41,   104,
+    64,   111,   206,    56,    78,    80,   131,   327,    86,   197,
+   328,   219,   128,    72,    66,    69,   124,    82,   101,   221,
+   104,   336,   197,   223,   111,   225,    64,   229,    56,   108,
+    78,    80,  -156,  -154,    86,    66,    69,  -158,  -155,    72,
+  -153,   343,   333,    82,    60,    59,   221,    64,   221,  -153,
+   327,    78,    80,   353,    56,    86,   231,    66,    69,   355,
+    72,   101,  -155,   104,    82,   230,   358,  -206,   115,    43,
+    37,  -154,    78,   249,  -156,    56,    86,   nil,    66,    69,
+   nil,   149,   101,   nil,   104,    82,   nil,   nil,   nil,   nil,
+    64,   nil,   nil,   nil,    78,    80,    56,   nil,    86,   nil,
+    66,    69,   nil,    72,   101,   nil,   104,    82,   nil,   nil,
+   nil,    64,   nil,   nil,   nil,    78,    80,   nil,    56,    86,
+   nil,   nil,    92,   nil,    72,   nil,    66,    69,    82,   nil,
+   101,   nil,   104,    64,   nil,   nil,   nil,    78,    80,    56,
+   nil,    86,   nil,   nil,   nil,   nil,    72,    99,    92,   nil,
+    82,   nil,   nil,    88,   nil,   nil,    66,    69,   nil,    64,
+   101,    56,   104,    78,    80,   nil,   nil,    86,   nil,   nil,
+   nil,   nil,    72,    99,   nil,   nil,    82,   nil,    92,    88,
+   nil,   nil,    66,    69,   nil,   nil,   101,    56,   104,    64,
+   nil,   nil,   nil,    78,    80,   nil,   nil,    86,   nil,   nil,
+   nil,   nil,    72,    99,    92,   nil,    82,    66,    69,    88,
+   nil,   101,   nil,   104,   nil,    64,   nil,    56,   nil,    78,
+    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,    99,
+   nil,   nil,    82,    66,    69,    88,   nil,   101,   nil,   104,
+    64,   nil,   nil,    56,    78,    80,   nil,   nil,    86,   nil,
+   nil,   nil,   nil,    72,   nil,    92,   nil,    82,   nil,    66,
+    69,   nil,   nil,   101,   nil,   104,    64,   nil,    56,   nil,
+    78,    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,
+    99,    92,   nil,    82,   nil,   nil,    88,   nil,   nil,    66,
+    69,   nil,    64,   101,    56,   104,    78,    80,   nil,   nil,
+    86,   nil,   nil,   nil,   nil,    72,    99,   nil,   nil,    82,
+   nil,    92,    88,   nil,   nil,    66,    69,   nil,   nil,   101,
+    56,   104,    64,   nil,   nil,   nil,    78,    80,   nil,   nil,
+    86,   nil,   nil,   nil,   nil,    72,    99,    92,   nil,    82,
+    66,    69,    88,   nil,   101,   nil,   nil,   nil,    64,   nil,
+    56,   nil,    78,    80,   nil,   nil,    86,   nil,   nil,   nil,
+   nil,    72,    99,   nil,   nil,    82,    66,    69,    88,   nil,
+   101,   nil,   104,    64,   nil,   nil,    56,    78,   152,   nil,
+   nil,    86,   nil,   nil,   nil,   nil,   149,   nil,    92,   nil,
+    82,   nil,    66,    69,   nil,   nil,   101,   nil,   104,    64,
+   nil,    56,   nil,    78,    80,   nil,   nil,    86,   nil,   nil,
+   nil,   nil,    72,    99,    92,   nil,    82,   nil,   nil,    88,
+   nil,   nil,    66,    69,   nil,    64,   101,    56,   104,    78,
+    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,    99,
+    66,    69,    82,   nil,    92,    88,   nil,   nil,   nil,   183,
+   167,   168,   169,    56,   nil,    64,   177,   181,   nil,    78,
+    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,    99,
+    66,    69,    82,   115,   101,    88,   104,    78,   249,   nil,
+   nil,    86,   nil,    56,   nil,   nil,   149,   nil,   nil,   nil,
+    82,   nil,    92,   nil,   nil,    66,    69,   183,   167,   168,
+   169,    56,   nil,    64,   177,   181,   nil,    78,    80,   nil,
+   nil,    86,   nil,   nil,   nil,   nil,    72,    99,   156,   nil,
+    82,    66,    69,    88,   nil,   101,   nil,   104,    64,   nil,
+   nil,    56,    78,    80,   nil,   nil,    86,   nil,   nil,   nil,
+    70,    72,   nil,    92,   nil,    82,    66,    69,    66,    69,
+   nil,   nil,   101,   nil,    64,   nil,    56,   nil,    78,    80,
+   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,    99,   318,
+   nil,    82,   nil,   nil,    88,   nil,   nil,   nil,   nil,    64,
+   nil,    64,    56,    78,    80,    78,   249,    86,   nil,    86,
+   nil,    70,    72,   nil,   149,   nil,    82,   nil,    82,    66,
+    69,   nil,   nil,   101,   nil,   104,   nil,    56,   nil,    56,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    66,    69,
+   nil,    92,   101,   nil,   104,    66,    69,   nil,   nil,   101,
+   nil,   104,    64,   nil,   nil,   nil,    78,    80,   nil,   nil,
+    86,   nil,   nil,   nil,   nil,    72,    99,    66,    69,    82,
+   nil,    64,    88,   nil,   nil,    78,    80,   nil,    64,    86,
+    56,   nil,    78,    80,    72,   nil,    86,   nil,    82,   nil,
+   nil,    72,    66,    69,   nil,    82,   101,   nil,   104,    56,
+   115,   nil,    66,    69,    78,   249,    56,   nil,    86,   nil,
+   nil,   nil,   nil,   149,   nil,   nil,   nil,    82,    66,    69,
+   nil,   nil,   101,   185,   104,    64,   nil,   nil,    56,    78,
+    80,   nil,   nil,    86,   nil,   115,    66,    69,    72,    78,
+   249,   nil,    82,    86,   nil,   nil,   nil,   nil,   149,   nil,
+   nil,    64,    82,    56,   nil,    78,    80,   nil,   nil,    86,
+   nil,    66,    69,    56,    72,   101,   nil,   104,    82,   115,
+   nil,   nil,   nil,    78,   249,   nil,   nil,    86,   nil,    56,
+   nil,   nil,   149,    92,   nil,   nil,    82,    66,    69,   nil,
+   nil,   101,   nil,   104,    64,   nil,   nil,    56,    78,    80,
+   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,    99,    92,
+   nil,    82,   nil,   nil,    88,   nil,   nil,    66,    69,   nil,
+    64,   101,    56,   104,    78,    80,   nil,   nil,    86,   nil,
+   nil,   nil,   nil,    72,    99,   nil,   nil,    82,   nil,    92,
+    88,   nil,   nil,    66,    69,   nil,   nil,   101,    56,   104,
+    64,   nil,   nil,   nil,    78,    80,   nil,   nil,    86,   nil,
+   nil,   nil,   nil,    72,    99,    92,   nil,    82,   nil,   nil,
+    88,   nil,   nil,    66,    69,   nil,    64,   101,    56,   104,
+    78,    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,
+    99,   nil,   nil,    82,   nil,    92,    88,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,    56,   nil,    64,   nil,   237,   238,
+    78,    80,   nil,   nil,    86,   nil,   nil,   nil,   nil,    72,
+    99,   175,   180,    82,   nil,   nil,    88,   182,   nil,   nil,
+   171,   173,   176,   179,    56,   nil,   175,   180,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   171,   173,   176,   179,   nil,
+   nil,   nil,   nil,   nil,   174,   178,   nil,   nil,   183,   167,
+   168,   169,   170,   172,   nil,   177,   181,   nil,   nil,   174,
+   178,   nil,   nil,   183,   167,   168,   169,   170,   172,   nil,
+   177,   181,   175,   180,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   171,   173,   176,   179,   175,   180,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   171,   173,   176,   179,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   174,   178,   nil,   nil,   183,
+   167,   168,   169,   170,   172,   nil,   177,   181,   174,   178,
+   nil,   nil,   183,   167,   168,   169,   170,   172,   nil,   177,
+   181,   175,   180,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   171,   173,   176,   179,   175,   180,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   171,   173,   176,   179,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   174,   178,   nil,   nil,   183,   167,
+   168,   169,   170,   172,   nil,   177,   181,   nil,   nil,   nil,
+   nil,   183,   167,   168,   169,   170,   172,   nil,   177,   181,
+   175,   180,   nil,   nil,   nil,   nil,   nil,   nil,   254,   171,
+   173,   176,   179,   175,   180,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   171,   173,   176,   179,   nil,   180,   nil,   nil,
+   nil,   nil,   nil,   174,   178,   171,   nil,   183,   167,   168,
+   169,   170,   172,   nil,   177,   181,   nil,   178,   180,   nil,
+   183,   167,   168,   169,   170,   172,   171,   177,   181,   nil,
+   nil,   180,   nil,   183,   167,   168,   169,   170,   172,   171,
+   177,   181,   180,   nil,   183,   167,   168,   169,   170,   172,
+   171,   177,   181,   nil,   183,   167,   168,   169,   170,   172,
+   nil,   177,   181,   nil,   nil,   nil,   342,   183,   167,   168,
+   169,   170,   172,   nil,   177,   181,   nil,   nil,   183,   167,
+   168,   169,   170,   172,   nil,   177,   181,    27,   345,    32,
+     1,   nil,     7,    11,   nil,    18,   nil,    25,   nil,    29,
+   nil,     2,   nil,   nil,    10,    15,   nil,   325,   nil,    27,
+   nil,    32,     1,   nil,     7,    11,   nil,    18,   nil,    25,
+   nil,    29,   nil,     2,   nil,   nil,    10,    15,    27,   346,
+    32,     1,   nil,     7,    11,   nil,    18,   nil,    25,   nil,
+    29,   nil,     2,   nil,   nil,    10,    15,   nil,   356,   nil,
+    27,   nil,    32,     1,   nil,     7,    11,   nil,    18,   nil,
+    25,   nil,    29,   nil,     2,   nil,   nil,    10,    15,    27,
+   313,    32,     1,   nil,     7,    11,   nil,    18,   nil,    25,
+   nil,    29,   nil,     2,   nil,   nil,    10,    15,   nil,   271,
+   nil,    27,   nil,    32,     1,   nil,     7,    11,   nil,    18,
+   nil,    25,   nil,    29,   nil,     2,   nil,   nil,    10,    15,
+    27,   360,    32,     1,   nil,     7,    11,   nil,    18,   nil,
+    25,   nil,    29,   nil,     2,   nil,   nil,    10,    15,   nil,
+   362,   nil,    27,   nil,    32,     1,   nil,     7,    11,   nil,
+    18,   nil,    25,   nil,    29,   nil,     2,   nil,   nil,    10,
+    15,    27,   363,    32,     1,   nil,     7,    11,   nil,    18,
+   nil,    25,   nil,    29,   nil,     2,   nil,   nil,    10,    15,
+   nil,   292,   nil,    27,   nil,    32,     1,   nil,     7,    11,
+   nil,    18,   nil,    25,   nil,    29,   nil,     2,   nil,   nil,
+    10,    15,    27,   364,    32,     1,   nil,     7,    11,   nil,
+    18,   nil,    25,   nil,    29,   nil,     2,   nil,   nil,    10,
+    15,   nil,   nil,   nil,    27,   nil,    32,     1,   nil,     7,
+    11,   nil,    18,   nil,    25,   nil,    29,   nil,     2,   nil,
+   nil,    10,    15,    27,   nil,    32,     1,   nil,     7,    11,
+   nil,    18,   nil,    25,   nil,    29,   nil,     2,   nil,   nil,
+    10,    15,    27,   nil,    32,     1,   nil,     7,    11,   nil,
+    18,   nil,    25,   nil,    29,   nil,     2,   nil,   nil,    10,
+    15,   183,   167,   168,   169,   170,   172,   nil,   177,   181 ]
 
 racc_action_check = [
-    93,    93,    93,   273,    93,   263,   263,   142,   274,   263,
-   193,   298,    12,    12,   240,   199,    49,   201,   193,   274,
-    93,   146,   146,   146,   274,   146,    24,   240,   273,   273,
-    24,    93,   202,   120,   120,    93,    93,   122,   122,    93,
-   263,    49,    94,    24,    93,    93,   204,    12,    93,   142,
-    12,    93,   146,    67,    88,    88,   146,   146,    88,    93,
-   146,   203,   153,   153,   153,   146,   153,    24,   120,   146,
-    12,   120,   122,    67,   203,   122,   189,   145,   267,   129,
-   146,    95,   153,   154,   154,   154,   267,   154,     1,    88,
-   145,   120,   129,   153,   207,   122,    90,   153,   153,     1,
-     1,   153,   212,   154,   189,   189,   153,   153,   252,   105,
-   153,    89,   115,   153,   154,    96,   252,   115,   154,   154,
-   105,   153,   154,   177,   215,   105,   177,   154,   154,    31,
-   216,   154,   217,    31,   154,   155,   155,   155,    82,   155,
-    31,    31,   154,   104,   252,   252,   252,   252,   252,   252,
-   219,   252,   252,   188,   104,   155,   156,   156,   156,   104,
-   156,   206,   285,   220,   188,   206,   155,   285,   206,   188,
-   155,   155,   206,     5,   155,    78,   156,     5,   223,   155,
-   155,   248,    76,   155,     5,   229,   155,   156,   232,   248,
-    74,   156,   156,    98,   155,   156,    92,   249,   182,   182,
-   156,   156,    27,   165,   156,   249,    27,   156,   157,   157,
-   157,   100,   157,    27,   101,   156,    73,   248,   248,   248,
-   248,   248,   248,    71,   248,   248,    23,    23,   157,    17,
-    17,    17,    70,   249,   249,   249,   249,   249,   249,   157,
-   249,   249,   103,   157,   157,    63,   246,   157,    61,    17,
-   307,   307,   157,   157,   246,   161,   157,   258,   258,   157,
-    17,   255,   258,   258,    17,    17,   171,   157,    17,    59,
-   171,   171,    17,    17,    19,    19,    19,    17,    19,   259,
-   259,   106,   246,   246,   246,   246,   246,   246,    17,   246,
-   246,   242,   242,   107,    19,    21,    21,    21,   185,    21,
-   245,   245,   245,   245,   261,    19,   111,   245,   245,    19,
-    19,   257,   257,    19,    57,    55,   257,   257,    19,    19,
-   112,   270,    19,   184,   272,    19,    21,   184,   184,   116,
-    21,    21,   119,    19,    21,    52,   158,   158,   158,    21,
-   158,    51,   124,    21,   253,   253,   253,   253,   253,   253,
-    38,   253,   253,   128,    21,   130,   158,   159,   159,   159,
-   143,   159,   243,   243,   243,   243,    28,   158,   179,   243,
-   243,   158,   158,   131,   197,   158,   183,   159,   197,   197,
-   158,   158,   309,   311,   158,   148,   318,   158,   159,   148,
-   148,    26,   159,   159,   320,   158,   159,   325,   326,   328,
-   329,   159,   159,   330,   186,   159,    16,    13,   159,   160,
-   160,   160,   343,   160,   344,     6,   159,   244,   244,   244,
-   244,   244,   244,   135,   244,   244,   134,   132,   nil,   160,
-   305,   305,   305,   nil,   305,   nil,   nil,   nil,   nil,   nil,
-   160,   nil,   nil,   nil,   160,   160,   nil,   nil,   160,   nil,
-   nil,   nil,   nil,   160,   160,   nil,   nil,   160,   nil,   nil,
-   160,   305,   nil,   nil,   nil,   305,   305,   nil,   160,   305,
-   nil,   225,   225,   225,   305,   225,   nil,   nil,   305,   nil,
-   nil,   102,   102,   102,   nil,   102,   nil,   nil,   nil,   305,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   286,   286,   286,
-   nil,   286,   225,   nil,   nil,   nil,   225,   225,   nil,   nil,
-   225,   nil,   102,   nil,   nil,   225,   102,   102,   nil,   225,
-   102,   nil,    34,    34,    34,   102,    34,   nil,   286,   102,
-   225,   nil,   286,   286,   nil,   nil,   286,   nil,   nil,   nil,
-   102,   286,   nil,   nil,   nil,   286,   nil,    35,    35,    35,
-   nil,    35,   nil,    34,   nil,   nil,   286,    34,    34,   nil,
-   nil,    34,   nil,   nil,   nil,   nil,    34,    35,   nil,   nil,
-    34,   nil,   nil,    36,    36,    36,   nil,    36,    35,   nil,
-   nil,    34,    35,    35,   nil,   nil,    35,   nil,   nil,   nil,
-   nil,    35,    35,    36,   nil,    35,   nil,   nil,    35,   282,
-   282,   282,   nil,   282,    36,   nil,    35,   nil,    36,    36,
-   nil,   nil,    36,   nil,   nil,   nil,   nil,    36,    36,   nil,
-   nil,    36,   nil,   nil,    36,    40,    40,    40,   nil,    40,
-   282,   nil,    36,   nil,   282,   282,   nil,   nil,   282,   nil,
-   nil,   nil,   nil,   282,   nil,    40,   nil,   282,   nil,   nil,
-   nil,   163,   163,   163,   nil,   163,    40,   nil,   282,   nil,
-    40,    40,   nil,   nil,    40,   nil,   nil,   nil,   nil,    40,
-    40,   163,   nil,    40,   nil,   nil,    40,    50,    50,    50,
-   nil,   nil,   163,   nil,    40,   nil,   163,   163,   nil,   nil,
-   163,   nil,   nil,   nil,   nil,   163,   163,   nil,   nil,   163,
-   nil,   nil,   163,   164,   164,   164,   nil,   164,    50,   nil,
-   163,   nil,    50,    50,   nil,   nil,    50,   nil,   nil,   nil,
-   nil,    50,   nil,   164,   nil,    50,   nil,   nil,   nil,   167,
-   167,   167,   nil,   167,   164,   nil,    50,   nil,   164,   164,
-   nil,   nil,   164,   nil,   nil,   nil,   nil,   164,   164,   167,
-   nil,   164,   nil,   nil,   164,   168,   168,   168,   nil,   168,
-   167,   nil,   164,   nil,   167,   167,   nil,   nil,   167,   nil,
-   nil,   nil,   nil,   167,   167,   168,   nil,   167,   nil,   nil,
-   167,   169,   169,   169,   nil,   169,   168,   nil,   167,   nil,
-   168,   168,   nil,   nil,   168,   nil,   nil,   nil,   nil,   168,
-   168,   169,   nil,   168,   nil,   nil,   168,   264,   264,   264,
-   nil,   264,   169,   nil,   168,   nil,   169,   169,   nil,   nil,
-   169,   nil,   nil,   nil,   nil,   169,   169,   234,   234,   169,
-   nil,   nil,   169,    58,    58,    58,   nil,    58,   264,   nil,
-   169,   nil,   264,   264,   nil,   nil,   264,   213,   213,   213,
-   nil,   264,   nil,   nil,   nil,   264,   nil,   234,   nil,   nil,
-   nil,   234,   234,   nil,    58,   234,   264,   nil,    58,    58,
-   234,   nil,    58,   nil,   234,   nil,   nil,    58,   213,   222,
-   222,    58,   213,   213,   nil,   234,   213,   nil,   nil,   nil,
-   nil,   213,    58,   nil,   nil,   213,   214,   214,   214,   222,
-   214,   nil,   nil,    85,    85,    85,   213,    85,   nil,   222,
-   nil,   nil,   nil,   222,   222,   nil,   nil,   222,   nil,   nil,
-   nil,   222,   222,    85,   nil,   nil,   222,   214,   nil,   nil,
-   nil,   214,   214,   nil,    85,   214,   nil,   222,    85,    85,
-   214,   nil,    85,   nil,   214,   nil,   nil,    85,    85,   nil,
-   nil,    85,   nil,   nil,    85,   214,    83,    83,    83,    83,
-    83,   nil,    85,   218,   218,   218,   nil,   218,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    79,    79,    79,   nil,    79,   nil,    83,   nil,   nil,
-   nil,    83,    83,   nil,   218,    83,   nil,   nil,   218,   218,
-    83,    79,   218,   nil,    83,   nil,   nil,   218,   342,   342,
-   nil,   218,    79,   nil,   nil,    83,    79,    79,   nil,   nil,
-    79,   nil,   218,   nil,   nil,    79,    79,   319,   319,    79,
-   nil,   nil,    79,   162,   162,   162,   nil,   162,   342,   nil,
-    79,   nil,   342,   342,   nil,   nil,   342,   nil,   nil,   nil,
-   nil,   342,   nil,   162,   nil,   342,   nil,   319,   nil,   279,
-   279,   319,   319,   nil,   162,   319,   342,   nil,   162,   162,
-   319,   nil,   162,   nil,   319,   nil,   nil,   162,   162,   nil,
-   nil,   162,   nil,   nil,   162,   319,   nil,   nil,   nil,   279,
-   151,   151,   162,   279,   279,   nil,   nil,   279,   nil,   nil,
-   149,   149,   279,   149,   nil,   nil,   279,   nil,   nil,   nil,
-   151,   nil,   nil,   nil,   nil,   nil,   nil,   279,   nil,   nil,
-   151,   150,   150,   nil,   151,   151,   nil,   nil,   151,   nil,
-   149,   nil,   151,   151,   149,   149,   nil,   151,   149,   181,
-   181,   nil,   nil,   149,   nil,   nil,   nil,   149,   151,   nil,
-   nil,   150,   nil,   278,   278,   150,   150,   nil,   149,   150,
-   nil,   nil,   nil,   150,   150,   nil,   nil,   nil,   150,   181,
-   nil,   265,   265,   181,   181,   265,   nil,   181,   nil,   150,
-   nil,   nil,   181,   278,   nil,   nil,   181,   278,   278,   nil,
-   nil,   278,    54,    54,   nil,   nil,   278,   181,   nil,   nil,
-   278,   265,   nil,   nil,   nil,   265,   265,   nil,   nil,   265,
-   nil,   278,    54,   nil,   265,   nil,   nil,   nil,   265,   nil,
-   nil,   nil,    54,    80,   nil,   nil,    54,    54,   nil,   265,
-    54,   nil,    80,    80,    54,    54,   nil,   nil,   nil,    54,
-   nil,    80,    80,    80,    80,   247,   247,   nil,   nil,   nil,
-    54,   nil,   nil,   nil,   247,   247,   247,   247,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    80,    80,   nil,   nil,    80,
-    80,    80,    80,    80,    80,   nil,    80,    80,   nil,   247,
-   nil,   nil,   247,   247,   247,   247,   247,   247,   nil,   247,
-   247,   251,   251,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   251,   251,   251,   251,   114,   114,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   114,   114,   114,   114,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   251,   251,
-   251,   251,   251,   251,   nil,   251,   251,   114,   114,   nil,
-   nil,   114,   114,   114,   114,   114,   114,   nil,   114,   114,
-   118,   118,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   118,
-   118,   118,   118,   152,   152,   nil,   nil,   nil,   nil,   nil,
-   nil,   152,   152,   152,   152,   152,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   118,   118,   nil,   nil,   118,   118,   118,
-   118,   118,   118,   nil,   118,   118,   152,   152,   nil,   nil,
-   152,   152,   152,   152,   152,   152,   290,   152,   152,   113,
-   113,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   113,   113,
-   113,   113,   nil,   nil,   nil,   nil,   nil,   290,   nil,   290,
-   290,   nil,   290,   290,   345,   290,   nil,   290,   nil,   290,
-   nil,   290,   113,   113,   290,   290,   113,   113,   113,   113,
-   113,   113,   nil,   113,   113,   345,   347,   345,   345,   nil,
-   345,   345,   nil,   345,   nil,   345,   nil,   345,   nil,   345,
-   nil,   nil,   345,   345,   nil,   333,   nil,   347,   nil,   347,
-   347,   nil,   347,   347,   nil,   347,   nil,   347,   nil,   347,
-   nil,   347,   nil,   nil,   347,   347,   333,   292,   333,   333,
-   nil,   333,   333,   nil,   333,   nil,   333,   nil,   333,   nil,
-   333,   nil,   nil,   333,   333,   nil,   338,   nil,   292,   nil,
-   292,   292,   nil,   292,   292,   nil,   292,   nil,   292,   nil,
-   292,   nil,   292,   nil,   nil,   292,   292,   338,   281,   338,
-   338,   nil,   338,   338,   nil,   338,   nil,   338,   nil,   338,
-   nil,   338,   nil,   nil,   338,   338,   nil,   166,   nil,   281,
-   nil,   281,   281,   nil,   281,   281,   nil,   281,   nil,   281,
-   nil,   281,   nil,   281,   nil,   nil,   281,   281,   166,   209,
-   166,   166,   nil,   166,   166,   nil,   166,   nil,   166,   nil,
-   166,   nil,   166,   nil,   nil,   166,   166,   nil,   256,   nil,
-   209,   nil,   209,   209,   nil,   209,   209,   nil,   209,   nil,
-   209,   nil,   209,   nil,   209,   nil,   nil,   209,   209,   256,
-   355,   256,   256,   nil,   256,   256,   nil,   256,   nil,   256,
-   nil,   256,   nil,   256,   nil,   nil,   256,   256,   nil,   357,
-   nil,   355,   nil,   355,   355,   nil,   355,   355,   nil,   355,
+   178,   178,   138,   275,   178,    38,   178,   136,    80,   197,
+   207,   152,   289,   232,    53,   205,    38,   289,   157,   160,
+   160,    38,   178,   160,   152,   160,    80,   111,   205,   348,
+   348,   157,   111,   178,   275,   207,   207,   178,   178,    53,
+   138,   178,   202,   138,   203,   136,   178,   178,   136,   204,
+   178,   197,   160,   178,   162,   162,   160,   160,   275,   275,
+   160,   178,   348,   138,   195,   160,   348,   348,   136,   160,
+   348,   242,   163,   163,    11,   348,    87,   162,    11,   348,
+   160,     4,   116,     4,   242,    11,    18,   162,   334,   334,
+   348,   162,   162,   116,   187,   162,     4,   187,   116,   162,
+   162,    91,   324,   324,   162,   163,   324,   189,   324,   163,
+   163,   104,    42,   163,    84,   162,   130,   163,   163,    81,
+     4,   334,   163,    42,    18,   334,   334,    18,    42,   334,
+   211,   164,   164,   163,   334,   324,   214,   164,   334,   324,
+   324,   211,   104,   324,   130,   130,   211,    18,   324,   334,
+   280,     1,   324,   167,   167,     1,    93,   167,   280,   167,
+    76,     7,     1,   324,   164,   122,   104,   104,   164,   164,
+     7,     7,   164,   122,   220,   167,   221,   164,   225,    25,
+    25,   164,   225,    25,    12,   225,   167,    94,    12,   225,
+   167,   167,   164,   186,   167,    12,    12,   186,   186,   167,
+   167,    25,   226,   167,    27,    27,   167,    74,    27,   230,
+    27,    72,    25,    89,   167,   233,    25,    25,    32,    32,
+    25,    71,   255,   255,    25,    25,    27,   255,   255,    25,
+    29,    29,   257,   257,    29,    67,    29,    27,   272,   272,
+    25,    27,    27,   272,   272,    27,   256,   256,   323,   323,
+    27,    27,   168,   168,    27,   161,   168,    27,   168,   161,
+   161,   200,   200,    29,   239,    27,   181,    29,    29,   249,
+    64,    29,   251,    95,   168,   100,    29,   287,   287,   106,
+    29,   287,   126,   287,   177,   168,   126,   126,   107,   168,
+   168,    29,   118,   168,   108,    63,   118,   118,   168,   168,
+    62,    61,   168,   286,   286,   168,   109,   286,    49,   286,
+   287,    48,   113,   168,   287,   287,    43,   271,   287,   124,
+   273,   128,    41,   287,   284,   284,    39,   287,   284,   129,
+   284,   282,   283,   134,    36,   135,   286,   139,   287,    30,
+   286,   286,   295,   296,   286,   278,   278,   297,   299,   286,
+   300,   303,   278,   286,    24,    19,   314,   284,   155,   154,
+   325,   284,   284,   327,   286,   284,   153,    40,    40,   335,
+   284,    40,   150,    40,   284,   144,   349,   350,   278,     6,
+     2,   143,   278,   278,   141,   284,   278,   nil,   277,   277,
+   nil,   278,   277,   nil,   277,   278,   nil,   nil,   nil,   nil,
+    40,   nil,   nil,   nil,    40,    40,   278,   nil,    40,   nil,
+   169,   169,   nil,    40,   169,   nil,   169,    40,   nil,   nil,
+   nil,   277,   nil,   nil,   nil,   277,   277,   nil,    40,   277,
+   nil,   nil,   169,   nil,   277,   nil,   170,   170,   277,   nil,
+   170,   nil,   170,   169,   nil,   nil,   nil,   169,   169,   277,
+   nil,   169,   nil,   nil,   nil,   nil,   169,   169,   170,   nil,
+   169,   nil,   nil,   169,   nil,   nil,    44,    44,   nil,   170,
+    44,   169,    44,   170,   170,   nil,   nil,   170,   nil,   nil,
+   nil,   nil,   170,   170,   nil,   nil,   170,   nil,    44,   170,
+   nil,   nil,    45,    45,   nil,   nil,    45,   170,    45,    44,
+   nil,   nil,   nil,    44,    44,   nil,   nil,    44,   nil,   nil,
+   nil,   nil,    44,    44,    45,   nil,    44,    46,    46,    44,
+   nil,    46,   nil,    46,   nil,    45,   nil,    44,   nil,    45,
+    45,   nil,   nil,    45,   nil,   nil,   nil,   nil,    45,    45,
+   nil,   nil,    45,   171,   171,    45,   nil,   171,   nil,   171,
+    46,   nil,   nil,    45,    46,    46,   nil,   nil,    46,   nil,
+   nil,   nil,   nil,    46,   nil,   171,   nil,    46,   nil,   172,
+   172,   nil,   nil,   172,   nil,   172,   171,   nil,    46,   nil,
+   171,   171,   nil,   nil,   171,   nil,   nil,   nil,   nil,   171,
+   171,   172,   nil,   171,   nil,   nil,   171,   nil,   nil,   173,
+   173,   nil,   172,   173,   171,   173,   172,   172,   nil,   nil,
+   172,   nil,   nil,   nil,   nil,   172,   172,   nil,   nil,   172,
+   nil,   173,   172,   nil,   nil,    59,    59,   nil,   nil,    59,
+   172,    59,   173,   nil,   nil,   nil,   173,   173,   nil,   nil,
+   173,   nil,   nil,   nil,   nil,   173,   173,    59,   nil,   173,
+    60,    60,   173,   nil,    60,   nil,   nil,   nil,    59,   nil,
+   173,   nil,    59,    59,   nil,   nil,    59,   nil,   nil,   nil,
+   nil,    59,    59,   nil,   nil,    59,   174,   174,    59,   nil,
+   174,   nil,   174,    60,   nil,   nil,    59,    60,    60,   nil,
+   nil,    60,   nil,   nil,   nil,   nil,    60,   nil,   174,   nil,
+    60,   nil,   175,   175,   nil,   nil,   175,   nil,   175,   174,
+   nil,    60,   nil,   174,   174,   nil,   nil,   174,   nil,   nil,
+   nil,   nil,   174,   174,   175,   nil,   174,   nil,   nil,   174,
+   nil,   nil,   176,   176,   nil,   175,   176,   174,   176,   175,
+   175,   nil,   nil,   175,   nil,   nil,   nil,   nil,   175,   175,
+   250,   250,   175,   nil,   176,   175,   nil,   nil,   nil,   258,
+   258,   258,   258,   175,   nil,   176,   258,   258,   nil,   176,
+   176,   nil,   nil,   176,   nil,   nil,   nil,   nil,   176,   176,
+   237,   237,   176,   250,   237,   176,   237,   250,   250,   nil,
+   nil,   250,   nil,   176,   nil,   nil,   250,   nil,   nil,   nil,
+   250,   nil,   237,   nil,   nil,    68,    68,   260,   260,   260,
+   260,   250,   nil,   237,   260,   260,   nil,   237,   237,   nil,
+   nil,   237,   nil,   nil,   nil,   nil,   237,   237,    68,   nil,
+   237,    69,    69,   237,   nil,    69,   nil,    69,    68,   nil,
+   nil,   237,    68,    68,   nil,   nil,    68,   nil,   nil,   nil,
+    68,    68,   nil,    69,   nil,    68,   234,   234,   231,   231,
+   nil,   nil,   231,   nil,    69,   nil,    68,   nil,    69,    69,
+   nil,   nil,    69,   nil,   nil,   nil,   nil,    69,    69,   234,
+   nil,    69,   nil,   nil,    69,   nil,   nil,   nil,   nil,   234,
+   nil,   231,    69,   234,   234,   231,   231,   234,   nil,   231,
+   nil,   234,   234,   nil,   231,   nil,   234,   nil,   231,   180,
+   180,   nil,   nil,   180,   nil,   180,   nil,   234,   nil,   231,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   219,   219,
+   nil,   180,   219,   nil,   219,    77,    77,   nil,   nil,    77,
+   nil,    77,   180,   nil,   nil,   nil,   180,   180,   nil,   nil,
+   180,   nil,   nil,   nil,   nil,   180,   180,   213,   213,   180,
+   nil,   219,   180,   nil,   nil,   219,   219,   nil,    77,   219,
+   180,   nil,    77,    77,   219,   nil,    77,   nil,   219,   nil,
+   nil,    77,   216,   216,   nil,    77,   216,   nil,   216,   219,
+   213,   nil,   212,   212,   213,   213,    77,   nil,   213,   nil,
+   nil,   nil,   nil,   213,   nil,   nil,   nil,   213,   101,   101,
+   nil,   nil,   101,   101,   101,   216,   nil,   nil,   213,   216,
+   216,   nil,   nil,   216,   nil,   212,   194,   194,   216,   212,
+   212,   nil,   216,   212,   nil,   nil,   nil,   nil,   212,   nil,
+   nil,   101,   212,   216,   nil,   101,   101,   nil,   nil,   101,
+   nil,    88,    88,   212,   101,    88,   nil,    88,   101,   194,
+   nil,   nil,   nil,   194,   194,   nil,   nil,   194,   nil,   101,
+   nil,   nil,   194,    88,   nil,   nil,   194,   179,   179,   nil,
+   nil,   179,   nil,   179,    88,   nil,   nil,   194,    88,    88,
+   nil,   nil,    88,   nil,   nil,   nil,   nil,    88,    88,   179,
+   nil,    88,   nil,   nil,    88,   nil,   nil,    92,    92,   nil,
+   179,    92,    88,    92,   179,   179,   nil,   nil,   179,   nil,
+   nil,   nil,   nil,   179,   179,   nil,   nil,   179,   nil,    92,
+   179,   nil,   nil,   183,   183,   nil,   nil,   183,   179,   183,
+    92,   nil,   nil,   nil,    92,    92,   nil,   nil,    92,   nil,
+   nil,   nil,   nil,    92,    92,   183,   nil,    92,   nil,   nil,
+    92,   nil,   nil,    99,    99,   nil,   183,    99,    92,    99,
+   183,   183,   nil,   nil,   183,   nil,   nil,   nil,   nil,   183,
+   183,   nil,   nil,   183,   nil,    99,   183,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   183,   nil,    99,   nil,   159,   159,
+    99,    99,   nil,   nil,    99,   nil,   nil,   nil,   nil,    99,
+    99,   159,   159,    99,   nil,   nil,    99,    97,   nil,   nil,
+   159,   159,   159,   159,    99,   nil,    97,    97,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,    97,    97,    97,    97,   nil,
+   nil,   nil,   nil,   nil,   159,   159,   nil,   nil,   159,   159,
+   159,   159,   159,   159,   nil,   159,   159,   nil,   nil,    97,
+    97,   nil,   nil,    97,    97,    97,    97,    97,    97,   nil,
+    97,    97,   133,   133,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   133,   133,   133,   133,   140,   140,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   140,   140,   140,   140,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   133,   133,   nil,   nil,   133,
+   133,   133,   133,   133,   133,   nil,   133,   133,   140,   140,
+   nil,   nil,   140,   140,   140,   140,   140,   140,   nil,   140,
+   140,   132,   132,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   132,   132,   132,   132,   266,   266,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   266,   266,   266,   266,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   132,   132,   nil,   nil,   132,   132,
+   132,   132,   132,   132,   nil,   132,   132,   nil,   nil,   nil,
+   nil,   266,   266,   266,   266,   266,   266,   nil,   266,   266,
+   166,   166,   nil,   nil,   nil,   nil,   nil,   nil,   166,   166,
+   166,   166,   166,   262,   262,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   262,   262,   262,   262,   nil,   264,   nil,   nil,
+   nil,   nil,   nil,   166,   166,   264,   nil,   166,   166,   166,
+   166,   166,   166,   nil,   166,   166,   nil,   262,   261,   nil,
+   262,   262,   262,   262,   262,   262,   261,   262,   262,   nil,
+   nil,   267,   nil,   264,   264,   264,   264,   264,   264,   267,
+   264,   264,   263,   nil,   268,   268,   268,   268,   268,   268,
+   263,   268,   268,   nil,   261,   261,   261,   261,   261,   261,
+   nil,   261,   261,   nil,   nil,   nil,   291,   267,   267,   267,
+   267,   267,   267,   nil,   267,   267,   nil,   nil,   263,   263,
+   263,   263,   263,   263,   nil,   263,   263,   291,   311,   291,
+   291,   nil,   291,   291,   nil,   291,   nil,   291,   nil,   291,
+   nil,   291,   nil,   nil,   291,   291,   nil,   270,   nil,   311,
+   nil,   311,   311,   nil,   311,   311,   nil,   311,   nil,   311,
+   nil,   311,   nil,   311,   nil,   nil,   311,   311,   270,   312,
+   270,   270,   nil,   270,   270,   nil,   270,   nil,   270,   nil,
+   270,   nil,   270,   nil,   nil,   270,   270,   nil,   344,   nil,
+   312,   nil,   312,   312,   nil,   312,   312,   nil,   312,   nil,
+   312,   nil,   312,   nil,   312,   nil,   nil,   312,   312,   344,
+   229,   344,   344,   nil,   344,   344,   nil,   344,   nil,   344,
+   nil,   344,   nil,   344,   nil,   nil,   344,   344,   nil,   182,
+   nil,   229,   nil,   229,   229,   nil,   229,   229,   nil,   229,
+   nil,   229,   nil,   229,   nil,   229,   nil,   nil,   229,   229,
+   182,   353,   182,   182,   nil,   182,   182,   nil,   182,   nil,
+   182,   nil,   182,   nil,   182,   nil,   nil,   182,   182,   nil,
+   355,   nil,   353,   nil,   353,   353,   nil,   353,   353,   nil,
+   353,   nil,   353,   nil,   353,   nil,   353,   nil,   nil,   353,
+   353,   355,   359,   355,   355,   nil,   355,   355,   nil,   355,
    nil,   355,   nil,   355,   nil,   355,   nil,   nil,   355,   355,
-   357,   nil,   357,   357,   nil,   357,   357,   nil,   357,   nil,
-   357,   nil,   357,   nil,   357,   nil,   nil,   357,   357,    30,
-   nil,    30,    30,   nil,    30,    30,   nil,    30,   nil,    30,
-   nil,    30,   nil,    30,   nil,   nil,    30,    30,     0,   nil,
-     0,     0,   nil,     0,     0,   nil,     0,   nil,     0,   nil,
-     0,   nil,     0,   nil,   nil,     0,     0 ]
+   nil,   206,   nil,   359,   nil,   359,   359,   nil,   359,   359,
+   nil,   359,   nil,   359,   nil,   359,   nil,   359,   nil,   nil,
+   359,   359,   206,   361,   206,   206,   nil,   206,   206,   nil,
+   206,   nil,   206,   nil,   206,   nil,   206,   nil,   nil,   206,
+   206,   nil,   nil,   nil,   361,   nil,   361,   361,   nil,   361,
+   361,   nil,   361,   nil,   361,   nil,   361,   nil,   361,   nil,
+   nil,   361,   361,     9,   nil,     9,     9,   nil,     9,     9,
+   nil,     9,   nil,     9,   nil,     9,   nil,     9,   nil,   nil,
+     9,     9,     0,   nil,     0,     0,   nil,     0,     0,   nil,
+     0,   nil,     0,   nil,     0,   nil,     0,   nil,   nil,     0,
+     0,   259,   259,   259,   259,   259,   259,   nil,   259,   259 ]
 
 racc_action_pointer = [
-  1670,    86,   nil,   nil,   nil,   139,   402,   nil,   nil,   nil,
-   nil,   nil,     9,   401,   nil,   nil,   400,   227,   nil,   272,
-   nil,   293,   nil,   223,    24,   nil,   391,   168,   324,   nil,
-  1651,    95,   nil,   nil,   520,   545,   571,   nil,   328,   nil,
-   623,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,     6,
-   675,   303,   333,   nil,  1189,   313,   nil,   293,   831,   267,
-   nil,   227,   nil,   235,   nil,   nil,   nil,    51,   nil,   nil,
-   211,   202,   nil,   214,   169,   nil,   161,   nil,   154,   979,
-  1217,   nil,   117,   954,   nil,   901,   nil,   nil,    51,    90,
-    75,   nil,   175,    -2,    21,    60,    94,   nil,   187,   nil,
-   201,   208,   479,   204,   121,    87,   281,   271,   nil,   nil,
-   nil,   300,   315,  1394,  1289,    79,   294,   nil,  1335,   326,
-    30,   nil,    34,   nil,   321,   nil,   nil,   nil,   314,    70,
-   334,   363,   406,   nil,   405,   405,   nil,   nil,   nil,   nil,
-   nil,   nil,    -2,   350,   nil,    67,    19,   nil,   380,  1097,
-  1118,  1087,  1348,    60,    81,   133,   154,   206,   334,   355,
-   407,   194,  1031,   649,   701,   142,  1550,   727,   753,   779,
-   nil,   261,   nil,   nil,   nil,   nil,   nil,   116,   nil,   359,
-   nil,  1136,   195,   338,   318,   289,   394,   nil,   131,    56,
-   nil,   nil,   nil,    -6,   nil,   nil,   nil,   330,   nil,     9,
-   nil,     4,     9,    51,    33,   nil,   127,    88,   nil,  1572,
-   nil,   nil,    95,   845,   894,   117,    92,    94,   961,   143,
-   125,   nil,   876,   173,   nil,   469,   nil,   nil,   nil,   176,
-   nil,   nil,   166,   nil,   824,   nil,   nil,   nil,   nil,   nil,
-     4,   nil,   232,   310,   365,   248,   230,  1230,   165,   181,
-   nil,  1276,    92,   292,   nil,   232,  1591,   257,   203,   220,
-   nil,   299,   nil,     2,   805,  1168,   nil,    68,   nil,   nil,
-   311,   nil,   317,   -20,   -14,   nil,   nil,   nil,  1150,  1056,
-   nil,  1531,   597,   nil,   nil,   129,   495,   nil,   nil,   nil,
-  1399,   nil,  1490,   nil,   nil,   nil,   nil,   nil,     1,   nil,
-   nil,   nil,   nil,   nil,   nil,   428,   nil,   241,   nil,   376,
-   nil,   354,   nil,   nil,   nil,   nil,   nil,   nil,   380,  1024,
-   387,   nil,   nil,   nil,   nil,   376,   377,   nil,   378,   379,
-   382,   nil,   nil,  1468,   nil,   nil,   nil,   nil,  1509,   nil,
-   nil,   nil,  1005,   405,   407,  1427,   nil,  1449,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,  1613,   nil,  1632,   nil,   nil ]
+  1742,   115,   336,   nil,    75,   nil,   379,   155,   nil,  1723,
+   nil,    38,   148,   nil,   nil,   nil,   nil,   nil,    84,   340,
+   nil,   nil,   nil,   nil,   346,   177,   nil,   202,   nil,   228,
+   331,   nil,   216,   nil,   nil,   nil,   310,   nil,   -19,   318,
+   365,   282,    88,   316,   464,   490,   515,   nil,   287,   300,
+   nil,   nil,   nil,     2,   nil,   nil,   nil,   nil,   nil,   623,
+   648,   278,   294,   272,   264,   nil,   nil,   212,   803,   829,
+   nil,   198,   205,   nil,   201,   nil,   137,   933,   nil,   nil,
+     2,   107,   nil,   nil,    91,   nil,   nil,    53,  1049,   190,
+   nil,    78,  1105,   133,   164,   250,   nil,  1209,   nil,  1161,
+   252,  1006,   nil,   nil,   102,   nil,   256,   280,   254,   294,
+   nil,    -8,   nil,   304,   nil,   nil,    58,   nil,   246,   nil,
+   nil,   nil,   147,   nil,   279,   nil,   275,   nil,   310,   317,
+    94,   nil,  1314,  1255,   326,   298,     5,   nil,     0,   329,
+  1268,   361,   nil,   358,   355,   nil,   nil,   nil,   nil,   nil,
+   349,   nil,     0,   325,   336,   346,   nil,     6,   nil,  1194,
+    17,   248,    52,    70,   129,   nil,  1373,   151,   250,   408,
+   434,   541,   567,   597,   674,   700,   730,   221,    -2,  1075,
+   907,   203,  1600,  1131,   nil,   nil,   186,    85,   nil,    96,
+   nil,   nil,   nil,   nil,  1024,    52,   nil,    -2,   nil,   nil,
+   259,   nil,    27,    29,    24,     3,  1682,   -15,   nil,   nil,
+   nil,   106,   990,   955,   124,   nil,   980,   nil,   nil,   926,
+   165,   136,   nil,   nil,   nil,   142,   194,   nil,   nil,  1581,
+   169,   856,     4,   206,   854,   nil,   nil,   778,   nil,   257,
+   nil,   nil,    59,   nil,   nil,   nil,   nil,   nil,   nil,   245,
+   748,   261,   nil,   nil,   nil,   166,   185,   171,   705,  1737,
+   753,  1420,  1386,  1444,  1399,   nil,  1327,  1433,  1410,   nil,
+  1518,   286,   182,   313,   nil,    -6,   nil,   386,   343,   nil,
+   138,   nil,   322,   292,   322,   nil,   301,   275,   nil,   -23,
+   nil,  1477,   nil,   nil,   nil,   319,   320,   324,   nil,   325,
+   327,   nil,   nil,   342,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,  1499,  1540,   nil,   344,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   237,   100,   329,   nil,   355,   nil,   nil,
+   nil,   nil,   nil,   nil,    86,   361,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,  1559,   nil,   nil,   nil,    27,   367,
+   368,   nil,   nil,  1622,   nil,  1641,   nil,   nil,   nil,  1663,
+   nil,  1704,   nil,   nil,   nil ]
 
 racc_action_default = [
-  -180,  -218,   -15,    -3,  -170,  -171,  -218,   -16,    -5,  -168,
-   -17,    -6,  -218,  -218,    -7,    -8,  -218,  -169,    -9,  -218,
-   -10,  -218,   -11,  -218,  -218,   -12,  -218,  -218,   -40,   -13,
-    -1,  -218,   -14,    -2,  -218,  -218,  -218,  -171,  -180,  -169,
-  -218,  -172,  -174,  -177,  -176,  -175,  -205,  -178,  -179,  -180,
-   -75,   -82,  -197,   -31,  -218,  -216,   -34,   -32,  -218,   -64,
-   -33,  -218,  -107,   -21,  -109,  -108,   -22,   -63,   -23,   -62,
-   -26,   -27,  -157,  -218,   -28,  -156,   -29,  -158,   -30,  -218,
-  -218,   -97,   -93,  -218,  -101,  -218,  -117,  -102,  -218,   -94,
-   -98,  -100,   -95,  -218,  -104,   -96,  -103,   -99,  -218,  -159,
-  -161,   -43,  -218,   -75,  -180,  -180,  -218,  -180,   -41,    -4,
-   -39,  -218,  -218,   -72,   -74,  -181,  -180,  -182,   -73,  -218,
-  -218,  -191,  -218,   -68,   -65,   -76,   -71,   -64,   -60,   -63,
-   -66,  -203,   -69,   -58,   -67,  -218,  -155,  -154,   -70,   -80,
-   -81,   -83,  -218,  -203,   -20,  -218,  -218,   -85,  -218,  -218,
-  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,
-  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,  -218,
-  -200,  -218,  -133,  -214,  -213,  -212,  -208,  -218,  -209,  -218,
-  -126,  -218,  -218,   -82,  -218,  -218,  -203,  -197,  -180,  -218,
-   -47,   -49,   -63,  -218,   -56,   -55,   -46,  -218,   360,  -218,
-  -215,  -190,  -218,  -218,  -188,  -185,  -218,  -218,  -193,  -218,
-  -192,  -173,  -218,   -61,  -218,  -218,  -204,   -75,  -218,  -218,
-  -204,   -18,  -218,  -218,  -110,  -218,  -201,  -202,  -152,  -218,
-  -144,  -145,   -63,  -150,  -218,  -153,  -151,   -24,   -25,  -106,
-  -218,  -136,  -122,  -124,  -128,  -125,  -130,  -135,  -132,  -129,
-  -118,  -134,  -131,  -127,  -119,  -114,  -218,  -120,  -121,  -123,
-  -198,  -202,  -206,  -218,  -218,  -218,  -138,  -218,  -142,  -160,
-  -203,  -111,  -218,  -218,  -218,   -52,   -51,   -45,  -218,  -218,
-   -44,  -218,  -218,  -183,  -184,  -218,  -218,  -195,  -194,  -196,
-  -218,  -167,  -218,   -35,   -59,   -78,   -36,   -77,  -203,   -79,
-   -38,   -84,   -19,  -217,   -86,  -218,  -147,  -203,  -105,  -218,
-  -113,  -114,  -199,  -207,  -210,  -211,  -139,  -137,  -218,  -218,
-  -218,   -37,   -50,   -48,   -91,   -87,   -88,   -53,   -92,   -89,
-   -90,   -54,  -163,  -218,  -189,  -186,  -187,  -165,  -218,  -166,
-   -57,  -149,  -218,  -218,  -202,  -218,  -112,  -218,  -143,   -42,
-  -162,  -164,  -148,  -146,  -116,  -218,  -141,  -218,  -115,  -140 ]
+  -182,  -220,   -40,   -11,  -220,   -12,  -220,  -220,   -13,    -1,
+  -173,  -174,  -220,   -14,    -2,  -171,   -15,    -3,  -220,  -220,
+   -16,    -5,   -17,    -6,  -220,  -172,    -7,  -220,    -8,  -220,
+  -220,    -9,  -220,   -10,  -174,  -172,  -182,   -41,  -182,   -43,
+  -220,   -75,  -182,  -220,  -220,  -220,  -220,    -4,  -182,  -220,
+   -39,  -179,  -181,  -182,  -178,  -175,  -207,  -177,  -180,  -220,
+   -75,   -27,  -220,   -28,  -199,  -159,  -107,   -29,  -220,  -220,
+   -34,   -30,   -64,   -31,  -218,  -161,   -32,  -220,  -112,   -33,
+   -63,   -21,   -62,   -22,  -220,   -23,  -160,   -26,  -220,   -98,
+  -100,   -95,  -220,  -104,   -96,  -103,   -99,  -220,   -97,  -220,
+   -93,  -220,  -101,  -120,  -220,  -102,   -94,  -220,   -82,  -164,
+  -162,  -183,  -184,  -220,   -55,  -199,  -182,   -46,  -220,   -47,
+   -63,   -49,  -220,   -56,   -82,   -85,  -220,   -76,  -220,  -205,
+  -220,   365,   -72,   -74,  -220,  -182,  -220,  -193,  -220,  -220,
+   -73,   -69,   -58,   -67,  -220,  -158,  -157,   -70,   -68,   -64,
+   -65,   -71,   -63,   -60,   -66,  -205,   -20,  -220,  -108,  -220,
+  -220,  -220,  -220,  -220,  -220,  -129,  -220,  -220,  -220,  -220,
+  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,  -220,
+  -220,  -220,  -220,  -220,  -136,  -202,  -220,  -220,  -211,  -220,
+  -214,  -215,  -210,  -216,  -220,  -205,   -80,  -220,   -81,   -83,
+  -220,  -187,  -192,  -190,  -220,  -220,  -220,  -220,   -44,   -52,
+   -51,  -220,  -220,  -220,  -205,  -203,  -220,  -204,  -114,  -220,
+  -220,  -206,   -45,  -217,  -195,  -220,  -220,  -176,  -194,  -220,
+   -75,   -61,  -220,  -220,  -220,   -18,  -109,  -220,  -110,  -220,
+  -113,  -106,  -220,   -24,   -25,  -156,  -148,  -154,  -155,   -63,
+  -220,  -220,  -153,  -147,  -139,  -124,  -126,  -125,  -127,  -131,
+  -128,  -133,  -138,  -135,  -132,  -121,  -137,  -134,  -130,  -122,
+  -220,  -117,  -123,  -204,  -200,  -220,  -208,  -220,  -220,  -141,
+  -220,  -145,  -220,  -206,  -220,  -163,  -220,  -220,  -185,  -220,
+  -186,  -220,  -166,   -50,   -48,   -92,   -89,   -90,   -91,   -87,
+   -88,   -53,   -54,  -220,   -86,   -78,   -37,   -77,  -196,  -197,
+  -198,  -220,  -220,  -170,  -205,   -59,   -35,   -36,   -19,  -111,
+  -219,  -105,  -150,  -205,  -220,  -117,  -116,  -220,  -201,  -212,
+  -209,  -213,  -142,  -140,  -220,  -220,   -38,   -84,   -79,  -191,
+  -189,  -188,  -165,   -42,  -220,  -168,  -169,   -57,  -220,  -220,
+  -204,  -152,  -115,  -220,  -146,  -220,  -167,  -151,  -149,  -220,
+  -119,  -220,  -144,  -118,  -143 ]
 
 racc_goto_table = [
-     6,    16,   109,   231,    24,    30,    38,   229,   178,   131,
-    57,   215,   205,   143,    41,    76,    99,   133,    68,    48,
-   266,    60,   138,   219,   139,   237,    63,   116,   107,   310,
-     6,    16,   189,   197,    24,   111,    98,   327,   331,   268,
-   148,   323,   265,   124,   301,   342,   230,    57,   136,   112,
-   110,   307,    76,   100,   126,    68,   128,    33,    60,   207,
-    49,   119,   186,   145,   212,   171,   272,   210,   202,   203,
-    75,   101,   288,   147,   177,    26,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   184,   346,   nil,   nil,   306,   nil,
-   nil,   nil,   229,   nil,   nil,   117,   199,   237,   147,   nil,
-   nil,   nil,   nil,    75,   316,   nil,   121,    75,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   273,   147,   nil,   nil,
-    53,   nil,   nil,   268,   211,   nil,   nil,    48,   nil,    48,
+    19,    73,   129,    30,    36,   201,   246,   147,   142,    19,
+     4,    76,    30,     9,    48,    81,   158,   251,   110,     4,
+   279,   155,    49,   188,   107,    47,    55,   196,    85,   243,
+   326,   294,    79,   220,    67,   125,   148,   126,   118,   195,
+    14,   134,   130,   196,    73,   113,   150,   281,   301,   302,
+   348,   278,   236,   337,    76,   214,   253,   135,   157,   233,
+    50,   323,   109,   153,   226,    53,   139,   151,   232,   145,
+   228,    85,   125,   204,   161,    79,   112,    67,   205,    39,
+   308,   187,     6,   nil,   352,   nil,   nil,   nil,   112,   nil,
+   nil,   nil,   322,   137,   nil,   nil,   125,   nil,   186,   282,
+   243,   nil,   nil,   251,   332,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   207,   nil,   303,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    52,
+   nil,   281,   nil,   nil,   nil,   nil,   nil,   nil,    73,    73,
+   307,   nil,   nil,   nil,   227,   nil,   nil,   nil,    76,    76,
+   248,   nil,   242,   nil,   nil,   239,   nil,   nil,   nil,   nil,
+   nil,    65,   nil,   nil,   nil,    85,   244,   nil,   nil,    79,
+    79,    67,    67,   145,   nil,   224,   nil,   nil,   147,   315,
+   248,   nil,    19,   341,   319,    30,   285,   354,   298,   298,
+   357,   314,     4,   nil,   329,   270,    65,   nil,   299,   299,
+   nil,   251,   196,   145,    65,   nil,    19,   148,   nil,    30,
+    73,   304,   nil,    87,   305,   nil,     4,   150,   347,   291,
+    76,   297,   297,   nil,   nil,   nil,   123,   349,   309,    19,
+   123,   nil,    30,   nil,   nil,   nil,   248,   244,   151,     4,
+   145,    79,   312,    67,   nil,   nil,   nil,    52,   154,    52,
+   nil,   nil,   nil,   nil,    61,   nil,    87,   nil,   nil,   145,
+   nil,   nil,   nil,   nil,   248,   nil,   nil,   114,   nil,   nil,
+    19,   114,   331,    30,    63,   nil,   nil,   nil,   nil,   338,
+     4,   339,   340,   nil,   nil,   nil,    47,   145,   265,   141,
+   nil,    19,   269,   nil,    30,   nil,   nil,    61,    65,    65,
+    65,     4,   nil,   nil,   123,   nil,   nil,    47,   nil,   143,
+   nil,    19,    19,   nil,    30,    30,   nil,    63,   nil,   351,
+   248,     4,     4,   nil,   344,   nil,   nil,   nil,    47,   nil,
+    65,   nil,   nil,   nil,   248,   nil,   nil,    71,   nil,   nil,
+   nil,   nil,   nil,   145,    19,   114,   nil,    30,    65,    65,
+    87,    87,   252,    19,     4,    19,    30,   145,    30,    19,
+    47,    19,    30,     4,    30,     4,   359,    65,   361,     4,
+    65,     4,   146,   nil,   nil,    47,   nil,    47,   nil,   nil,
+    71,   nil,   252,   nil,   nil,   nil,    65,   nil,   nil,   nil,
+   nil,    61,    61,   245,   nil,   nil,   nil,   nil,   nil,   123,
+   300,   300,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,    63,    63,   247,    65,   nil,   nil,   nil,   nil,   154,
+   nil,   nil,    87,   245,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   252,   nil,
+   114,   295,   295,   247,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   141,   296,   296,    61,   nil,   nil,   252,   nil,    97,   nil,
+    65,   nil,   nil,   nil,    71,    71,   146,   nil,   nil,   245,
+   143,   nil,   nil,    63,    65,   132,   133,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   247,
+   140,   nil,   nil,   nil,   nil,   nil,   146,   245,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   252,   nil,   146,   146,   nil,   247,   nil,   165,
+   nil,   nil,   nil,   166,   nil,   nil,   252,   nil,   nil,   nil,
+   184,   nil,   nil,   146,   nil,   nil,    71,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   146,   245,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   245,   nil,   nil,
+   nil,   nil,   nil,   247,   nil,   nil,   nil,   nil,   nil,   nil,
+   146,   nil,   nil,   nil,   nil,   nil,   nil,   247,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   255,   256,
+   257,   258,   259,   260,   261,   262,   263,   264,   nil,   266,
+   267,   268,   nil,   nil,   272,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   228,    57,    57,   270,   nil,   136,    76,    76,
-   320,   238,    68,   123,    60,    60,   139,    53,   nil,   nil,
-   240,   223,   nil,   nil,   117,   nil,     6,    16,   250,   nil,
-    24,   256,   254,   208,   228,   269,   298,   348,   340,   136,
-   294,   nil,   335,   314,   nil,   138,   nil,   343,   nil,   297,
-   nil,   nil,   nil,   139,   nil,   nil,   352,   nil,   nil,   nil,
-   229,   nil,    75,    75,    75,   nil,   124,   287,   nil,     6,
-    16,   136,   nil,    24,   292,    57,   nil,   126,   nil,   nil,
-    76,   nil,   nil,   238,   nil,   nil,    60,   228,   109,   295,
-   nil,   nil,   136,   299,    75,   nil,    70,   nil,   nil,   nil,
-   304,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    74,   nil,    53,    53,   nil,     6,    16,   228,   nil,
-    24,   nil,   nil,   136,   109,   nil,    75,   nil,   nil,   130,
-    78,   325,   325,    70,   nil,    75,   330,   330,    71,   315,
-   nil,     6,    16,   nil,   134,    24,   333,    75,    74,   nil,
-     6,    16,     6,    16,    24,   338,    24,   334,   nil,   nil,
-   nil,   336,   nil,   137,   nil,   109,   nil,    78,   nil,   nil,
-   109,   132,   228,   nil,   nil,    71,   123,   136,    75,   nil,
-   341,   nil,   nil,   194,   194,    53,   nil,   109,   nil,   109,
-   nil,    75,    75,     6,    16,   228,   nil,    24,     6,    16,
-   136,   nil,    24,   nil,   nil,     6,    16,     6,    16,    24,
-   355,    24,   357,   nil,   nil,     6,    16,     6,    16,    24,
-   nil,    24,   nil,   nil,   nil,   195,   195,   nil,   233,    70,
-    70,   nil,    75,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   324,   324,   236,    74,    74,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    75,   nil,   nil,   nil,   nil,
-   233,   nil,   137,    78,    78,   nil,   nil,   194,   nil,   nil,
-   235,    71,    71,   nil,   nil,   236,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   146,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   130,   nil,   137,   nil,   nil,   nil,   nil,   nil,
-   nil,    70,   235,   nil,   nil,   nil,   nil,   134,    80,   195,
-   nil,   nil,   nil,   233,   nil,   nil,    74,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   113,   114,   137,   nil,   236,   118,
-   nil,   nil,   nil,   nil,   132,    78,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    71,   233,   nil,   nil,   137,   nil,   nil,
-   nil,   nil,   nil,   194,   nil,   235,   nil,   326,   326,   236,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   152,   nil,
-   nil,   nil,   329,   329,   172,   nil,   nil,   nil,   137,   nil,
-   nil,   nil,   180,   nil,   nil,   nil,   235,   nil,   nil,   nil,
-   nil,   137,   137,   nil,   nil,   195,   nil,   nil,   233,   328,
-   328,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   236,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   233,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   137,   nil,   nil,   nil,   236,   nil,   nil,   nil,
-   235,   nil,   242,   243,   244,   245,   246,   247,   248,   249,
-   nil,   251,   252,   253,   nil,   137,   257,   258,   259,   nil,
-   nil,   nil,   nil,   235 ]
+   146 ]
 
 racc_goto_check = [
-    49,    20,     4,    64,    34,     2,    29,    62,    78,    32,
-    27,    33,    75,    35,    71,    24,    27,    44,    20,    58,
-    60,    28,    47,    33,    50,    19,    18,    67,    29,    57,
-    49,    20,    38,    38,    34,    34,    51,    43,    43,    62,
-    54,    39,    59,    27,    53,    55,    63,    27,    24,    51,
-     5,    65,    24,    66,    28,    20,    30,     3,    28,    68,
-    69,    70,    32,    18,    31,    54,    33,    72,    73,    74,
-    46,    37,    76,    51,    77,     1,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    54,    57,   nil,   nil,    64,   nil,
-   nil,   nil,    62,   nil,   nil,     3,    67,    19,    51,   nil,
-   nil,   nil,   nil,    46,    60,   nil,     3,    46,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    38,    51,   nil,   nil,
-    26,   nil,   nil,    62,    71,   nil,   nil,    58,   nil,    58,
+    49,    26,    32,    20,    29,    77,    66,    47,    44,    49,
+    34,    27,    20,     2,    29,    18,    57,    64,    27,    34,
+    62,    32,    34,    80,    51,     4,    73,    50,    20,    19,
+    59,    39,    28,    33,    24,    51,    26,    54,    38,    35,
+     3,    51,    38,    50,    26,    69,    27,    64,    43,    43,
+    55,    61,    58,    53,    27,    35,    65,    69,    18,    33,
+     5,    67,    68,    30,    70,    71,    72,    28,    31,    24,
+    74,    20,    51,    75,    54,    28,     3,    24,    76,    37,
+    78,    79,     1,   nil,    59,   nil,   nil,   nil,     3,   nil,
+   nil,   nil,    66,     3,   nil,   nil,    51,   nil,    54,    33,
+    19,   nil,   nil,    64,    62,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    38,   nil,    33,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    60,
+   nil,    64,   nil,   nil,   nil,   nil,   nil,   nil,    26,    26,
+    50,   nil,   nil,   nil,    73,   nil,   nil,   nil,    27,    27,
+    27,   nil,    18,   nil,   nil,    51,   nil,   nil,   nil,   nil,
+   nil,    46,   nil,   nil,   nil,    20,    20,   nil,   nil,    28,
+    28,    24,    24,    24,   nil,     3,   nil,   nil,    47,    44,
+    27,   nil,    49,    77,    57,    20,    27,    64,    26,    26,
+    66,    32,    34,   nil,    80,     2,    46,   nil,    27,    27,
+   nil,    64,    50,    24,    46,   nil,    49,    26,   nil,    20,
+    26,    51,   nil,    21,    51,   nil,    34,    27,    33,     2,
+    27,    24,    24,   nil,   nil,   nil,    21,    33,    29,    49,
+    21,   nil,    20,   nil,   nil,   nil,    27,    20,    28,    34,
+    24,    28,     2,    24,   nil,   nil,   nil,    60,    21,    60,
+   nil,   nil,   nil,   nil,    22,   nil,    21,   nil,   nil,    24,
+   nil,   nil,   nil,   nil,    27,   nil,   nil,    22,   nil,   nil,
+    49,    22,    51,    20,    23,   nil,   nil,   nil,   nil,    51,
+    34,    51,    51,   nil,   nil,   nil,     4,    24,    60,    22,
+   nil,    49,    60,   nil,    20,   nil,   nil,    22,    46,    46,
+    46,    34,   nil,   nil,    21,   nil,   nil,     4,   nil,    23,
+   nil,    49,    49,   nil,    20,    20,   nil,    23,   nil,    51,
+    27,    34,    34,   nil,     2,   nil,   nil,   nil,     4,   nil,
+    46,   nil,   nil,   nil,    27,   nil,   nil,    25,   nil,   nil,
+   nil,   nil,   nil,    24,    49,    22,   nil,    20,    46,    46,
+    21,    21,    21,    49,    34,    49,    20,    24,    20,    49,
+     4,    49,    20,    34,    20,    34,     2,    46,     2,    34,
+    46,    34,    25,   nil,   nil,     4,   nil,     4,   nil,   nil,
+    25,   nil,    21,   nil,   nil,   nil,    46,   nil,   nil,   nil,
+   nil,    22,    22,    22,   nil,   nil,   nil,   nil,   nil,    21,
+    21,    21,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,    23,    23,    23,    46,   nil,   nil,   nil,   nil,    21,
+   nil,   nil,    21,    22,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    21,   nil,
+    22,    22,    22,    23,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    27,    27,    27,    35,   nil,    24,    24,    24,
-    33,    20,    20,    26,    28,    28,    50,    26,   nil,   nil,
-    18,    51,   nil,   nil,     3,   nil,    49,    20,    58,   nil,
-    34,     2,    58,     3,    27,    27,    32,    62,    33,    24,
-    44,   nil,    75,    78,   nil,    47,   nil,    33,   nil,    50,
-   nil,   nil,   nil,    50,   nil,   nil,    64,   nil,   nil,   nil,
-    62,   nil,    46,    46,    46,   nil,    27,    29,   nil,    49,
-    20,    24,   nil,    34,     2,    27,   nil,    28,   nil,   nil,
-    24,   nil,   nil,    20,   nil,   nil,    28,    27,     4,    51,
-   nil,   nil,    24,    51,    46,   nil,    21,   nil,   nil,   nil,
-    51,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    23,   nil,    26,    26,   nil,    49,    20,    27,   nil,
-    34,   nil,   nil,    24,     4,   nil,    46,   nil,   nil,    21,
-    25,    27,    27,    21,   nil,    46,    24,    24,    22,    51,
-   nil,    49,    20,   nil,    23,    34,     2,    46,    23,   nil,
-    49,    20,    49,    20,    34,     2,    34,    51,   nil,   nil,
-   nil,    51,   nil,    25,   nil,     4,   nil,    25,   nil,   nil,
-     4,    22,    27,   nil,   nil,    22,    26,    24,    46,   nil,
-    51,   nil,   nil,    21,    21,    26,   nil,     4,   nil,     4,
-   nil,    46,    46,    49,    20,    27,   nil,    34,    49,    20,
-    24,   nil,    34,   nil,   nil,    49,    20,    49,    20,    34,
-     2,    34,     2,   nil,   nil,    49,    20,    49,    20,    34,
-   nil,    34,   nil,   nil,   nil,    22,    22,   nil,    21,    21,
-    21,   nil,    46,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    26,    26,    23,    23,    23,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    46,   nil,   nil,   nil,   nil,
-    21,   nil,    25,    25,    25,   nil,   nil,    21,   nil,   nil,
-    22,    22,    22,   nil,   nil,    23,   nil,   nil,   nil,   nil,
+    22,    23,    23,    22,   nil,   nil,    21,   nil,    48,   nil,
+    46,   nil,   nil,   nil,    25,    25,    25,   nil,   nil,    22,
+    23,   nil,   nil,    23,    46,    48,    48,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,
+    48,   nil,   nil,   nil,   nil,   nil,    25,    22,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    21,   nil,    25,   nil,   nil,   nil,   nil,   nil,
-   nil,    21,    22,   nil,   nil,   nil,   nil,    23,    48,    22,
-   nil,   nil,   nil,    21,   nil,   nil,    23,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    48,    48,    25,   nil,    23,    48,
-   nil,   nil,   nil,   nil,    22,    25,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    22,    21,   nil,   nil,    25,   nil,   nil,
-   nil,   nil,   nil,    21,   nil,    22,   nil,    21,    21,    23,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    48,   nil,
-   nil,   nil,    23,    23,    48,   nil,   nil,   nil,    25,   nil,
-   nil,   nil,    48,   nil,   nil,   nil,    22,   nil,   nil,   nil,
-   nil,    25,    25,   nil,   nil,    22,   nil,   nil,    21,    22,
-    22,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    21,   nil,    25,    25,   nil,    23,   nil,    48,
+   nil,   nil,   nil,    48,   nil,   nil,    21,   nil,   nil,   nil,
+    48,   nil,   nil,    25,   nil,   nil,    25,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    25,    22,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    22,   nil,   nil,
    nil,   nil,   nil,    23,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    21,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    25,   nil,   nil,   nil,    23,   nil,   nil,   nil,
-    22,   nil,    48,    48,    48,    48,    48,    48,    48,    48,
-   nil,    48,    48,    48,   nil,    25,    48,    48,    48,   nil,
-   nil,   nil,   nil,    22 ]
+    25,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    48,    48,
+    48,    48,    48,    48,    48,    48,    48,    48,   nil,    48,
+    48,    48,   nil,   nil,    48,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    25,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    25 ]
 
 racc_goto_pointer = [
-   nil,    75,     5,    57,   -28,    19,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,     9,  -125,
-     1,   219,   261,   234,    -2,   253,   103,    -7,     4,     1,
-     6,   -64,   -41,  -120,     4,   -38,   nil,    47,   -72,  -233,
-   nil,   nil,   nil,  -241,   -33,   nil,    53,   -28,   429,     0,
-   -27,    15,   nil,  -176,   -18,  -262,   nil,  -226,     7,  -139,
-  -161,   nil,  -142,  -103,  -146,  -183,    30,   -11,   -57,    48,
-    12,     2,   -53,   -47,   -46,  -103,  -134,   -14,   -80,   nil ]
+   nil,    82,    13,    40,    16,    48,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   -10,  -134,
+     3,   188,   229,   249,     9,   312,   -24,   -14,     7,     3,
+     3,   -85,   -39,   -96,    10,   -69,   nil,    75,     0,  -180,
+   nil,   nil,   nil,  -164,   -52,   nil,   136,   -53,   441,     0,
+   -81,    -5,   nil,  -230,    -3,  -273,   nil,   -53,  -107,  -241,
+   111,  -143,  -174,   nil,  -147,  -108,  -158,  -189,    30,     9,
+   -71,    47,    13,     8,   -68,   -38,   -33,  -106,  -145,   -23,
+   -81,   nil ]
 
 racc_goto_default = [
-   nil,   nil,   nil,   196,     3,     8,    11,    14,    15,    18,
-    20,    22,    25,    29,    32,     2,     7,    10,   nil,    66,
-    87,    89,    90,    92,    95,    96,    81,    82,    84,    13,
-   nil,   nil,   nil,   nil,    73,   nil,    31,   nil,   nil,   190,
-   274,   191,   193,   nil,   nil,   135,    94,    97,   nil,    55,
-   125,    86,   140,   141,   nil,   225,    91,   nil,    77,   nil,
-   nil,   267,    61,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    42,   nil,   nil,   nil,   nil,   nil,   nil,   179 ]
+   nil,   nil,   nil,   117,    17,    21,    23,    26,    28,    31,
+    33,     3,     5,     8,    13,    16,    20,    22,   nil,    83,
+   105,   106,    89,    91,    94,    95,    98,   100,   102,    24,
+   nil,   nil,   nil,   nil,    62,   nil,    12,   nil,   nil,   119,
+   211,   121,   122,   nil,   nil,   144,    93,    96,   159,    74,
+   127,   103,   198,   199,   nil,   216,    90,   nil,   nil,   nil,
+    75,   nil,   nil,   280,    84,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,    57,   nil,   nil,   nil,   nil,   nil,
+   nil,   189 ]
 
 racc_token_table = {
  false => 0,
  Object.new => 1,
- :LBRACK => 2,
- :DQTEXT => 3,
- :SQTEXT => 4,
- :RBRACK => 5,
- :LBRACE => 6,
- :RBRACE => 7,
- :SYMBOL => 8,
- :FARROW => 9,
- :COMMA => 10,
- :TRUE => 11,
- :FALSE => 12,
- :EQUALS => 13,
- :APPENDS => 14,
- :LESSEQUAL => 15,
- :NOTEQUAL => 16,
- :DOT => 17,
- :COLON => 18,
- :LLCOLLECT => 19,
- :RRCOLLECT => 20,
- :QMARK => 21,
- :LPAREN => 22,
- :RPAREN => 23,
- :ISEQUAL => 24,
- :GREATEREQUAL => 25,
- :GREATERTHAN => 26,
- :LESSTHAN => 27,
- :IF => 28,
- :ELSE => 29,
- :IMPORT => 30,
- :DEFINE => 31,
- :ELSIF => 32,
- :VARIABLE => 33,
- :CLASS => 34,
- :INHERITS => 35,
- :NODE => 36,
- :BOOLEAN => 37,
- :NAME => 38,
- :SEMIC => 39,
- :CASE => 40,
- :DEFAULT => 41,
- :AT => 42,
- :LCOLLECT => 43,
- :RCOLLECT => 44,
- :CLASSNAME => 45,
- :CLASSREF => 46,
- :NOT => 47,
- :OR => 48,
- :AND => 49,
- :UNDEF => 50,
- :PARROW => 51,
- :PLUS => 52,
- :MINUS => 53,
- :TIMES => 54,
- :DIV => 55,
- :LSHIFT => 56,
- :RSHIFT => 57,
- :UMINUS => 58,
- :MATCH => 59,
- :NOMATCH => 60,
- :REGEX => 61 }
+ :STRING => 2,
+ :DQPRE => 3,
+ :DQMID => 4,
+ :DQPOST => 5,
+ :LBRACK => 6,
+ :RBRACK => 7,
+ :LBRACE => 8,
+ :RBRACE => 9,
+ :SYMBOL => 10,
+ :FARROW => 11,
+ :COMMA => 12,
+ :TRUE => 13,
+ :FALSE => 14,
+ :EQUALS => 15,
+ :APPENDS => 16,
+ :LESSEQUAL => 17,
+ :NOTEQUAL => 18,
+ :DOT => 19,
+ :COLON => 20,
+ :LLCOLLECT => 21,
+ :RRCOLLECT => 22,
+ :QMARK => 23,
+ :LPAREN => 24,
+ :RPAREN => 25,
+ :ISEQUAL => 26,
+ :GREATEREQUAL => 27,
+ :GREATERTHAN => 28,
+ :LESSTHAN => 29,
+ :IF => 30,
+ :ELSE => 31,
+ :IMPORT => 32,
+ :DEFINE => 33,
+ :ELSIF => 34,
+ :VARIABLE => 35,
+ :CLASS => 36,
+ :INHERITS => 37,
+ :NODE => 38,
+ :BOOLEAN => 39,
+ :NAME => 40,
+ :SEMIC => 41,
+ :CASE => 42,
+ :DEFAULT => 43,
+ :AT => 44,
+ :LCOLLECT => 45,
+ :RCOLLECT => 46,
+ :CLASSNAME => 47,
+ :CLASSREF => 48,
+ :NOT => 49,
+ :OR => 50,
+ :AND => 51,
+ :UNDEF => 52,
+ :PARROW => 53,
+ :PLUS => 54,
+ :MINUS => 55,
+ :TIMES => 56,
+ :DIV => 57,
+ :LSHIFT => 58,
+ :RSHIFT => 59,
+ :UMINUS => 60,
+ :MATCH => 61,
+ :NOMATCH => 62,
+ :REGEX => 63,
+ :SQTEXT => 64,
+ :DQTEXT => 65 }
 
 racc_use_result_var = true
 
-racc_nt_base = 62
+racc_nt_base = 66
 
 Racc_arg = [
  racc_action_table,
@@ -922,9 +960,11 @@ Racc_arg = [
 Racc_token_to_s_table = [
 '$end',
 'error',
+'STRING',
+'DQPRE',
+'DQMID',
+'DQPOST',
 'LBRACK',
-'DQTEXT',
-'SQTEXT',
 'RBRACK',
 'LBRACE',
 'RBRACE',
@@ -982,6 +1022,8 @@ Racc_token_to_s_table = [
 'MATCH',
 'NOMATCH',
 'REGEX',
+'SQTEXT',
+'DQTEXT',
 '$start',
 'program',
 'statements',
@@ -1039,6 +1081,8 @@ Racc_token_to_s_table = [
 'rvalues',
 'comma',
 'hash',
+'dqrval',
+'dqtail',
 'else',
 'regex',
 'caseopts',
@@ -1069,7 +1113,7 @@ Racc_debug_parser = false
 
  # reduce 0 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 44
+module_eval <<'.,.,', 'grammar.ra', 45
   def _reduce_1( val, _values, result )
     if val[0]
         # Make sure we always return an array.
@@ -1093,7 +1137,7 @@ module_eval <<'.,.,', 'grammar.ra', 44
 
  # reduce 3 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 60
+module_eval <<'.,.,', 'grammar.ra', 61
   def _reduce_4( val, _values, result )
     if val[0] and val[1]
         if val[0].instance_of?(AST::ASTArray)
@@ -1136,7 +1180,7 @@ module_eval <<'.,.,', 'grammar.ra', 60
 
  # reduce 17 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 84
+module_eval <<'.,.,', 'grammar.ra', 85
   def _reduce_18( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
@@ -1148,7 +1192,7 @@ module_eval <<'.,.,', 'grammar.ra', 84
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 92
+module_eval <<'.,.,', 'grammar.ra', 93
   def _reduce_19( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
@@ -1160,7 +1204,7 @@ module_eval <<'.,.,', 'grammar.ra', 92
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 98
+module_eval <<'.,.,', 'grammar.ra', 99
   def _reduce_20( val, _values, result )
     result = ast AST::Function,
         :name => val[0][:value],
@@ -1171,7 +1215,7 @@ module_eval <<'.,.,', 'grammar.ra', 98
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 106
+module_eval <<'.,.,', 'grammar.ra', 107
   def _reduce_21( val, _values, result )
     args = aryfy(val[1])
     result = ast AST::Function,
@@ -1187,7 +1231,7 @@ module_eval <<'.,.,', 'grammar.ra', 106
 
  # reduce 23 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 114
+module_eval <<'.,.,', 'grammar.ra', 115
   def _reduce_24( val, _values, result )
     result = aryfy(val[0], val[2])
     result.line = @lexer.line
@@ -1196,7 +1240,7 @@ module_eval <<'.,.,', 'grammar.ra', 114
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 123
+module_eval <<'.,.,', 'grammar.ra', 124
   def _reduce_25( val, _values, result )
     unless val[0].is_a?(AST::ASTArray)
         val[0] = aryfy(val[0])
@@ -1225,14 +1269,14 @@ module_eval <<'.,.,', 'grammar.ra', 123
 
  # reduce 33 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 137
+module_eval <<'.,.,', 'grammar.ra', 138
   def _reduce_34( val, _values, result )
                     result = ast AST::Name, :value => val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 159
+module_eval <<'.,.,', 'grammar.ra', 160
   def _reduce_35( val, _values, result )
     @lexer.commentpop
     array = val[2]
@@ -1257,7 +1301,7 @@ module_eval <<'.,.,', 'grammar.ra', 159
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 162
+module_eval <<'.,.,', 'grammar.ra', 163
   def _reduce_36( val, _values, result )
     # This is a deprecated syntax.
     error "All resource specifications require names"
@@ -1265,7 +1309,7 @@ module_eval <<'.,.,', 'grammar.ra', 162
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 165
+module_eval <<'.,.,', 'grammar.ra', 166
   def _reduce_37( val, _values, result )
     # a defaults setting for a type
     result = ast(AST::ResourceDefaults, :type => val[0], :parameters => val[2])
@@ -1273,7 +1317,7 @@ module_eval <<'.,.,', 'grammar.ra', 165
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 171
+module_eval <<'.,.,', 'grammar.ra', 172
   def _reduce_38( val, _values, result )
     @lexer.commentpop
     result = ast AST::ResourceOverride, :object => val[0], :parameters => val[2]
@@ -1281,7 +1325,7 @@ module_eval <<'.,.,', 'grammar.ra', 171
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 198
+module_eval <<'.,.,', 'grammar.ra', 199
   def _reduce_39( val, _values, result )
     type = val[0]
 
@@ -1309,21 +1353,21 @@ module_eval <<'.,.,', 'grammar.ra', 198
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 199
+module_eval <<'.,.,', 'grammar.ra', 200
   def _reduce_40( val, _values, result )
  result = :virtual
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 200
+module_eval <<'.,.,', 'grammar.ra', 201
   def _reduce_41( val, _values, result )
  result = :exported
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 224
+module_eval <<'.,.,', 'grammar.ra', 225
   def _reduce_42( val, _values, result )
     if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
@@ -1347,7 +1391,7 @@ module_eval <<'.,.,', 'grammar.ra', 224
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 243
+module_eval <<'.,.,', 'grammar.ra', 244
   def _reduce_43( val, _values, result )
     if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
@@ -1370,7 +1414,7 @@ module_eval <<'.,.,', 'grammar.ra', 243
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 253
+module_eval <<'.,.,', 'grammar.ra', 254
   def _reduce_44( val, _values, result )
     if val[1]
         result = val[1]
@@ -1382,7 +1426,7 @@ module_eval <<'.,.,', 'grammar.ra', 253
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 261
+module_eval <<'.,.,', 'grammar.ra', 262
   def _reduce_45( val, _values, result )
     if val[1]
         result = val[1]
@@ -1398,7 +1442,7 @@ module_eval <<'.,.,', 'grammar.ra', 261
 
  # reduce 47 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 269
+module_eval <<'.,.,', 'grammar.ra', 270
   def _reduce_48( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
    result
@@ -1407,7 +1451,7 @@ module_eval <<'.,.,', 'grammar.ra', 269
 
  # reduce 49 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 275
+module_eval <<'.,.,', 'grammar.ra', 276
   def _reduce_50( val, _values, result )
     result = val[1]
     result.parens = true
@@ -1415,21 +1459,21 @@ module_eval <<'.,.,', 'grammar.ra', 275
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 276
+module_eval <<'.,.,', 'grammar.ra', 277
   def _reduce_51( val, _values, result )
  result=val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 277
+module_eval <<'.,.,', 'grammar.ra', 278
   def _reduce_52( val, _values, result )
  result=val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 284
+module_eval <<'.,.,', 'grammar.ra', 285
   def _reduce_53( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
@@ -1438,7 +1482,7 @@ module_eval <<'.,.,', 'grammar.ra', 284
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 289
+module_eval <<'.,.,', 'grammar.ra', 290
   def _reduce_54( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1][:value], :test2 => val[2]
     #result = ast AST::CollExpr
@@ -1451,7 +1495,7 @@ module_eval <<'.,.,', 'grammar.ra', 289
 
  # reduce 56 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 296
+module_eval <<'.,.,', 'grammar.ra', 297
   def _reduce_57( val, _values, result )
     result = ast AST::ResourceInstance, :children => [val[0],val[2]]
    result
@@ -1460,7 +1504,7 @@ module_eval <<'.,.,', 'grammar.ra', 296
 
  # reduce 58 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 306
+module_eval <<'.,.,', 'grammar.ra', 307
   def _reduce_59( val, _values, result )
     if val[0].instance_of?(AST::ResourceInstance)
         result = ast AST::ASTArray, :children => [val[0],val[2]]
@@ -1476,21 +1520,21 @@ module_eval <<'.,.,', 'grammar.ra', 306
 
  # reduce 61 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 313
+module_eval <<'.,.,', 'grammar.ra', 314
   def _reduce_62( val, _values, result )
     result = ast AST::Undef, :value => :undef
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 317
+module_eval <<'.,.,', 'grammar.ra', 318
   def _reduce_63( val, _values, result )
     result = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 321
+module_eval <<'.,.,', 'grammar.ra', 322
   def _reduce_64( val, _values, result )
     result = ast AST::Type, :value => val[0][:value], :line => val[0][:line]
    result
@@ -1511,7 +1555,7 @@ module_eval <<'.,.,', 'grammar.ra', 321
 
  # reduce 71 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 338
+module_eval <<'.,.,', 'grammar.ra', 339
   def _reduce_72( val, _values, result )
     if val[0][:value] =~ /::/
         raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
@@ -1523,14 +1567,14 @@ module_eval <<'.,.,', 'grammar.ra', 338
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 341
+module_eval <<'.,.,', 'grammar.ra', 342
   def _reduce_73( val, _values, result )
     result = ast AST::VarDef, :name => val[0], :value => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 346
+module_eval <<'.,.,', 'grammar.ra', 347
   def _reduce_74( val, _values, result )
     variable = ast AST::Name, :value => val[0][:value], :line => val[0][:line]
     result = ast AST::VarDef, :name => variable, :value => val[2], :append => true, :line => val[0][:line]
@@ -1538,21 +1582,21 @@ module_eval <<'.,.,', 'grammar.ra', 346
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 351
+module_eval <<'.,.,', 'grammar.ra', 352
   def _reduce_75( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 351
+module_eval <<'.,.,', 'grammar.ra', 352
   def _reduce_76( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 360
+module_eval <<'.,.,', 'grammar.ra', 361
   def _reduce_77( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
@@ -1564,14 +1608,14 @@ module_eval <<'.,.,', 'grammar.ra', 360
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 364
+module_eval <<'.,.,', 'grammar.ra', 365
   def _reduce_78( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 369
+module_eval <<'.,.,', 'grammar.ra', 370
   def _reduce_79( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0][:value], :line => val[0][:line], :value => val[2],
                                      :add => true
@@ -1583,21 +1627,21 @@ module_eval <<'.,.,', 'grammar.ra', 369
 
  # reduce 81 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 377
+module_eval <<'.,.,', 'grammar.ra', 378
   def _reduce_82( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 377
+module_eval <<'.,.,', 'grammar.ra', 378
   def _reduce_83( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 386
+module_eval <<'.,.,', 'grammar.ra', 387
   def _reduce_84( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
@@ -1611,7 +1655,7 @@ module_eval <<'.,.,', 'grammar.ra', 386
 
  # reduce 85 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 395
+module_eval <<'.,.,', 'grammar.ra', 396
   def _reduce_86( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         result = val[0].push(val[2])
@@ -1658,7 +1702,7 @@ module_eval <<'.,.,', 'grammar.ra', 395
 
  # reduce 104 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 424
+module_eval <<'.,.,', 'grammar.ra', 425
   def _reduce_105( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
@@ -1669,7 +1713,7 @@ module_eval <<'.,.,', 'grammar.ra', 424
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 429
+module_eval <<'.,.,', 'grammar.ra', 430
   def _reduce_106( val, _values, result )
     result = ast AST::Function,
         :name => val[0][:value], :line => val[0][:line],
@@ -1679,44 +1723,65 @@ module_eval <<'.,.,', 'grammar.ra', 429
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 433
+module_eval <<'.,.,', 'grammar.ra', 431
   def _reduce_107( val, _values, result )
-    result = ast AST::String, :value => val[0][:value], :line => val[0][:line]
+ result = ast AST::String, :value => val[0][:value],                  :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 435
+module_eval <<'.,.,', 'grammar.ra', 432
   def _reduce_108( val, _values, result )
-    result = ast AST::FlatString, :value => val[0][:value], :line => val[0][:line]
+ result = ast AST::Concat, :value => [ast(AST::String,val[0])]+val[1], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 439
+module_eval <<'.,.,', 'grammar.ra', 434
   def _reduce_109( val, _values, result )
-    result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
+ result = [val[0]] + val[1]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 444
+module_eval <<'.,.,', 'grammar.ra', 436
   def _reduce_110( val, _values, result )
+ result = [ast(AST::String,val[0])]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 437
+  def _reduce_111( val, _values, result )
+ result = [ast(AST::String,val[0])] + val[1]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 442
+  def _reduce_112( val, _values, result )
+    result = ast AST::Boolean, :value => val[0][:value], :line => val[0][:line]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 447
+  def _reduce_113( val, _values, result )
     Puppet.warning addcontext("Deprecation notice:  Resource references should now be capitalized")
     result = ast AST::ResourceReference, :type => val[0][:value], :line => val[0][:line], :title => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 446
-  def _reduce_111( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 449
+  def _reduce_114( val, _values, result )
     result = ast AST::ResourceReference, :type => val[0], :title => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 460
-  def _reduce_112( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 463
+  def _reduce_115( val, _values, result )
     @lexer.commentpop
     args = {
         :test => val[1],
@@ -1732,8 +1797,8 @@ module_eval <<'.,.,', 'grammar.ra', 460
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 473
-  def _reduce_113( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 476
+  def _reduce_116( val, _values, result )
     @lexer.commentpop
     args = {
         :test => val[1],
@@ -1749,161 +1814,161 @@ module_eval <<'.,.,', 'grammar.ra', 473
   end
 .,.,
 
- # reduce 114 omitted
+ # reduce 117 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 479
-  def _reduce_115( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 482
+  def _reduce_118( val, _values, result )
     @lexer.commentpop
     result = ast AST::Else, :statements => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 483
-  def _reduce_116( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 486
+  def _reduce_119( val, _values, result )
     @lexer.commentpop
     result = ast AST::Else, :statements => ast(AST::Nop)
    result
   end
 .,.,
 
- # reduce 117 omitted
-
-module_eval <<'.,.,', 'grammar.ra', 500
-  def _reduce_118( val, _values, result )
-    result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
-   result
-  end
-.,.,
+ # reduce 120 omitted
 
 module_eval <<'.,.,', 'grammar.ra', 503
-  def _reduce_119( val, _values, result )
+  def _reduce_121( val, _values, result )
     result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 506
-  def _reduce_120( val, _values, result )
-    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+  def _reduce_122( val, _values, result )
+    result = ast AST::MatchOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 509
-  def _reduce_121( val, _values, result )
+  def _reduce_123( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 512
-  def _reduce_122( val, _values, result )
+  def _reduce_124( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 515
-  def _reduce_123( val, _values, result )
+  def _reduce_125( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 518
-  def _reduce_124( val, _values, result )
+  def _reduce_126( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 521
-  def _reduce_125( val, _values, result )
+  def _reduce_127( val, _values, result )
     result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 524
-  def _reduce_126( val, _values, result )
-    result = ast AST::Minus, :value => val[1]
+  def _reduce_128( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 527
-  def _reduce_127( val, _values, result )
-    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+  def _reduce_129( val, _values, result )
+    result = ast AST::Minus, :value => val[1]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 530
-  def _reduce_128( val, _values, result )
+  def _reduce_130( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 533
-  def _reduce_129( val, _values, result )
+  def _reduce_131( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 536
-  def _reduce_130( val, _values, result )
+  def _reduce_132( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 539
-  def _reduce_131( val, _values, result )
+  def _reduce_133( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 542
-  def _reduce_132( val, _values, result )
+  def _reduce_134( val, _values, result )
     result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 545
-  def _reduce_133( val, _values, result )
-    result = ast AST::Not, :value => val[1]
+  def _reduce_135( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 548
-  def _reduce_134( val, _values, result )
-    result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+  def _reduce_136( val, _values, result )
+    result = ast AST::Not, :value => val[1]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 551
-  def _reduce_135( val, _values, result )
+  def _reduce_137( val, _values, result )
     result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
    result
   end
 .,.,
 
 module_eval <<'.,.,', 'grammar.ra', 554
-  def _reduce_136( val, _values, result )
+  def _reduce_138( val, _values, result )
+    result = ast AST::BooleanOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 557
+  def _reduce_139( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 563
-  def _reduce_137( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 566
+  def _reduce_140( val, _values, result )
     @lexer.commentpop
     options = val[3]
     unless options.instance_of?(AST::ASTArray)
@@ -1914,10 +1979,10 @@ module_eval <<'.,.,', 'grammar.ra', 563
   end
 .,.,
 
- # reduce 138 omitted
+ # reduce 141 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 573
-  def _reduce_139( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 576
+  def _reduce_142( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push val[1]
         result = val[0]
@@ -1928,16 +1993,16 @@ module_eval <<'.,.,', 'grammar.ra', 573
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 578
-  def _reduce_140( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 581
+  def _reduce_143( val, _values, result )
     @lexer.commentpop
     result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 584
-  def _reduce_141( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 587
+  def _reduce_144( val, _values, result )
     @lexer.commentpop
     result = ast(AST::CaseOpt,
         :value => val[0],
@@ -1947,10 +2012,10 @@ module_eval <<'.,.,', 'grammar.ra', 584
   end
 .,.,
 
- # reduce 142 omitted
+ # reduce 145 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 594
-  def _reduce_143( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 597
+  def _reduce_146( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1961,27 +2026,27 @@ module_eval <<'.,.,', 'grammar.ra', 594
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 598
-  def _reduce_144( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 601
+  def _reduce_147( val, _values, result )
     result = ast AST::Selector, :param => val[0], :values => val[2]
    result
   end
 .,.,
 
- # reduce 145 omitted
+ # reduce 148 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 604
-  def _reduce_146( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 607
+  def _reduce_149( val, _values, result )
     @lexer.commentpop
     result = val[1]
    result
   end
 .,.,
 
- # reduce 147 omitted
+ # reduce 150 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 614
-  def _reduce_148( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 617
+  def _reduce_151( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1992,19 +2057,13 @@ module_eval <<'.,.,', 'grammar.ra', 614
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 618
-  def _reduce_149( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 621
+  def _reduce_152( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0], :value => val[2]
    result
   end
 .,.,
 
- # reduce 150 omitted
-
- # reduce 151 omitted
-
- # reduce 152 omitted
-
  # reduce 153 omitted
 
  # reduce 154 omitted
@@ -2013,31 +2072,37 @@ module_eval <<'.,.,', 'grammar.ra', 618
 
  # reduce 156 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 629
-  def _reduce_157( val, _values, result )
+ # reduce 157 omitted
+
+ # reduce 158 omitted
+
+ # reduce 159 omitted
+
+module_eval <<'.,.,', 'grammar.ra', 632
+  def _reduce_160( val, _values, result )
     result = ast AST::Default, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
- # reduce 158 omitted
+ # reduce 161 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 632
-  def _reduce_159( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 635
+  def _reduce_162( val, _values, result )
  result = [val[0].value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 636
-  def _reduce_160( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 639
+  def _reduce_163( val, _values, result )
     results = val[0] << val[2].value
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 644
-  def _reduce_161( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 647
+  def _reduce_164( val, _values, result )
     val[1].each do |file|
         import(file)
     end
@@ -2047,8 +2112,8 @@ module_eval <<'.,.,', 'grammar.ra', 644
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 655
-  def _reduce_162( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 658
+  def _reduce_165( val, _values, result )
     @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :code => val[4], :line => val[0][:line]
     @lexer.indefine = false
@@ -2059,8 +2124,8 @@ module_eval <<'.,.,', 'grammar.ra', 655
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 660
-  def _reduce_163( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 663
+  def _reduce_166( val, _values, result )
     @lexer.commentpop
     newdefine classname(val[1]), :arguments => val[2], :line => val[0][:line]
     @lexer.indefine = false
@@ -2069,8 +2134,8 @@ module_eval <<'.,.,', 'grammar.ra', 660
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 669
-  def _reduce_164( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 672
+  def _reduce_167( val, _values, result )
     @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -2080,8 +2145,8 @@ module_eval <<'.,.,', 'grammar.ra', 669
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 675
-  def _reduce_165( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 678
+  def _reduce_168( val, _values, result )
     @lexer.commentpop
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
@@ -2091,8 +2156,8 @@ module_eval <<'.,.,', 'grammar.ra', 675
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 681
-  def _reduce_166( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 684
+  def _reduce_169( val, _values, result )
     @lexer.commentpop
     newnode val[1], :parent => val[2], :code => val[4], :line => val[0][:line]
     result = nil
@@ -2100,8 +2165,8 @@ module_eval <<'.,.,', 'grammar.ra', 681
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 685
-  def _reduce_167( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 688
+  def _reduce_170( val, _values, result )
     @lexer.commentpop
     newnode val[1], :parent => val[2], :line => val[0][:line]
     result = nil
@@ -2109,38 +2174,38 @@ module_eval <<'.,.,', 'grammar.ra', 685
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 686
-  def _reduce_168( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 689
+  def _reduce_171( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 688
-  def _reduce_169( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 691
+  def _reduce_172( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 689
-  def _reduce_170( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 692
+  def _reduce_173( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 690
-  def _reduce_171( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 693
+  def _reduce_174( val, _values, result )
  result = "class"
    result
   end
 .,.,
 
- # reduce 172 omitted
+ # reduce 175 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 700
-  def _reduce_173( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 703
+  def _reduce_176( val, _values, result )
     result = val[0]
     result = [result] unless result.is_a?(Array)
     result << val[2]
@@ -2148,78 +2213,71 @@ module_eval <<'.,.,', 'grammar.ra', 700
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 704
-  def _reduce_174( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 707
+  def _reduce_177( val, _values, result )
     result = ast AST::HostName, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 705
-  def _reduce_175( val, _values, result )
- result = val[0][:value]
-   result
-  end
-.,.,
-
-module_eval <<'.,.,', 'grammar.ra', 706
-  def _reduce_176( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 708
+  def _reduce_178( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 707
-  def _reduce_177( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 709
+  def _reduce_179( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 708
-  def _reduce_178( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 710
+  def _reduce_180( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
- # reduce 179 omitted
+ # reduce 181 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 714
-  def _reduce_180( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 716
+  def _reduce_182( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 718
-  def _reduce_181( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 720
+  def _reduce_183( val, _values, result )
     result = ast AST::ASTArray, :children => []
    result
   end
 .,.,
 
- # reduce 182 omitted
+ # reduce 184 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 723
-  def _reduce_183( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 725
+  def _reduce_185( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 727
-  def _reduce_184( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 729
+  def _reduce_186( val, _values, result )
     result = val[1]
     result = [result] unless result[0].is_a?(Array)
    result
   end
 .,.,
 
- # reduce 185 omitted
+ # reduce 187 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 734
-  def _reduce_186( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 736
+  def _reduce_188( val, _values, result )
     result = val[0]
     result = [result] unless result[0].is_a?(Array)
     result << val[2]
@@ -2227,67 +2285,67 @@ module_eval <<'.,.,', 'grammar.ra', 734
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 739
-  def _reduce_187( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 741
+  def _reduce_189( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 743
-  def _reduce_188( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 745
+  def _reduce_190( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0][:value]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 745
-  def _reduce_189( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 747
+  def _reduce_191( val, _values, result )
     result = [val[0][:value], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 747
-  def _reduce_190( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 749
+  def _reduce_192( val, _values, result )
     result = [val[0][:value]]
    result
   end
 .,.,
 
- # reduce 191 omitted
+ # reduce 193 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 752
-  def _reduce_192( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 754
+  def _reduce_194( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 193 omitted
+ # reduce 195 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 757
-  def _reduce_194( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 759
+  def _reduce_196( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 195 omitted
+ # reduce 197 omitted
 
- # reduce 196 omitted
+ # reduce 198 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 763
-  def _reduce_197( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 765
+  def _reduce_199( val, _values, result )
     result = ast AST::Variable, :value => val[0][:value], :line => val[0][:line]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 771
-  def _reduce_198( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 773
+  def _reduce_200( val, _values, result )
     if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2297,8 +2355,8 @@ module_eval <<'.,.,', 'grammar.ra', 771
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 778
-  def _reduce_199( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 780
+  def _reduce_201( val, _values, result )
     if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -2308,35 +2366,35 @@ module_eval <<'.,.,', 'grammar.ra', 778
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 780
-  def _reduce_200( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 782
+  def _reduce_202( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
- # reduce 201 omitted
+ # reduce 203 omitted
 
- # reduce 202 omitted
+ # reduce 204 omitted
 
- # reduce 203 omitted
+ # reduce 205 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 785
-  def _reduce_204( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 787
+  def _reduce_206( val, _values, result )
  result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 790
-  def _reduce_205( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 792
+  def _reduce_207( val, _values, result )
     result = ast AST::Regex, :value => val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 798
-  def _reduce_206( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 800
+  def _reduce_208( val, _values, result )
     if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
@@ -2346,8 +2404,8 @@ module_eval <<'.,.,', 'grammar.ra', 798
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 805
-  def _reduce_207( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 807
+  def _reduce_209( val, _values, result )
     if val[1].instance_of?(AST::ASTHash)
         result = val[1]
     else
@@ -2357,17 +2415,17 @@ module_eval <<'.,.,', 'grammar.ra', 805
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 807
-  def _reduce_208( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 809
+  def _reduce_210( val, _values, result )
     result = ast AST::ASTHash
    result
   end
 .,.,
 
- # reduce 209 omitted
+ # reduce 211 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 817
-  def _reduce_210( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 819
+  def _reduce_212( val, _values, result )
     if val[0].instance_of?(AST::ASTHash)
         result = val[0].merge(val[2])
     else
@@ -2378,45 +2436,45 @@ module_eval <<'.,.,', 'grammar.ra', 817
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 821
-  def _reduce_211( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 823
+  def _reduce_213( val, _values, result )
     result = ast AST::ASTHash, { :value => { val[0] => val[2] } }
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 822
-  def _reduce_212( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 824
+  def _reduce_214( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 823
-  def _reduce_213( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 825
+  def _reduce_215( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 824
-  def _reduce_214( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 826
+  def _reduce_216( val, _values, result )
  result = val[0][:value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 829
-  def _reduce_215( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 831
+  def _reduce_217( val, _values, result )
     result = ast AST::HashOrArrayAccess, :variable => val[0][:value], :key => val[2]
    result
   end
 .,.,
 
- # reduce 216 omitted
+ # reduce 218 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 834
-  def _reduce_217( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 836
+  def _reduce_219( val, _values, result )
     result = ast AST::HashOrArrayAccess, :variable => val[0], :key => val[2]
    result
   end
diff --git a/spec/unit/parser/lexer.rb b/spec/unit/parser/lexer.rb
index a6aebc6..2e58ef4 100755
--- a/spec/unit/parser/lexer.rb
+++ b/spec/unit/parser/lexer.rb
@@ -5,18 +5,12 @@ require File.dirname(__FILE__) + '/../../spec_helper'
 require 'puppet/parser/lexer'
 
 # This is a special matcher to match easily lexer output
-Spec::Matchers.define :be_like do |ary|
-    match do |result|
-        r = true
-        result.zip(ary) do |a,b|
-            unless a[0] == b[0] and ((a[1].is_a?(Hash) and a[1][:value] == b[1]) or a[1] == b[1])
-                r = false
-                break
-            end
-        end
-        r
+Spec::Matchers.create :be_like do |*expected|
+    match do |actual|
+        expected.zip(actual).all? { |e,a| !e or a[0] == e or (e.is_a? Array and a[0] == e[0] and (a[1] == e[1] or (a[1].is_a?(Hash) and a[1][:value] == e[1]))) }
     end
 end
+__ = nil
 
 describe Puppet::Parser::Lexer do
     describe "when reading strings" do
@@ -217,7 +211,7 @@ describe Puppet::Parser::Lexer::TOKENS do
     end
 
     # These tokens' strings don't matter, just that the tokens exist.
-    [:DQTEXT, :SQTEXT, :BOOLEAN, :NAME, :NUMBER, :COMMENT, :MLCOMMENT, :RETURN, :SQUOTE, :DQUOTE, :VARIABLE].each do |name|
+    [:STRING, :DQPRE, :DQMID, :DQPOST, :BOOLEAN, :NAME, :NUMBER, :COMMENT, :MLCOMMENT, :RETURN, :SQUOTE, :DQUOTE, :VARIABLE].each do |name|
         it "should have a token named #{name.to_s}" do
             Puppet::Parser::Lexer::TOKENS[name].should_not be_nil
         end
@@ -294,7 +288,6 @@ end
 describe Puppet::Parser::Lexer::TOKENS[:NUMBER] do
     before do
         @token = Puppet::Parser::Lexer::TOKENS[:NUMBER]
-#        @regex = Regexp.new('^'+ at token.regex.source+'$')
         @regex = @token.regex
     end
 
@@ -401,48 +394,42 @@ describe Puppet::Parser::Lexer::TOKENS[:RETURN] do
     end
 end
 
-describe Puppet::Parser::Lexer::TOKENS[:SQUOTE] do
-    before { @token = Puppet::Parser::Lexer::TOKENS[:SQUOTE] }
-
-    it "should match against single quotes" do
-        @token.regex.should =~ "'"
-    end
-
-    it "should slurp the rest of the quoted string" do
-        lexer = stub("lexer")
-        lexer.expects(:slurpstring).with("myval").returns("otherval")
-        @token.convert(lexer, "myval")
-    end
-
-    it "should return the SQTEXT token with the slurped string" do
-        lexer = stub("lexer")
-        lexer.stubs(:slurpstring).with("myval").returns("otherval")
-        @token.convert(lexer, "myval").should == [Puppet::Parser::Lexer::TOKENS[:SQTEXT], "otherval"]
-    end
+def tokens_scanned_from(s)
+    lexer = Puppet::Parser::Lexer.new
+    lexer.string = s
+    lexer.fullscan[0..-2]
 end
 
-describe Puppet::Parser::Lexer::TOKENS[:DQUOTE] do
-    before { @token = Puppet::Parser::Lexer::TOKENS[:DQUOTE] }
-
-    it "should match against single quotes" do
-        @token.regex.should =~ '"'
-    end
-
-    it "should slurp the rest of the quoted string" do
-        lexer = stub("lexer")
-        lexer.expects(:slurpstring).with("myval").returns("otherval")
-        @token.convert(lexer, "myval")
-    end
-
-    it "should return the DQTEXT token with the slurped string" do
-        lexer = stub("lexer")
-        lexer.stubs(:slurpstring).with("myval").returns("otherval")
-        @token.convert(lexer, "myval").should == [Puppet::Parser::Lexer::TOKENS[:DQTEXT], "otherval"]
-    end
+describe Puppet::Parser::Lexer,"when lexing strings" do
+    {
+        %q['single quoted string')]                                     => [[:STRING,'single quoted string']],
+        %q["double quoted string"]                                      => [[:STRING,'double quoted string']],
+        %q['single quoted string with an escaped "\\'"']                => [[:STRING,'single quoted string with an escaped "\'"']],
+        %q["string with an escaped '\\"'"]                              => [[:STRING,"string with an escaped '\"'"]],
+        %q["string with an escaped '\\$'"]                              => [[:STRING,"string with an escaped '$'"]],
+        %q["string with $v (but no braces)"]                            => [[:DQPRE,"string with "],[:VARIABLE,'v'],[:DQPOST,' (but no braces)']],
+        %q["string with ${v} in braces"]                                => [[:DQPRE,"string with "],[:VARIABLE,'v'],[:DQPOST,' in braces']],
+        %q["string with $v and $v (but no braces)"]                     => [[:DQPRE,"string with "],[:VARIABLE,"v"],[:DQMID," and "],[:VARIABLE,"v"],[:DQPOST," (but no braces)"]],
+        %q["string with ${v} and ${v} in braces"]                       => [[:DQPRE,"string with "],[:VARIABLE,"v"],[:DQMID," and "],[:VARIABLE,"v"],[:DQPOST," in braces"]],
+        %q["string with ${'a nested single quoted string'} inside it."] => [[:DQPRE,"string with "],[:STRING,'a nested single quoted string'],[:DQPOST,' inside it.']],
+        %q["string with ${['an array ',$v2]} in it."]                   => [[:DQPRE,"string with "],:LBRACK,[:STRING,"an array "],:COMMA,[:VARIABLE,"v2"],:RBRACK,[:DQPOST," in it."]],
+        %q{a simple "scanner" test}                                     => [[:NAME,"a"],[:NAME,"simple"], [:STRING,"scanner"],[:NAME,"test"]],
+        %q{a simple 'single quote scanner' test}                        => [[:NAME,"a"],[:NAME,"simple"], [:STRING,"single quote scanner"],[:NAME,"test"]],
+        %q{a harder 'a $b \c"'}                                         => [[:NAME,"a"],[:NAME,"harder"], [:STRING,'a $b \c"']],
+        %q{a harder "scanner test"}                                     => [[:NAME,"a"],[:NAME,"harder"], [:STRING,"scanner test"]],
+        %q{a hardest "scanner \"test\""}                                => [[:NAME,"a"],[:NAME,"hardest"],[:STRING,'scanner "test"']],
+        %Q{a hardestest "scanner \\"test\\"\n"}                         => [[:NAME,"a"],[:NAME,"hardestest"],[:STRING,%Q{scanner "test"\n}]],
+        %q{function("call")}                                            => [[:NAME,"function"],[:LPAREN,"("],[:STRING,'call'],[:RPAREN,")"]],
+        %q["string with ${(3+5)/4} nested math."]                       => [[:DQPRE,"string with "],:LPAREN,[:NAME,"3"],:PLUS,[:NAME,"5"],:RPAREN,:DIV,[:NAME,"4"],[:DQPOST," nested math."]]
+    }.each { |src,expected_result|
+        it "should handle #{src} correctly" do
+            tokens_scanned_from(src).should be_like(*expected_result)
+        end
+    }
 end
 
-describe Puppet::Parser::Lexer::TOKENS[:VARIABLE] do
-    before { @token = Puppet::Parser::Lexer::TOKENS[:VARIABLE] }
+describe Puppet::Parser::Lexer::TOKENS[:DOLLAR_VAR] do
+    before { @token = Puppet::Parser::Lexer::TOKENS[:DOLLAR_VAR] }
 
     it "should match against alpha words prefixed with '$'" do
         @token.regex.should =~ '$this_var'
@@ -465,26 +452,16 @@ describe Puppet::Parser::Lexer::TOKENS[:REGEX] do
     end
 
     describe "when scanning" do
-        def tokens_scanned_from(s)
-            lexer = Puppet::Parser::Lexer.new
-            lexer.string = s
-            tokens = []
-            lexer.scan do |name, value|
-                tokens << value
-            end
-            tokens[0..-2]
-        end
-
         it "should not consider escaped slashes to be the end of a regex" do
-            tokens_scanned_from("$x =~ /this \\/ foo/").last[:value].should == Regexp.new("this / foo")
+            tokens_scanned_from("$x =~ /this \\/ foo/").should be_like(__,__,[:REGEX,%r{this / foo}])
         end
 
         it "should not lex chained division as a regex" do
-            tokens_scanned_from("$x = $a/$b/$c").any? {|t| t[:value].class == Regexp }.should == false
+            tokens_scanned_from("$x = $a/$b/$c").collect { |name, data| name }.should_not be_include( :REGEX )
         end
 
         it "should accept a regular expression after NODE" do
-            tokens_scanned_from("node /www.*\.mysite\.org/").last[:value].should == Regexp.new("www.*\.mysite\.org")
+            tokens_scanned_from("node /www.*\.mysite\.org/").should be_like(__,[:REGEX,Regexp.new("www.*\.mysite\.org")])
         end
 
         it "should accept regular expressions in a CASE" do
@@ -493,7 +470,9 @@ describe Puppet::Parser::Lexer::TOKENS[:REGEX] do
                 /regex/: {notice("this notably sucks")}
                 }
             }
-            tokens_scanned_from(s)[12][:value].should == Regexp.new("regex")
+            tokens_scanned_from(s).should be_like(
+                :CASE,:VARIABLE,:LBRACE,:STRING,:COLON,:LBRACE,:VARIABLE,:EQUALS,:NAME,:DIV,:NAME,:RBRACE,[:REGEX,/regex/],:COLON,:LBRACE,:NAME,:LPAREN,:STRING,:RPAREN,:RBRACE,:RBRACE
+            )
         end
  
    end
@@ -540,8 +519,7 @@ describe Puppet::Parser::Lexer, "when lexing comments" do
     end
 
     it "should skip whitespace before lexing the next token after a non-token" do
-        @lexer.string = "/* 1\n\n */ \ntest"
-        @lexer.fullscan.should be_like([[:NAME, "test"],[false,false]])
+        tokens_scanned_from("/* 1\n\n */ \ntest").should be_like([:NAME, "test"])
     end
 
     it "should not return comments seen after the current line" do
@@ -564,50 +542,17 @@ describe "Puppet::Parser::Lexer in the old tests" do
     before { @lexer = Puppet::Parser::Lexer.new }
 
     it "should do simple lexing" do
-        strings = {
-%q{\\} => [[:BACKSLASH,"\\"],[false,false]],
-%q{simplest scanner test} => [[:NAME,"simplest"],[:NAME,"scanner"],[:NAME,"test"],[false,false]],
-%q{returned scanner test
-} => [[:NAME,"returned"],[:NAME,"scanner"],[:NAME,"test"],[false,false]]
-        }
-        strings.each { |str,ary|
-            @lexer.string = str
-            @lexer.fullscan().should be_like(ary)
-        }
-    end
-
-    it "should correctly lex quoted strings" do
-        strings = {
-%q{a simple "scanner" test
-} => [[:NAME,"a"],[:NAME,"simple"],[:DQTEXT,"scanner"],[:NAME,"test"],[false,false]],
-%q{a simple 'single quote scanner' test
-} => [[:NAME,"a"],[:NAME,"simple"],[:SQTEXT,"single quote scanner"],[:NAME,"test"],[false,false]],
-%q{a harder 'a $b \c"'
-} => [[:NAME,"a"],[:NAME,"harder"],[:SQTEXT,'a $b \c"'],[false,false]],
-%q{a harder "scanner test"
-} => [[:NAME,"a"],[:NAME,"harder"],[:DQTEXT,"scanner test"],[false,false]],
-%q{a hardest "scanner \"test\""
-} => [[:NAME,"a"],[:NAME,"hardest"],[:DQTEXT,'scanner "test"'],[false,false]],
-%q{a hardestest "scanner \"test\"
-"
-} => [[:NAME,"a"],[:NAME,"hardestest"],[:DQTEXT,'scanner "test"
-'],[false,false]],
-%q{function("call")} => [[:NAME,"function"],[:LPAREN,"("],[:DQTEXT,'call'],[:RPAREN,")"],[false,false]]
-}
-        strings.each { |str,array|
-            @lexer.string = str
-            @lexer.fullscan().should be_like(array)
+        {
+            %q{\\}                      => [[:BACKSLASH,"\\"]],
+            %q{simplest scanner test}   => [[:NAME,"simplest"],[:NAME,"scanner"],[:NAME,"test"]],
+            %Q{returned scanner test\n} => [[:NAME,"returned"],[:NAME,"scanner"],[:NAME,"test"]]
+        }.each { |source,expected|
+            tokens_scanned_from(source).should be_like(*expected)
         }
     end
 
     it "should fail usefully" do
-        strings = %w{
-            ^
-        }
-        strings.each { |str|
-            @lexer.string = str
-            lambda { @lexer.fullscan() }.should raise_error(RuntimeError)
-        }
+        lambda { tokens_scanned_from('^') }.should raise_error(RuntimeError)
     end
 
     it "should fail if the string is not set" do
@@ -615,106 +560,64 @@ describe "Puppet::Parser::Lexer in the old tests" do
     end
 
     it "should correctly identify keywords" do
-        @lexer.string = "case"
-        @lexer.fullscan.should be_like([[:CASE, "case"], [false, false]])
+        tokens_scanned_from("case").should be_like([:CASE, "case"])
     end
 
-    it "should correctly match strings" do
-        names = %w{this is a bunch of names}
-        types = %w{Many Different Words A Word}
-        words = %w{differently Cased words A a}
+    it "should correctly parse class references" do
+        %w{Many Different Words A Word}.each { |t| tokens_scanned_from(t).should be_like([:CLASSREF,t])}
+    end
 
-        names.each { |t|
-            @lexer.string = t
-            @lexer.fullscan.should be_like([[:NAME,t],[false,false]])
-        }
-        types.each { |t|
-            @lexer.string = t
-            @lexer.fullscan.should be_like([[:CLASSREF,t],[false,false]])
-        }
+    # #774
+    it "should correctly parse namespaced class refernces token" do
+        %w{Foo ::Foo Foo::Bar ::Foo::Bar}.each { |t| tokens_scanned_from(t).should be_like([:CLASSREF, t]) }
     end
 
-    it "should correctly parse names with numerals" do
-       string = %w{1name name1 11names names11}
+    it "should correctly parse names" do
+        %w{this is a bunch of names}.each { |t| tokens_scanned_from(t).should be_like([:NAME,t]) }
+    end
 
-       string.each { |t|
-            @lexer.string = t
-            @lexer.fullscan.should be_like([[:NAME,t],[false,false]])
-       }
+    it "should correctly parse names with numerals" do
+        %w{1name name1 11names names11}.each { |t| tokens_scanned_from(t).should be_like([:NAME,t]) }
     end
 
     it "should correctly parse empty strings" do
-        bit = '$var = ""'
-
-        @lexer.string = bit
-
-        lambda { @lexer.fullscan }.should_not raise_error
+        lambda { tokens_scanned_from('$var = ""') }.should_not raise_error
     end
 
     it "should correctly parse virtual resources" do
-        string = "@type {"
-
-        @lexer.string = string
-
-        @lexer.fullscan.should be_like([[:AT, "@"], [:NAME, "type"], [:LBRACE, "{"], [false,false]])
+        tokens_scanned_from("@type {").should be_like([:AT, "@"], [:NAME, "type"], [:LBRACE, "{"])
     end
 
     it "should correctly deal with namespaces" do
         @lexer.string = %{class myclass}
-
         @lexer.fullscan
-
         @lexer.namespace.should == "myclass"
 
         @lexer.namepop
-
         @lexer.namespace.should == ""
 
         @lexer.string = "class base { class sub { class more"
-
         @lexer.fullscan
-
         @lexer.namespace.should == "base::sub::more"
 
         @lexer.namepop
-
         @lexer.namespace.should == "base::sub"
     end
 
     it "should correctly handle fully qualified names" do
         @lexer.string = "class base { class sub::more {"
-
         @lexer.fullscan
-
         @lexer.namespace.should == "base::sub::more"
 
         @lexer.namepop
-
         @lexer.namespace.should == "base"
     end
 
     it "should correctly lex variables" do
         ["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable"].each do |string|
-            @lexer.string = string
-
-            @lexer.scan do |t, s|
-                t.should == :VARIABLE
-                string.sub(/^\$/, '').should == s[:value]
-                break
-            end
+            tokens_scanned_from(string).should be_like([:VARIABLE,string.sub(/^\$/,'')])
         end
     end
-
-    # #774
-    it "should correctly parse the CLASSREF token" do
-        string = ["Foo", "::Foo","Foo::Bar","::Foo::Bar"]
-
-        string.each do |foo|
-            @lexer.string = foo
-            @lexer.fullscan.should be_like([[:CLASSREF, foo],[false,false]])
-        end
-    end
-
 end
 
 require 'puppettest/support/utils'

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list