[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. debian/0.24.6-1-356-g5718585

James Turnbull james at lovedthanlost.net
Fri Jan 23 14:21:05 UTC 2009


The following commit has been merged in the master branch:
commit 4cf9710bd27fdb5f0720f4d8478ef940e7c4ba59
Author: Brice Figureau <brice-puppet at daysofwonder.com>
Date:   Fri Sep 26 23:03:39 2008 +0200

    Add parser for arbitrary expressions
    
    The expressions can be used in if 'test' and in the
    right side of assignements.
    
    The expressions can contain any number of sub-expressions
    combined by either arithmetic operators, comparison operators,
    or boolean operators.
    
    Random Usage Examples:
    $result = ((( $two + 2) / $one) + 4 * 5.45) - (6 << 7) + (0x800 + -9)
    or
    if ($a < 10) and ($a + 10 != 200) {
    ...
    }

diff --git a/CHANGELOG b/CHANGELOG
index 0de05e0..7ffe429 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,6 @@
 0.24.x
+    Fixed #1585 - Allow complex 'if' and variable expressions
+
     Fixed #1564 - Saving File#checksum to state.yaml broken
 
     Fixed #1603 - Added support for running Puppet inside a Rack application
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
index 07666ac..b44cd06 100644
--- a/lib/puppet/parser/grammar.ra
+++ b/lib/puppet/parser/grammar.ra
@@ -9,7 +9,19 @@ 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
 token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSNAME CLASSREF
-token NOT OR AND UNDEF PARROW
+token NOT OR AND UNDEF PARROW PLUS MINUS TIMES DIV LSHIFT RSHIFT UMINUS
+
+prechigh
+    right NOT
+    nonassoc UMINUS
+    left  TIMES DIV
+    left  MINUS PLUS
+    left  LSHIFT RSHIFT
+    left  NOTEQUAL ISEQUAL
+    left  GREATEREQUAL GREATERTHAN LESSTHAN LESSEQUAL
+    left  AND
+    left  OR
+preclow
 
 rule
 program:    statements {
@@ -283,7 +295,7 @@ resourcename:   quotedtext
             | variable
             | array
 
-assignment:     VARIABLE EQUALS rvalue {
+assignment:     VARIABLE EQUALS expression {
     if val[0] =~ /::/
         raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
     end
@@ -292,7 +304,7 @@ assignment:     VARIABLE EQUALS rvalue {
     result = ast AST::VarDef, :name => variable, :value => val[2]
 }
 
-append:     VARIABLE APPENDS rvalue {
+append:     VARIABLE APPENDS expression {
     variable = ast AST::Name, :value => val[0]
     result = ast AST::VarDef, :name => variable, :value => val[2], :append => true
 }
@@ -395,7 +407,7 @@ resourceref: NAME LBRACK rvalue RBRACK {
     result = ast AST::ResourceReference, :type => val[0], :title => val[2]
 }
 
-ifstatement:      IF iftest LBRACE statements RBRACE else {
+ifstatement:      IF expression LBRACE statements RBRACE else {
     args = {
         :test => val[1],
         :statements => val[3]
@@ -413,9 +425,70 @@ else:             # nothing
     result = ast AST::Else, :statements => val[2]
 }
 
-# Currently we only support a single value, but eventually one assumes
-# we'll support operators and such.
-iftest:         rvalue
+# Unlike yacc/bison, it seems racc
+# gives tons of shift/reduce warnings
+# with the following syntax:
+# 
+# expression: ...
+#            | expression arithop expressio { ... }
+#            
+# arithop: PLUS | MINUS | DIVIDE | TIMES ...
+#
+# So I had to develop the expression by adding one rule
+# per operator :-(
+
+expression:   rvalue
+            | expression PLUS expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression MINUS expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression DIV expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression TIMES expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression LSHIFT expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression RSHIFT expression {
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | MINUS expression =UMINUS {
+    result = ast AST::Minus, :value => val[1]
+}
+            | expression NOTEQUAL expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression ISEQUAL expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression GREATERTHAN expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression GREATEREQUAL expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression LESSTHAN expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | expression LESSEQUAL expression {
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}
+            | NOT expression {
+    result = ast AST::Not, :value => val[1]
+}
+            | expression AND expression {
+    result = ast AST::BooleanOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}            
+            | expression OR expression {
+    result = ast AST::BooleanOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+}            
+            | LPAREN expression RPAREN {
+    result = val[1]
+}
 
 casestatement:  CASE rvalue LBRACE caseopts RBRACE {
     options = val[3]
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index 71210d9..5dd036e 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -126,12 +126,22 @@ class Puppet::Parser::Lexer
         '\\' => :BACKSLASH,
         '=>' => :FARROW,
         '+>' => :PARROW,
+        '+' => :PLUS,
+        '-' => :MINUS,
+        '/' => :DIV,
+        '*' => :TIMES,
+        '<<' => :LSHIFT,
+        '>>' => :RSHIFT,
         %r{([a-z][-\w]*::)+[a-z][-\w]*} => :CLASSNAME,
         %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF
     )
 
     TOKENS.add_tokens "Whatever" => :DQTEXT, "Nomatter" => :SQTEXT, "alsonomatter" => :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]
+    end
+
     TOKENS.add_token :NAME, %r{[a-z0-9][-\w]*} do |lexer, value|
         string_token = self
         # we're looking for keywords here
@@ -145,10 +155,6 @@ class Puppet::Parser::Lexer
         [string_token, value]
     end
 
-    TOKENS.add_token :NUMBER, %r{[0-9]+} do |lexer, value|
-        [TOKENS[:NAME], value]
-    end
-
     TOKENS.add_token :COMMENT, %r{#.*}, :skip => true
 
     TOKENS.add_token :RETURN, "\n", :skip => true, :incr_line => true, :skip_text => true
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index 69225cc..b8aa4b5 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -29,7 +29,7 @@ module Puppet
 
     class Parser < Racc::Parser
 
-module_eval <<'..end grammar.ra modeval..id7dbe8301d1', 'grammar.ra', 644
+module_eval <<'..end grammar.ra modeval..id272fb19b12', 'grammar.ra', 717
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -41,524 +41,687 @@ require 'puppet/parser/parser_support'
 
 # $Id$
 
-..end grammar.ra modeval..id7dbe8301d1
+..end grammar.ra modeval..id272fb19b12
 
 ##### racc 1.4.5 generates ###
 
 racc_reduce_table = [
  0, 0, :racc_error,
- 1, 53, :_reduce_1,
- 1, 53, :_reduce_none,
- 1, 54, :_reduce_none,
- 2, 54, :_reduce_4,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 1, 56, :_reduce_none,
- 4, 64, :_reduce_18,
- 3, 64, :_reduce_19,
- 2, 64, :_reduce_20,
- 1, 70, :_reduce_none,
- 1, 70, :_reduce_none,
- 1, 71, :_reduce_none,
- 3, 71, :_reduce_24,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_none,
- 1, 73, :_reduce_32,
- 1, 72, :_reduce_none,
- 3, 72, :_reduce_34,
- 5, 57, :_reduce_35,
- 5, 57, :_reduce_36,
- 5, 57, :_reduce_37,
- 5, 68, :_reduce_38,
- 2, 58, :_reduce_39,
- 1, 89, :_reduce_40,
- 2, 89, :_reduce_41,
- 2, 59, :_reduce_42,
- 3, 90, :_reduce_43,
- 3, 90, :_reduce_44,
- 1, 91, :_reduce_none,
- 1, 91, :_reduce_none,
- 3, 91, :_reduce_47,
- 1, 92, :_reduce_none,
- 3, 92, :_reduce_49,
- 1, 93, :_reduce_none,
- 1, 93, :_reduce_none,
- 3, 94, :_reduce_52,
- 3, 94, :_reduce_53,
- 1, 95, :_reduce_none,
- 1, 95, :_reduce_none,
- 4, 97, :_reduce_56,
- 1, 83, :_reduce_none,
- 3, 83, :_reduce_58,
- 0, 84, :_reduce_none,
- 1, 84, :_reduce_none,
- 1, 99, :_reduce_61,
- 1, 74, :_reduce_62,
- 1, 76, :_reduce_63,
- 1, 98, :_reduce_none,
- 1, 98, :_reduce_none,
+ 1, 60, :_reduce_1,
+ 1, 60, :_reduce_none,
+ 1, 61, :_reduce_none,
+ 2, 61, :_reduce_4,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 1, 63, :_reduce_none,
+ 4, 71, :_reduce_18,
+ 3, 71, :_reduce_19,
+ 2, 71, :_reduce_20,
+ 1, 77, :_reduce_none,
+ 1, 77, :_reduce_none,
+ 1, 78, :_reduce_none,
+ 3, 78, :_reduce_24,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_none,
+ 1, 80, :_reduce_32,
+ 1, 79, :_reduce_none,
+ 3, 79, :_reduce_34,
+ 5, 64, :_reduce_35,
+ 5, 64, :_reduce_36,
+ 5, 64, :_reduce_37,
+ 5, 75, :_reduce_38,
+ 2, 65, :_reduce_39,
+ 1, 96, :_reduce_40,
+ 2, 96, :_reduce_41,
+ 2, 66, :_reduce_42,
+ 3, 97, :_reduce_43,
+ 3, 97, :_reduce_44,
  1, 98, :_reduce_none,
  1, 98, :_reduce_none,
- 1, 98, :_reduce_none,
- 1, 98, :_reduce_none,
- 3, 60, :_reduce_70,
- 3, 69, :_reduce_71,
- 0, 85, :_reduce_72,
- 1, 85, :_reduce_73,
- 3, 85, :_reduce_74,
- 3, 102, :_reduce_75,
- 3, 103, :_reduce_76,
- 1, 104, :_reduce_none,
- 1, 104, :_reduce_none,
- 0, 88, :_reduce_79,
- 1, 88, :_reduce_80,
- 3, 88, :_reduce_81,
+ 3, 98, :_reduce_47,
+ 1, 99, :_reduce_none,
+ 3, 99, :_reduce_49,
+ 1, 100, :_reduce_none,
+ 1, 100, :_reduce_none,
+ 3, 101, :_reduce_52,
+ 3, 101, :_reduce_53,
+ 1, 102, :_reduce_none,
+ 1, 102, :_reduce_none,
+ 4, 104, :_reduce_56,
+ 1, 90, :_reduce_none,
+ 3, 90, :_reduce_58,
+ 0, 91, :_reduce_none,
+ 1, 91, :_reduce_none,
+ 1, 106, :_reduce_61,
+ 1, 81, :_reduce_62,
+ 1, 83, :_reduce_63,
  1, 105, :_reduce_none,
- 3, 105, :_reduce_83,
- 1, 96, :_reduce_none,
- 1, 96, :_reduce_none,
- 1, 96, :_reduce_none,
- 1, 96, :_reduce_none,
- 1, 96, :_reduce_none,
- 1, 96, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 1, 101, :_reduce_none,
- 4, 78, :_reduce_100,
- 3, 78, :_reduce_101,
- 1, 80, :_reduce_102,
- 1, 80, :_reduce_103,
- 1, 77, :_reduce_104,
- 4, 81, :_reduce_105,
- 4, 81, :_reduce_106,
- 6, 62, :_reduce_107,
- 0, 108, :_reduce_none,
- 4, 108, :_reduce_109,
- 1, 107, :_reduce_none,
- 5, 61, :_reduce_111,
- 1, 109, :_reduce_none,
- 2, 109, :_reduce_113,
- 5, 110, :_reduce_114,
- 4, 110, :_reduce_115,
- 1, 111, :_reduce_none,
- 3, 111, :_reduce_117,
- 3, 79, :_reduce_118,
- 1, 113, :_reduce_none,
- 4, 113, :_reduce_120,
- 1, 115, :_reduce_none,
- 3, 115, :_reduce_122,
- 3, 114, :_reduce_123,
- 1, 112, :_reduce_none,
- 1, 112, :_reduce_none,
- 1, 112, :_reduce_none,
- 1, 112, :_reduce_none,
- 1, 112, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 1, 105, :_reduce_none,
+ 3, 67, :_reduce_70,
+ 3, 76, :_reduce_71,
+ 0, 92, :_reduce_72,
+ 1, 92, :_reduce_73,
+ 3, 92, :_reduce_74,
+ 3, 109, :_reduce_75,
+ 3, 111, :_reduce_76,
  1, 112, :_reduce_none,
  1, 112, :_reduce_none,
- 1, 112, :_reduce_131,
- 1, 116, :_reduce_132,
- 3, 116, :_reduce_133,
- 2, 63, :_reduce_134,
- 6, 65, :_reduce_135,
- 5, 65, :_reduce_136,
- 6, 66, :_reduce_137,
- 5, 66, :_reduce_138,
- 6, 67, :_reduce_139,
- 5, 67, :_reduce_140,
- 1, 87, :_reduce_none,
- 1, 82, :_reduce_none,
- 1, 82, :_reduce_none,
- 1, 119, :_reduce_none,
- 3, 119, :_reduce_145,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 1, 121, :_reduce_none,
- 0, 55, :_reduce_150,
- 0, 122, :_reduce_151,
- 1, 117, :_reduce_none,
- 3, 117, :_reduce_153,
- 3, 117, :_reduce_154,
- 1, 123, :_reduce_none,
- 3, 123, :_reduce_156,
- 3, 124, :_reduce_157,
- 1, 124, :_reduce_158,
- 3, 124, :_reduce_159,
- 1, 124, :_reduce_160,
- 1, 120, :_reduce_none,
- 2, 120, :_reduce_162,
+ 0, 95, :_reduce_79,
+ 1, 95, :_reduce_80,
+ 3, 95, :_reduce_81,
+ 1, 113, :_reduce_none,
+ 3, 113, :_reduce_83,
+ 1, 103, :_reduce_none,
+ 1, 103, :_reduce_none,
+ 1, 103, :_reduce_none,
+ 1, 103, :_reduce_none,
+ 1, 103, :_reduce_none,
+ 1, 103, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 4, 85, :_reduce_100,
+ 3, 85, :_reduce_101,
+ 1, 87, :_reduce_102,
+ 1, 87, :_reduce_103,
+ 1, 84, :_reduce_104,
+ 4, 88, :_reduce_105,
+ 4, 88, :_reduce_106,
+ 6, 69, :_reduce_107,
+ 0, 115, :_reduce_none,
+ 4, 115, :_reduce_109,
+ 1, 108, :_reduce_none,
+ 3, 108, :_reduce_111,
+ 3, 108, :_reduce_112,
+ 3, 108, :_reduce_113,
+ 3, 108, :_reduce_114,
+ 3, 108, :_reduce_115,
+ 3, 108, :_reduce_116,
+ 2, 108, :_reduce_117,
+ 3, 108, :_reduce_118,
+ 3, 108, :_reduce_119,
+ 3, 108, :_reduce_120,
+ 3, 108, :_reduce_121,
+ 3, 108, :_reduce_122,
+ 3, 108, :_reduce_123,
+ 2, 108, :_reduce_124,
+ 3, 108, :_reduce_125,
+ 3, 108, :_reduce_126,
+ 3, 108, :_reduce_127,
+ 5, 68, :_reduce_128,
+ 1, 116, :_reduce_none,
+ 2, 116, :_reduce_130,
+ 5, 117, :_reduce_131,
+ 4, 117, :_reduce_132,
  1, 118, :_reduce_none,
- 2, 118, :_reduce_164,
- 1, 125, :_reduce_none,
+ 3, 118, :_reduce_134,
+ 3, 86, :_reduce_135,
+ 1, 120, :_reduce_none,
+ 4, 120, :_reduce_137,
+ 1, 122, :_reduce_none,
+ 3, 122, :_reduce_139,
+ 3, 121, :_reduce_140,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_none,
+ 1, 119, :_reduce_148,
+ 1, 123, :_reduce_149,
+ 3, 123, :_reduce_150,
+ 2, 70, :_reduce_151,
+ 6, 72, :_reduce_152,
+ 5, 72, :_reduce_153,
+ 6, 73, :_reduce_154,
+ 5, 73, :_reduce_155,
+ 6, 74, :_reduce_156,
+ 5, 74, :_reduce_157,
+ 1, 94, :_reduce_none,
+ 1, 89, :_reduce_none,
+ 1, 89, :_reduce_none,
+ 1, 126, :_reduce_none,
+ 3, 126, :_reduce_162,
+ 1, 128, :_reduce_none,
+ 1, 128, :_reduce_none,
+ 1, 128, :_reduce_none,
+ 1, 128, :_reduce_none,
+ 0, 62, :_reduce_167,
+ 0, 129, :_reduce_168,
+ 1, 124, :_reduce_none,
+ 3, 124, :_reduce_170,
+ 3, 124, :_reduce_171,
+ 1, 130, :_reduce_none,
+ 3, 130, :_reduce_173,
+ 3, 131, :_reduce_174,
+ 1, 131, :_reduce_175,
+ 3, 131, :_reduce_176,
+ 1, 131, :_reduce_177,
+ 1, 127, :_reduce_none,
+ 2, 127, :_reduce_179,
  1, 125, :_reduce_none,
- 1, 75, :_reduce_167,
- 3, 100, :_reduce_168,
- 2, 100, :_reduce_169,
- 1, 106, :_reduce_none,
- 1, 106, :_reduce_none,
- 0, 86, :_reduce_none,
- 1, 86, :_reduce_173 ]
+ 2, 125, :_reduce_181,
+ 1, 132, :_reduce_none,
+ 1, 132, :_reduce_none,
+ 1, 82, :_reduce_184,
+ 3, 107, :_reduce_185,
+ 2, 107, :_reduce_186,
+ 1, 114, :_reduce_none,
+ 1, 114, :_reduce_none,
+ 0, 93, :_reduce_none,
+ 1, 93, :_reduce_190 ]
 
-racc_reduce_n = 174
+racc_reduce_n = 191
 
-racc_shift_n = 279
+racc_shift_n = 314
 
 racc_action_table = [
-    77,    57,    60,   246,   167,   105,    77,    57,    60,   101,
-   199,   235,  -124,   167,   241,   203,    77,    57,    60,   234,
-    54,    92,    77,    57,    60,    94,   131,   240,   208,   209,
-   104,    47,    77,    57,    60,    59,    63,    47,    95,    68,
-   131,    59,    63,   137,    55,    68,   166,    47,    65,   211,
-    55,    59,   178,    47,    65,    68,  -125,    59,    63,   173,
-   116,    68,    96,    47,    65,  -126,    55,    59,   119,  -128,
-    65,    68,    77,    57,    60,   147,   116,   208,   209,   147,
-    65,   213,    77,    57,    60,   147,    47,    40,    41,   212,
-    47,   151,    54,    57,    60,   151,    47,    35,    77,    57,
-    60,   151,   188,    47,     4,     9,   172,    59,    63,   199,
-     9,    68,    50,    47,   203,  -125,    55,    59,    63,   204,
-    65,    68,    42,    47,   205,    43,    55,    59,    63,    47,
-    65,    68,    35,    59,    63,    51,    55,    68,   167,     4,
-    65,   147,    55,    77,    57,    60,    65,    33,    34,    77,
-    57,    60,    47,   171,    40,    41,    35,   151,  -127,    77,
-    57,    60,  -129,     4,   214,    77,    57,    60,   208,   209,
-    40,    41,    57,    60,    47,    77,    57,    60,    59,    63,
-    47,   171,    68,  -124,    59,    63,  -130,    55,    68,    42,
-    47,    65,    43,    55,    59,    63,    47,    65,    68,  -125,
-    59,    63,   219,    55,    68,    42,    47,    65,    43,    55,
-    59,    63,   111,    65,    68,    77,    57,    60,    92,    55,
-   191,   262,  -127,    65,  -124,    77,    57,    60,   135,    57,
-    60,    35,    57,    60,   159,   189,   224,   225,     4,   191,
-   192,   145,    57,    60,   145,   228,    47,   131,    57,    60,
-    59,    63,   127,   133,    68,   231,    47,    54,   132,    55,
-    59,    63,    47,    65,    68,  -126,    59,    63,   168,    55,
-    68,  -141,    47,    65,    51,    55,    59,   178,    47,    65,
-    68,   238,    59,   178,   239,   116,    68,    57,    60,    65,
-  -126,   116,   242,    57,    60,    65,   129,   245,  -128,   138,
-  -129,   111,    94,    57,    60,  -127,   171,    91,   165,   263,
-   265,    90,   163,    57,    60,   139,   140,    47,    46,    57,
-    60,    59,   178,    47,  -129,    68,  -126,    59,   178,    51,
-   116,    68,  -124,    47,    65,  -127,   116,    59,   178,   184,
-    65,    68,  -125,    47,    57,    60,   116,    59,   178,    47,
-    65,    68,    45,    59,    63,   272,   116,    68,  -173,   273,
-    65,    51,    55,   160,    57,    60,    65,   179,   143,   145,
-   183,    57,    60,   nil,    47,   237,   nil,   nil,    59,   178,
-   nil,   nil,    68,   nil,   nil,   nil,   nil,   116,   nil,   nil,
-   nil,    65,   nil,   nil,    47,   nil,   278,   nil,    59,   178,
-   nil,    47,    68,   nil,   nil,    59,   178,   116,   nil,    68,
-   nil,    65,   nil,   nil,   116,   257,   nil,    20,    65,    24,
-    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,    22,
-   nil,    27,   nil,   nil,     4,     9,    20,   243,    24,    26,
-   nil,     1,     5,   nil,    12,   nil,    18,   nil,    22,   nil,
-    27,   nil,   nil,     4,     9,   nil,   270,   nil,    20,   nil,
-    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,
-    22,   nil,    27,   nil,   nil,     4,     9,    20,   233,    24,
-    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,    22,
-   nil,    27,   nil,   nil,     4,     9,   nil,   277,   nil,    20,
-   nil,    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,
-   nil,    22,   nil,    27,   nil,   nil,     4,     9,    20,   274,
-    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,
-    22,   nil,    27,   nil,   nil,     4,     9,   nil,   217,   nil,
-    20,   nil,    24,    26,   nil,     1,     5,   nil,    12,   nil,
-    18,   nil,    22,   nil,    27,   nil,   nil,     4,     9,    20,
-   215,    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,
-   nil,    22,   nil,    27,   nil,   nil,     4,     9,   nil,   256,
-   nil,    20,   nil,    24,    26,   nil,     1,     5,   nil,    12,
-   nil,    18,   nil,    22,   nil,    27,   nil,   nil,     4,     9,
-    20,   nil,    24,    26,   nil,     1,     5,   nil,    12,   nil,
-    18,   nil,    22,   nil,    27,   nil,   nil,     4,     9,    20,
-   nil,    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,
-   nil,    22,   nil,    27,   nil,   nil,     4,     9,    20,   nil,
-    24,    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,
-    22,   nil,    27,   nil,   nil,     4,     9,    20,   nil,    24,
-    26,   nil,     1,     5,   nil,    12,   nil,    18,   nil,    22,
-   nil,    27,   nil,   nil,     4,     9,    20,   nil,    24,    26,
-   nil,     1,     5,   nil,    12,   nil,    18,   nil,    22,   nil,
-    27,   nil,   nil,     4,     9 ]
+    75,    54,    57,   270,   178,    39,    40,   283,    88,   237,
+    51,   178,    89,   238,   244,   282,   286,   235,   236,   245,
+    72,    75,    54,    57,   135,    90,    39,    40,   235,   236,
+   135,    45,    39,    40,   129,    56,    59,   235,   236,    66,
+    41,    72,   154,    44,    52,    76,   177,   162,    62,    92,
+   146,    84,    45,    75,    54,    57,    56,    59,    45,   126,
+    66,    41,   178,   167,    44,    52,    76,    41,   188,    62,
+    44,   249,    84,    72,    75,    54,    57,   288,   156,   157,
+   158,   144,   145,   147,    45,   198,    54,    57,    56,    59,
+   287,   233,    66,     8,    72,   154,  -141,    52,    76,   232,
+   162,    62,   137,   146,    84,    45,    75,    54,    57,    56,
+    59,    45,   252,    66,    37,   105,   167,    37,    52,    76,
+   183,     4,    62,    37,     4,    84,    72,    75,    54,    57,
+     4,   156,   157,   158,   144,   145,   147,    45,  -143,   211,
+   256,    56,    59,   212,   213,    66,   136,    72,   154,   258,
+    52,    76,   161,   162,    62,   161,   146,    84,    45,    75,
+    54,    57,    56,    59,    45,   244,    66,    54,    57,   167,
+   245,    52,    76,    33,    34,    62,   212,   296,    84,    72,
+    75,    54,    57,  -145,   156,   157,   158,   144,   145,   147,
+    45,   158,   144,   135,    56,    59,   158,   144,    66,    51,
+    72,   154,   263,    52,    76,  -146,   162,    62,   266,   146,
+    84,    45,    75,    54,    57,    56,    59,    45,  -142,    66,
+   229,  -142,   167,  -147,    52,    76,    88,  -144,    62,  -146,
+  -141,    84,    72,    75,    54,    57,   134,   156,   157,   158,
+   144,   145,   147,    45,  -158,  -145,   132,    56,    59,  -143,
+   161,    66,   269,    72,    37,   172,    52,    76,   173,   108,
+    62,     4,     8,    84,    45,    89,   105,   174,    56,    59,
+   155,   284,    66,   156,   157,   158,   144,    52,    76,   150,
+   154,    62,   285,  -144,    84,   180,   100,   184,   146,   148,
+   151,   153,   188,   186,    75,    54,    57,   156,   157,   158,
+   144,   145,   147,   156,   157,   158,   144,   145,   147,  -141,
+   196,   299,   149,   152,    72,  -141,   156,   157,   158,   144,
+   145,   147,  -144,  -142,  -146,    45,    75,    54,    57,    56,
+    59,  -143,   300,    66,   156,   157,   158,   144,    52,    76,
+   188,    71,    62,   193,   191,    84,    72,    75,    54,    57,
+    38,  -143,   307,  -190,   308,    35,   189,    45,  -142,  -144,
+   nil,    56,    59,   nil,   nil,    66,   nil,    72,   nil,   nil,
+    52,    76,   nil,   nil,    62,   nil,   nil,    84,    45,    75,
+    54,    57,    56,    59,   nil,   nil,    66,   nil,   nil,   nil,
+   nil,    52,    76,   nil,   nil,    62,   nil,   nil,    84,    72,
+    75,    54,    57,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    45,   nil,   nil,   nil,    56,    59,   nil,   nil,    66,   nil,
+    72,   nil,   nil,    52,    76,   nil,   nil,    62,   nil,   nil,
+    84,    45,    75,    54,    57,    56,    59,   nil,   nil,    66,
+   nil,   nil,   nil,   nil,    52,    76,   nil,   nil,    62,   nil,
+   nil,    84,    72,    75,    54,    57,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    45,   nil,   nil,   nil,    56,    59,   nil,
+   nil,    66,   nil,    72,   nil,   nil,    52,    76,   nil,   nil,
+    62,   nil,   nil,    84,    45,    75,    54,    57,    56,    59,
+   nil,   nil,    66,   nil,   nil,   nil,   nil,    52,    76,   nil,
+   nil,    62,   nil,   nil,    84,    72,    75,    54,    57,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    45,    75,    54,    57,
+    56,    59,   nil,   nil,    66,   nil,    72,   nil,   nil,    52,
+    76,   nil,   nil,    62,   nil,   nil,    84,    45,    75,    54,
+    57,    56,    59,   nil,   nil,    66,   nil,   nil,    45,   nil,
+    52,    76,    56,   116,    62,   nil,    66,    84,    72,   nil,
+   nil,   111,    75,    54,    57,    62,   nil,   nil,   nil,    45,
+   nil,   nil,   nil,    56,    59,   nil,   nil,    66,    75,    54,
+    57,   141,    52,    76,   nil,   nil,    62,   nil,   nil,    84,
+   nil,   nil,   nil,    45,    75,    54,    57,    56,    59,   nil,
+   nil,    66,   nil,   nil,   nil,   nil,    52,   nil,   nil,    45,
+    62,   nil,   nil,    56,    59,   nil,   nil,    66,    75,    54,
+    57,   nil,    52,   nil,   nil,    45,    62,   nil,   nil,    56,
+    59,   nil,   nil,    66,    75,    54,    57,   nil,    52,   nil,
+   nil,   nil,    62,   nil,    75,    54,    57,   nil,   nil,    45,
+    75,    54,    57,    56,    59,   nil,   nil,    66,   nil,   nil,
+   nil,   nil,    52,   nil,   nil,    45,    62,   nil,   nil,    56,
+    59,   nil,   nil,    66,   nil,    45,   nil,   nil,    52,    56,
+    59,    45,    62,    66,   nil,    56,    59,   nil,    52,    66,
+   nil,   nil,    62,   nil,    52,    75,    54,    57,    62,   nil,
+   nil,    51,    54,    57,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,    75,    54,    57,   nil,   nil,   nil,    75,    54,    57,
+   nil,    48,   nil,   nil,   nil,   nil,    45,    75,    54,    57,
+    56,    59,    45,   nil,    66,   nil,    56,    59,   nil,    52,
+    66,   nil,    45,    62,    49,    52,    56,    59,    45,    62,
+    66,   nil,    56,   195,   nil,    52,    66,   nil,    45,    62,
+   nil,   111,    56,    59,   nil,    62,    66,    54,    57,    54,
+    57,    52,   nil,   nil,   nil,    62,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    54,    57,    54,    57,   nil,   nil,   281,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    45,   nil,    45,
+   nil,    56,   195,    56,   195,    66,   nil,    66,    54,    57,
+   111,   nil,   111,    45,    62,    45,    62,    56,   195,    56,
+   195,    66,   nil,    66,   nil,    49,   111,   nil,   111,   nil,
+    62,   nil,    62,    54,    57,    54,    57,   nil,    45,   nil,
+   nil,   nil,    56,   195,   nil,   nil,    66,   nil,   nil,    54,
+    57,   111,   nil,   nil,   nil,    62,    54,    57,   nil,   205,
+   nil,   nil,   nil,    45,   nil,    45,   nil,    56,   195,    56,
+   195,    66,   nil,    66,   nil,   nil,   111,   nil,   111,    45,
+    62,   nil,    62,    56,   195,   nil,    45,    66,    54,    57,
+    56,   195,   111,   nil,    66,   nil,    62,   nil,   nil,   111,
+   nil,   nil,   nil,    62,    54,    57,   nil,   nil,   131,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    45,   nil,
+   nil,   nil,    56,    59,   200,   nil,    66,   nil,   nil,   nil,
+    49,    52,   nil,   nil,    45,    62,   nil,   nil,    56,    59,
+   nil,   nil,    66,   150,   154,   nil,    49,    52,   nil,   nil,
+   nil,    62,   146,   148,   151,   153,   150,   154,   nil,   nil,
+   nil,   nil,   nil,   nil,   209,   146,   148,   151,   153,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   156,   157,   158,   144,   145,   147,   nil,   nil,   nil,   149,
+   152,   150,   154,   156,   157,   158,   144,   145,   147,   nil,
+   146,   148,   151,   153,   150,   154,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   146,   148,   151,   153,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   149,   152,   nil,   nil,   156,   157,
+   158,   144,   145,   147,   nil,   nil,   293,   nil,   152,   150,
+   154,   156,   157,   158,   144,   145,   147,   nil,   146,   148,
+   151,   153,   nil,   nil,   nil,   nil,   nil,    16,   nil,    23,
+    27,   291,     1,     5,   nil,    10,   nil,    13,   nil,    20,
+   nil,    28,   149,   152,     4,     8,   156,   157,   158,   144,
+   145,   147,    16,   290,    23,    27,   nil,     1,     5,   nil,
+    10,   nil,    13,   nil,    20,   nil,    28,   nil,   nil,     4,
+     8,   nil,   268,   nil,    16,   nil,    23,    27,   nil,     1,
+     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,   nil,
+   nil,     4,     8,    16,   305,    23,    27,   nil,     1,     5,
+   nil,    10,   nil,    13,   nil,    20,   nil,    28,   nil,   nil,
+     4,     8,   nil,   310,   nil,    16,   nil,    23,    27,   nil,
+     1,     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,
+   nil,   nil,     4,     8,    16,   262,    23,    27,   nil,     1,
+     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,   nil,
+   nil,     4,     8,   nil,   312,   nil,    16,   nil,    23,    27,
+   nil,     1,     5,   nil,    10,   nil,    13,   nil,    20,   nil,
+    28,   nil,   nil,     4,     8,    16,   255,    23,    27,   nil,
+     1,     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,
+   nil,   nil,     4,     8,   nil,   313,   nil,    16,   nil,    23,
+    27,   nil,     1,     5,   nil,    10,   nil,    13,   nil,    20,
+   nil,    28,   nil,   nil,     4,     8,    16,   nil,    23,    27,
+   nil,     1,     5,   nil,    10,   nil,    13,   nil,    20,   nil,
+    28,   nil,   nil,     4,     8,    16,   nil,    23,    27,   nil,
+     1,     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,
+   nil,   nil,     4,     8,    16,   nil,    23,    27,   nil,     1,
+     5,   nil,    10,   nil,    13,   nil,    20,   nil,    28,   nil,
+   nil,     4,     8,    16,   nil,    23,    27,   nil,     1,     5,
+   nil,    10,   nil,    13,   nil,    20,   nil,    28,   nil,   nil,
+     4,     8,    16,   nil,    23,    27,   nil,     1,     5,   nil,
+    10,   nil,    13,   nil,    20,   nil,    28,   nil,   nil,     4,
+     8 ]
 
 racc_action_check = [
-   228,   228,   228,   207,   111,    44,    54,    54,    54,    36,
-   241,   195,    83,   119,   201,   241,   168,   168,   168,   195,
-    63,    30,    92,    92,    92,    30,   119,   201,   207,   207,
-    44,   228,    46,    46,    46,   228,   228,    54,    30,   228,
-    63,    54,    54,    82,   228,    54,   111,   168,   228,   149,
-    54,   168,   168,    92,    54,   168,    85,    92,    92,   128,
-   168,    92,    30,    46,   168,    80,    92,    46,    46,    75,
-    92,    46,   167,   167,   167,    95,    46,   149,   149,   147,
-    46,   153,   166,   166,   166,    96,    95,   105,   105,   153,
-   147,    95,    18,    18,    18,   147,    96,     6,    20,    20,
-    20,    96,   133,   167,     6,     6,   126,   167,   167,   140,
-   133,   167,    18,   166,   140,   125,   167,   166,   166,   142,
-   167,   166,   105,    18,   144,   105,   166,    18,    18,    20,
-   166,    18,     5,    20,    20,    18,    18,    20,   145,     5,
-    18,   210,    20,    22,    22,    22,    20,     1,     1,   242,
-   242,   242,   210,   146,    12,    12,    26,   210,   123,   238,
-   238,   238,    74,    26,   156,    34,    34,    34,   156,   156,
-   104,   104,   139,   139,    22,    33,    33,    33,    22,    22,
-   242,   122,    22,   121,   242,   242,    73,    22,   242,    12,
-   238,    22,    12,   242,   238,   238,    34,   242,   238,    72,
-    34,    34,   164,   238,    34,   104,    33,   238,   104,    34,
-    33,    33,   165,    34,    33,   190,   190,   190,    71,    33,
-   230,   230,    70,    33,    69,    77,    77,    77,    77,    24,
-    24,   101,    50,    50,   101,   136,   169,   170,   101,   136,
-   136,   171,   235,   235,   172,   174,   190,   178,   138,   138,
-   190,   190,    50,    66,   190,   185,    77,   188,    64,   190,
-    77,    77,    50,   190,    77,    58,    50,    50,   120,    77,
-    50,    55,   235,    77,    50,    50,   235,   235,   138,    50,
-   235,   199,   138,   138,   200,   235,   138,   132,   132,   235,
-   118,   138,   203,   260,   260,   138,    53,   206,    52,    86,
-    49,    45,    38,   213,   213,    84,   227,    29,   107,   233,
-   234,    27,   106,   212,   212,    88,    89,   132,    17,   131,
-   131,   132,   132,   260,   248,   132,   250,   260,   260,   132,
-   132,   260,   251,   213,   132,   253,   260,   213,   213,   131,
-   260,   213,   254,   212,   179,   179,   213,   212,   212,   131,
-   213,   212,    15,   131,   131,   261,   212,   131,   262,   263,
-   212,   131,   131,   102,   129,   129,   131,   129,    91,    94,
-   130,   197,   197,   nil,   179,   197,   nil,   nil,   179,   179,
-   nil,   nil,   179,   nil,   nil,   nil,   nil,   179,   nil,   nil,
-   nil,   179,   nil,   nil,   129,   nil,   276,   nil,   129,   129,
-   nil,   197,   129,   nil,   nil,   197,   197,   129,   nil,   197,
-   nil,   129,   nil,   nil,   197,   218,   nil,   276,   197,   276,
-   276,   nil,   276,   276,   nil,   276,   nil,   276,   nil,   276,
-   nil,   276,   nil,   nil,   276,   276,   218,   204,   218,   218,
-   nil,   218,   218,   nil,   218,   nil,   218,   nil,   218,   nil,
-   218,   nil,   nil,   218,   218,   nil,   244,   nil,   204,   nil,
-   204,   204,   nil,   204,   204,   nil,   204,   nil,   204,   nil,
-   204,   nil,   204,   nil,   nil,   204,   204,   244,   193,   244,
-   244,   nil,   244,   244,   nil,   244,   nil,   244,   nil,   244,
-   nil,   244,   nil,   nil,   244,   244,   nil,   275,   nil,   193,
-   nil,   193,   193,   nil,   193,   193,   nil,   193,   nil,   193,
-   nil,   193,   nil,   193,   nil,   nil,   193,   193,   275,   265,
-   275,   275,   nil,   275,   275,   nil,   275,   nil,   275,   nil,
-   275,   nil,   275,   nil,   nil,   275,   275,   nil,   163,   nil,
-   265,   nil,   265,   265,   nil,   265,   265,   nil,   265,   nil,
-   265,   nil,   265,   nil,   265,   nil,   nil,   265,   265,   163,
-   160,   163,   163,   nil,   163,   163,   nil,   163,   nil,   163,
-   nil,   163,   nil,   163,   nil,   nil,   163,   163,   nil,   216,
-   nil,   160,   nil,   160,   160,   nil,   160,   160,   nil,   160,
-   nil,   160,   nil,   160,   nil,   160,   nil,   nil,   160,   160,
-   216,   nil,   216,   216,   nil,   216,   216,   nil,   216,   nil,
-   216,   nil,   216,   nil,   216,   nil,   nil,   216,   216,   273,
-   nil,   273,   273,   nil,   273,   273,   nil,   273,   nil,   273,
-   nil,   273,   nil,   273,   nil,   nil,   273,   273,    32,   nil,
-    32,    32,   nil,    32,    32,   nil,    32,   nil,    32,   nil,
-    32,   nil,    32,   nil,   nil,    32,    32,   137,   nil,   137,
-   137,   nil,   137,   137,   nil,   137,   nil,   137,   nil,   137,
-   nil,   137,   nil,   nil,   137,   137,     0,   nil,     0,     0,
-   nil,     0,     0,   nil,     0,   nil,     0,   nil,     0,   nil,
-     0,   nil,   nil,     0,     0 ]
+    33,    33,    33,   231,   105,   129,   129,   241,    17,   170,
+    59,   116,    17,   171,   288,   241,   246,   171,   171,   288,
+    33,   158,   158,   158,   116,    17,    10,    10,   231,   231,
+    59,    33,   126,   126,    42,    33,    33,   170,   170,    33,
+   129,   158,   220,   129,    33,    33,   105,    92,    33,    17,
+   220,    33,   158,   144,   144,   144,   158,   158,    92,    42,
+   158,    10,   161,    92,    10,   158,   158,   126,   160,   158,
+   126,   175,   158,   144,    76,    76,    76,   247,   220,   220,
+   220,   220,   220,   220,   144,   134,    23,    23,   144,   144,
+   247,   165,   144,   134,    76,   223,    77,   144,   144,   165,
+   162,   144,    71,   223,   144,    76,   145,   145,   145,    76,
+    76,   162,   179,    76,    27,   180,   162,   108,    76,    76,
+   108,    27,    76,     5,   108,    76,   145,    72,    72,    72,
+     5,   223,   223,   223,   223,   223,   223,   145,    70,   140,
+   185,   145,   145,   140,   140,   145,    68,    72,   221,   187,
+   145,   145,   188,    90,   145,   189,   221,   145,    72,   154,
+   154,   154,    72,    72,    90,   174,    72,   173,   173,    90,
+   174,    72,    72,     1,     1,    72,   265,   265,    72,   154,
+    84,    84,    84,    67,   221,   221,   221,   221,   221,   221,
+   154,   227,   227,   195,   154,   154,   226,   226,   154,   198,
+    84,   218,   199,   154,   154,    65,   234,   154,   206,   218,
+   154,    84,    16,    16,    16,    84,    84,   234,    63,    84,
+   159,    79,   234,    80,    84,    84,    61,    60,    84,    81,
+    58,    84,    16,   146,   146,   146,    53,   218,   218,   218,
+   218,   218,   218,    16,    52,    82,    50,    16,    16,    87,
+    89,    16,   230,   146,    24,    94,    16,    16,    95,    36,
+    16,    24,    24,    16,   146,    97,    35,    99,   146,   146,
+    85,   244,   146,   217,   217,   217,   217,   146,   146,    85,
+    85,   146,   245,    78,   146,   106,    28,   109,    85,    85,
+    85,    85,   260,   112,   153,   153,   153,   224,   224,   224,
+   224,   224,   224,   216,   216,   216,   216,   216,   216,   113,
+   133,   268,    85,    85,   153,   271,    85,    85,    85,    85,
+    85,    85,   273,   274,   275,   153,   152,   152,   152,   153,
+   153,   277,   282,   153,   215,   215,   215,   215,   153,   153,
+   114,    15,   153,   130,   127,   153,   152,   147,   147,   147,
+     6,   125,   295,   296,   299,     2,   119,   152,   118,   115,
+   nil,   152,   152,   nil,   nil,   152,   nil,   147,   nil,   nil,
+   152,   152,   nil,   nil,   152,   nil,   nil,   152,   147,   148,
+   148,   148,   147,   147,   nil,   nil,   147,   nil,   nil,   nil,
+   nil,   147,   147,   nil,   nil,   147,   nil,   nil,   147,   148,
+   149,   149,   149,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   148,   nil,   nil,   nil,   148,   148,   nil,   nil,   148,   nil,
+   149,   nil,   nil,   148,   148,   nil,   nil,   148,   nil,   nil,
+   148,   149,   156,   156,   156,   149,   149,   nil,   nil,   149,
+   nil,   nil,   nil,   nil,   149,   149,   nil,   nil,   149,   nil,
+   nil,   149,   156,    34,    34,    34,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   156,   nil,   nil,   nil,   156,   156,   nil,
+   nil,   156,   nil,    34,   nil,   nil,   156,   156,   nil,   nil,
+   156,   nil,   nil,   156,    34,   151,   151,   151,    34,    34,
+   nil,   nil,    34,   nil,   nil,   nil,   nil,    34,    34,   nil,
+   nil,    34,   nil,   nil,    34,   151,   150,   150,   150,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   151,    38,    38,    38,
+   151,   151,   nil,   nil,   151,   nil,   150,   nil,   nil,   151,
+   151,   nil,   nil,   151,   nil,   nil,   151,   150,   157,   157,
+   157,   150,   150,   nil,   nil,   150,   nil,   nil,    38,   nil,
+   150,   150,    38,    38,   150,   nil,    38,   150,   157,   nil,
+   nil,    38,   177,   177,   177,    38,   nil,   nil,   nil,   157,
+   nil,   nil,   nil,   157,   157,   nil,   nil,   157,    75,    75,
+    75,    75,   157,   157,   nil,   nil,   157,   nil,   nil,   157,
+   nil,   nil,   nil,   177,    51,    51,    51,   177,   177,   nil,
+   nil,   177,   nil,   nil,   nil,   nil,   177,   nil,   nil,    75,
+   177,   nil,   nil,    75,    75,   nil,   nil,    75,   285,   285,
+   285,   nil,    75,   nil,   nil,    51,    75,   nil,   nil,    51,
+    51,   nil,   nil,    51,   266,   266,   266,   nil,    51,   nil,
+   nil,   nil,    51,   nil,    88,    88,    88,   nil,   nil,   285,
+   178,   178,   178,   285,   285,   nil,   nil,   285,   nil,   nil,
+   nil,   nil,   285,   nil,   nil,   266,   285,   nil,   nil,   266,
+   266,   nil,   nil,   266,   nil,    88,   nil,   nil,   266,    88,
+    88,   178,   266,    88,   nil,   178,   178,   nil,    88,   178,
+   nil,   nil,    88,   nil,   178,    20,    20,    20,   178,   nil,
+   nil,    13,    13,    13,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   210,   210,   210,   nil,   nil,   nil,   186,   186,   186,
+   nil,    13,   nil,   nil,   nil,   nil,    20,   284,   284,   284,
+    20,    20,    13,   nil,    20,   nil,    13,    13,   nil,    20,
+    13,   nil,   210,    20,    13,    13,   210,   210,   186,    13,
+   210,   nil,   186,   186,   nil,   210,   186,   nil,   284,   210,
+   nil,   186,   284,   284,   nil,   186,   284,   205,   205,   283,
+   283,   284,   nil,   nil,   nil,   284,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   132,   132,   239,   239,   nil,   nil,   239,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   205,   nil,   283,
+   nil,   205,   205,   283,   283,   205,   nil,   283,   233,   233,
+   205,   nil,   283,   132,   205,   239,   283,   132,   132,   239,
+   239,   132,   nil,   239,   nil,   132,   132,   nil,   239,   nil,
+   132,   nil,   239,   294,   294,   232,   232,   nil,   233,   nil,
+   nil,   nil,   233,   233,   nil,   nil,   233,   nil,   nil,   172,
+   172,   233,   nil,   nil,   nil,   233,   136,   136,   nil,   136,
+   nil,   nil,   nil,   294,   nil,   232,   nil,   294,   294,   232,
+   232,   294,   nil,   232,   nil,   nil,   294,   nil,   232,   172,
+   294,   nil,   232,   172,   172,   nil,   136,   172,    48,    48,
+   136,   136,   172,   nil,   136,   nil,   172,   nil,   nil,   136,
+   nil,   nil,   nil,   136,   135,   135,   nil,   nil,    48,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    48,   nil,
+   nil,   nil,    48,    48,   135,   nil,    48,   nil,   nil,   nil,
+    48,    48,   nil,   nil,   135,    48,   nil,   nil,   135,   135,
+   nil,   nil,   135,   222,   222,   nil,   135,   135,   nil,   nil,
+   nil,   135,   222,   222,   222,   222,   138,   138,   nil,   nil,
+   nil,   nil,   nil,   nil,   138,   138,   138,   138,   138,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   222,   222,   222,   222,   222,   222,   nil,   nil,   nil,   138,
+   138,   101,   101,   138,   138,   138,   138,   138,   138,   nil,
+   101,   101,   101,   101,   219,   219,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   219,   219,   219,   219,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   101,   101,   nil,   nil,   101,   101,
+   101,   101,   101,   101,   nil,   nil,   261,   nil,   219,   102,
+   102,   219,   219,   219,   219,   219,   219,   nil,   102,   102,
+   102,   102,   nil,   nil,   nil,   nil,   nil,   261,   nil,   261,
+   261,   254,   261,   261,   nil,   261,   nil,   261,   nil,   261,
+   nil,   261,   102,   102,   261,   261,   102,   102,   102,   102,
+   102,   102,   254,   249,   254,   254,   nil,   254,   254,   nil,
+   254,   nil,   254,   nil,   254,   nil,   254,   nil,   nil,   254,
+   254,   nil,   225,   nil,   249,   nil,   249,   249,   nil,   249,
+   249,   nil,   249,   nil,   249,   nil,   249,   nil,   249,   nil,
+   nil,   249,   249,   225,   289,   225,   225,   nil,   225,   225,
+   nil,   225,   nil,   225,   nil,   225,   nil,   225,   nil,   nil,
+   225,   225,   nil,   300,   nil,   289,   nil,   289,   289,   nil,
+   289,   289,   nil,   289,   nil,   289,   nil,   289,   nil,   289,
+   nil,   nil,   289,   289,   300,   191,   300,   300,   nil,   300,
+   300,   nil,   300,   nil,   300,   nil,   300,   nil,   300,   nil,
+   nil,   300,   300,   nil,   309,   nil,   191,   nil,   191,   191,
+   nil,   191,   191,   nil,   191,   nil,   191,   nil,   191,   nil,
+   191,   nil,   nil,   191,   191,   309,   184,   309,   309,   nil,
+   309,   309,   nil,   309,   nil,   309,   nil,   309,   nil,   309,
+   nil,   nil,   309,   309,   nil,   311,   nil,   184,   nil,   184,
+   184,   nil,   184,   184,   nil,   184,   nil,   184,   nil,   184,
+   nil,   184,   nil,   nil,   184,   184,   311,   nil,   311,   311,
+   nil,   311,   311,   nil,   311,   nil,   311,   nil,   311,   nil,
+   311,   nil,   nil,   311,   311,   308,   nil,   308,   308,   nil,
+   308,   308,   nil,   308,   nil,   308,   nil,   308,   nil,   308,
+   nil,   nil,   308,   308,   155,   nil,   155,   155,   nil,   155,
+   155,   nil,   155,   nil,   155,   nil,   155,   nil,   155,   nil,
+   nil,   155,   155,    19,   nil,    19,    19,   nil,    19,    19,
+   nil,    19,   nil,    19,   nil,    19,   nil,    19,   nil,   nil,
+    19,    19,     0,   nil,     0,     0,   nil,     0,     0,   nil,
+     0,   nil,     0,   nil,     0,   nil,     0,   nil,   nil,     0,
+     0 ]
 
 racc_action_pointer = [
-   648,   134,   nil,   nil,   nil,    94,    59,   nil,   nil,   nil,
-   nil,   nil,   151,   nil,   nil,   346,   nil,   312,    90,   nil,
-    96,   nil,   141,   nil,   226,   nil,   118,   269,   nil,   307,
-    19,   nil,   610,   173,   163,   nil,   -26,   nil,   296,   nil,
-   nil,   nil,   nil,   nil,    -5,   263,    30,   nil,   nil,   279,
-   229,   nil,   277,   275,     4,   269,   nil,   nil,   244,   nil,
-   nil,   nil,   nil,    18,   248,   nil,   243,   nil,   nil,   203,
-   201,   216,   178,   165,   141,    48,   nil,   223,   nil,   nil,
-    44,   nil,    37,    -9,   284,    35,   293,   nil,   305,   294,
-   nil,   368,    20,   nil,   331,    53,    63,   nil,   nil,   nil,
-   nil,   193,   357,   nil,   167,    84,   306,   298,   nil,   nil,
-   nil,    -5,   nil,   nil,   nil,   nil,   nil,   nil,   269,     4,
-   229,   162,   171,   137,   nil,    94,    88,   nil,    36,   361,
-   365,   316,   284,    64,   nil,   nil,   230,   629,   245,   169,
-    76,   nil,   113,   nil,   119,   129,   143,    57,   nil,    29,
-   nil,   nil,   nil,    65,   nil,   nil,   120,   nil,   nil,   nil,
-   553,   nil,   nil,   531,   195,   174,    80,    70,    14,   229,
-   230,   203,   206,   nil,   236,   nil,   nil,   nil,   225,   341,
-   nil,   nil,   nil,   nil,   nil,   232,   nil,   nil,   255,   nil,
-   213,   nil,   nil,   471,   nil,     1,   nil,   368,   nil,   268,
-   261,     4,   nil,   279,   430,   nil,   290,   -20,   nil,   nil,
-   119,   nil,   310,   300,   nil,   nil,   572,   nil,   408,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   296,    -2,   nil,
-   211,   nil,   nil,   280,   304,   239,   nil,   nil,   157,   nil,
-   nil,   -23,   147,   nil,   449,   nil,   nil,   nil,   303,   nil,
-   305,   311,   nil,   314,   321,   nil,   nil,   nil,   nil,   nil,
-   290,   348,   351,   353,   nil,   512,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   591,   nil,   490,   389,   nil,   nil ]
+  1294,   160,   349,   nil,   nil,    85,   344,   nil,   nil,   nil,
+    23,   nil,   nil,   699,   nil,   341,   210,     6,   nil,  1275,
+   693,   nil,   nil,    83,   216,   nil,   nil,    76,   244,   nil,
+   nil,   nil,   nil,    -2,   451,   228,   224,   nil,   515,   nil,
+   nil,   nil,    24,   nil,   nil,   nil,   nil,   nil,   885,   nil,
+   236,   592,   242,   226,   nil,   nil,   nil,   nil,   209,     8,
+   206,   224,   nil,   197,   nil,   184,   nil,   162,   125,   nil,
+   117,   102,   125,   nil,   nil,   576,    72,    75,   262,   200,
+   202,   208,   224,   nil,   178,   264,   nil,   228,   642,   212,
+   131,   nil,    25,   nil,   249,   248,   nil,   259,   nil,   245,
+   nil,   976,  1024,   nil,   nil,    -5,   275,   nil,    79,   281,
+   nil,   nil,   254,   288,   330,   338,     2,   nil,   337,   338,
+   nil,   nil,   nil,   nil,   nil,   330,    29,   338,   nil,     2,
+   320,   nil,   780,   305,    47,   901,   853,   nil,   941,   nil,
+   134,   nil,   nil,   nil,    51,   104,   231,   345,   377,   398,
+   504,   483,   324,   292,   157,  1256,   430,   536,    19,   215,
+    58,    53,    78,   nil,   nil,    75,   nil,   nil,   nil,   nil,
+   -11,   -31,   846,   164,   132,    65,   nil,   560,   648,   105,
+    77,   nil,   nil,   nil,  1199,   133,   715,   142,   114,   117,
+   nil,  1158,   nil,   nil,   nil,   171,   nil,   nil,   197,   179,
+   nil,   nil,   nil,   nil,   nil,   764,   199,   nil,   nil,   nil,
+   709,   nil,   nil,   nil,   nil,   282,   251,   221,   185,   989,
+    26,   132,   928,    79,   245,  1095,   142,   137,   nil,   nil,
+   245,   -20,   832,   805,   184,   nil,   nil,   nil,   nil,   782,
+   nil,    -3,   nil,   nil,   258,   269,    -7,    67,   nil,  1076,
+   nil,   nil,   nil,   nil,  1054,   nil,   nil,   nil,   nil,   nil,
+   282,  1029,   nil,   nil,   nil,   167,   632,   nil,   282,   nil,
+   nil,   294,   nil,   301,   302,   303,   nil,   310,   nil,   nil,
+   nil,   nil,   326,   766,   725,   616,   nil,   nil,   -19,  1117,
+   nil,   nil,   nil,   nil,   830,   345,   346,   nil,   nil,   348,
+  1136,   nil,   nil,   nil,   nil,   nil,   nil,   nil,  1237,  1177,
+   nil,  1218,   nil,   nil ]
 
 racc_action_default = [
-  -150,  -174,   -14,    -2,  -143,  -174,  -174,   -15,    -3,  -141,
-   -16,    -5,  -174,   -17,    -6,  -174,    -7,  -174,  -142,    -8,
-  -174,    -9,  -174,   -10,  -174,   -11,  -174,   -40,   -12,  -174,
-  -174,   -13,    -1,  -174,  -174,  -142,  -150,   -39,  -174,  -144,
-  -148,  -147,  -146,  -149,  -150,   -79,   -72,  -167,  -130,   -28,
-  -174,   -32,   -29,  -174,  -174,   -63,   -30,  -102,   -31,  -104,
-  -103,   -33,   -20,   -62,   -21,   -61,   -22,   -23,  -131,   -25,
-   -26,  -174,   -27,   -99,   -93,   -98,   -96,  -174,  -110,   -94,
-   -90,   -97,  -174,   -91,   -95,   -92,  -174,  -132,  -134,  -150,
-   -41,  -174,  -174,   -42,   -72,  -150,  -150,    -4,   -70,   -71,
-  -163,  -174,  -174,  -161,  -174,  -174,  -174,  -172,   -77,   -78,
-   -80,  -174,  -129,  -128,   -69,   -67,   -63,   -73,   -64,   -62,
-   -59,   -65,  -172,   -68,   -57,   -66,  -174,   -19,  -174,  -174,
-  -174,  -174,  -174,  -174,   -82,  -169,  -174,  -174,  -174,  -174,
-  -151,  -152,  -174,   279,  -174,  -174,  -172,  -150,   -45,  -174,
-   -46,   -62,   -48,  -174,   -55,   -54,  -174,  -164,  -165,  -166,
-  -174,  -162,  -145,  -174,  -174,  -173,  -174,  -174,   -60,  -174,
-  -174,  -173,   -72,   -18,  -174,  -126,  -118,  -119,   -62,  -174,
-  -124,  -127,  -125,  -105,  -101,  -174,   -24,   -34,  -174,  -168,
-  -174,  -170,  -171,  -174,  -112,  -174,  -116,  -174,  -133,  -160,
-  -174,  -174,  -155,  -158,  -174,  -106,  -174,  -174,   -51,   -50,
-  -174,   -44,  -174,  -174,   -43,  -138,  -174,  -140,  -174,   -38,
-   -81,   -76,   -75,   -58,   -35,   -36,   -74,  -172,  -174,  -121,
-  -172,  -100,   -83,  -108,  -174,  -174,  -113,  -111,  -174,  -153,
-  -154,  -174,  -174,  -136,  -174,   -37,   -49,   -47,   -87,   -88,
-   -84,   -85,   -52,   -89,   -86,   -53,  -137,  -139,   -56,  -123,
-  -174,  -174,  -171,  -174,  -107,  -174,  -117,  -159,  -156,  -157,
-  -135,  -122,  -120,  -174,  -115,  -174,  -174,  -114,  -109 ]
+  -167,  -191,  -191,    -7,  -160,  -191,  -191,    -8,  -158,    -9,
+  -191,   -10,   -11,  -159,   -12,  -191,  -191,  -191,   -13,    -1,
+  -191,   -14,    -2,  -191,  -191,   -15,    -3,  -191,   -40,   -16,
+    -5,   -17,    -6,  -191,  -191,   -79,  -167,  -159,   -72,  -165,
+  -164,  -163,  -167,  -161,  -166,  -184,   -33,   -20,  -191,   -32,
+   -21,  -191,   -63,   -22,  -102,   -23,  -104,  -103,   -25,   -62,
+   -26,  -191,   -61,   -27,  -147,   -28,  -148,   -29,  -191,   -30,
+   -31,  -191,  -191,  -110,   -97,  -191,  -191,   -91,   -95,   -92,
+   -99,   -93,   -98,   -96,  -191,  -191,   -94,   -90,  -191,   -72,
+  -167,   -42,  -167,    -4,  -191,  -151,  -149,  -191,   -39,  -167,
+   -41,   -70,   -71,   -78,   -80,  -191,  -189,   -77,  -191,  -191,
+  -180,   -63,   -59,   -65,  -189,   -68,   -62,   -57,   -66,  -191,
+  -146,  -145,   -69,   -67,   -73,   -64,  -191,  -191,  -178,  -191,
+  -191,   -19,  -191,  -191,  -191,  -191,  -191,   314,  -191,   -82,
+  -191,  -186,  -124,  -117,  -191,  -191,  -191,  -191,  -191,  -191,
+  -191,  -191,  -191,  -191,  -191,  -191,  -191,  -191,  -191,  -191,
+  -189,  -191,  -167,   -46,   -48,  -191,   -55,   -62,   -54,   -45,
+  -191,  -191,  -191,  -191,  -168,  -191,  -169,  -191,  -191,  -191,
+  -190,  -181,  -182,  -183,  -191,  -191,   -60,  -191,  -190,   -72,
+  -179,  -191,  -162,   -18,   -24,   -62,  -105,   -34,  -191,  -191,
+  -101,  -136,  -141,  -144,  -142,  -191,  -191,  -143,  -135,  -127,
+  -191,  -185,  -187,  -188,  -113,  -115,  -119,  -116,  -121,  -126,
+  -123,  -120,  -125,  -122,  -118,  -191,  -111,  -112,  -114,  -106,
+  -191,  -191,  -191,  -191,  -191,   -51,   -50,   -44,   -43,  -191,
+  -129,  -191,  -133,  -150,  -177,  -175,  -191,  -191,  -172,  -191,
+   -76,   -75,   -38,   -81,  -191,  -155,   -35,   -58,   -36,   -74,
+  -189,  -191,  -157,  -100,  -138,  -189,  -191,   -83,  -108,   -37,
+   -49,   -85,   -52,   -89,   -86,   -87,   -88,   -84,   -53,   -47,
+  -130,  -128,  -191,  -191,  -191,  -191,  -170,  -171,  -191,  -191,
+  -153,  -154,   -56,  -156,  -191,  -191,  -188,  -140,  -107,  -191,
+  -191,  -134,  -176,  -174,  -173,  -152,  -139,  -137,  -191,  -191,
+  -132,  -191,  -131,  -109 ]
 
 racc_goto_table = [
-    30,    32,    56,   108,   174,    97,    38,   110,    52,    39,
-   122,   177,    62,   196,   190,     3,   202,   114,   194,    29,
-    58,   124,   149,   156,   164,   247,    87,   136,    36,    93,
-   115,    82,    30,   264,    56,   197,   113,   252,   255,   170,
-    52,   107,   169,   176,   128,   120,   230,    88,   118,    89,
-   142,   100,    58,   102,   174,    44,   106,   186,   146,   103,
-    49,   229,   200,   206,   201,    37,   157,   nil,   nil,   nil,
-   nil,    61,   196,    81,   207,    81,   nil,   236,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    81,    81,   112,   nil,
-   nil,   nil,    49,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   161,   162,    61,   141,   nil,   nil,    81,   260,   nil,
-   266,   nil,   nil,   nil,   nil,    56,    56,   268,    72,   113,
-   nil,    52,    52,   108,   158,   185,   nil,   220,   113,   226,
-    81,   175,   nil,    58,    58,   174,   227,    30,   193,   114,
-   175,   198,   271,   223,   258,    81,   125,   261,   nil,   nil,
-    72,   nil,   115,   nil,   nil,   nil,   nil,   nil,   113,   nil,
-    30,   216,   nil,    30,   218,   nil,    97,   nil,   nil,   113,
-   118,   112,   nil,    49,    49,   nil,   nil,   nil,   nil,    70,
-   112,   175,   nil,   nil,    61,   nil,   187,   113,   nil,    97,
-   nil,    97,   nil,    30,   nil,   nil,   249,   249,   nil,   175,
-   nil,   nil,   113,   113,    30,   244,   nil,   123,   nil,   nil,
-   112,    70,   nil,   nil,   250,   250,    30,    97,    30,    81,
-    81,   112,   nil,   nil,   nil,   113,   nil,   nil,   nil,   182,
-   nil,    72,    72,   nil,   nil,   nil,   nil,   175,   182,   112,
-   nil,   nil,   nil,    81,    30,   nil,   nil,   nil,    97,    97,
-   113,   nil,   nil,   nil,   248,   248,   155,   155,   nil,   nil,
-   nil,   nil,   175,   nil,   nil,    30,   275,   nil,   125,    78,
-   nil,    86,    69,    30,   276,    30,    30,   112,   nil,   182,
-   nil,    81,    98,    99,   nil,   nil,   nil,   nil,   nil,   nil,
-   181,    81,    70,    70,   nil,    81,   nil,   182,   nil,   181,
-   121,   nil,   112,   130,    69,   nil,   nil,   nil,   155,    73,
-   nil,    73,   254,   254,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    73,    73,   nil,   nil,   134,   nil,   nil,   123,
-   nil,   nil,   nil,   nil,   nil,   182,   nil,   nil,   nil,   nil,
-   181,   144,   nil,    73,   nil,   nil,   nil,   nil,   nil,   154,
-   154,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   181,   nil,
-   182,   nil,   nil,   nil,   nil,   nil,    73,   nil,   nil,   nil,
-   nil,   155,   nil,   253,   253,   nil,   nil,   nil,   nil,   nil,
-   nil,    73,   nil,   180,   nil,    69,    69,   nil,   nil,   nil,
-   nil,   nil,   180,   nil,   nil,   nil,   181,   nil,   nil,   nil,
-   nil,   154,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   221,   222,   nil,   nil,   nil,
-   nil,   181,   121,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   180,   nil,   nil,   nil,   nil,   nil,   232,
+     2,    69,    19,   206,    17,    93,   179,    70,   122,   107,
+    47,   210,   201,    46,   187,   117,    36,    96,    15,     2,
+   114,    43,    22,    17,    64,   248,   123,   170,    97,   171,
+   104,   240,   125,   272,   278,   279,    69,   140,    99,   242,
+    91,   298,    70,   239,   106,   130,   185,   208,    46,    64,
+    63,   112,   265,    95,   175,   109,    42,   127,   110,    64,
+   230,   194,   246,   247,   128,    98,   181,   nil,   nil,   nil,
+   nil,   160,   206,    94,   nil,   118,   nil,   nil,   nil,   nil,
+   nil,   264,   nil,   nil,   nil,    63,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   280,   231,
+   nil,   nil,   nil,   nil,   133,   nil,   242,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   182,
+    69,   176,   nil,    69,   nil,   nil,    70,   nil,   139,    70,
+   207,   nil,   199,    58,   197,    46,   294,   190,   nil,   304,
+   192,   159,   nil,    64,   nil,   nil,    64,    64,   nil,   nil,
+   301,   nil,   nil,   nil,   107,     2,   122,   225,   113,    17,
+   292,   206,   259,   257,   nil,   295,   207,   243,    58,    63,
+   306,   260,    63,   204,   123,   253,   nil,   nil,   nil,   nil,
+   125,   nil,   nil,    64,     2,   nil,   254,   nil,    17,   nil,
+   nil,     2,   nil,   261,   nil,    17,   nil,    64,   nil,   207,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   204,
+   166,    93,   166,    65,   nil,   nil,    64,   nil,   nil,   nil,
+   276,   276,   nil,   118,   nil,     2,   277,   277,   nil,    17,
+   250,   251,   nil,   207,   nil,   nil,   nil,   nil,   120,    67,
+    93,   nil,   204,    64,    64,   nil,   nil,    93,    65,     2,
+    64,   289,    58,    17,     2,    58,   202,   nil,    17,   nil,
+   nil,     2,   nil,   267,   121,    17,   nil,   nil,   nil,   274,
+   274,   nil,   nil,   nil,    67,    93,   204,   207,   nil,   nil,
+   nil,   nil,   166,   nil,   nil,   nil,   nil,   nil,   207,     2,
+   nil,   nil,   202,    17,    64,    93,   nil,    93,    60,   nil,
+     2,   nil,   309,   nil,    17,    64,   113,   nil,     2,     2,
+   311,     2,    17,    17,   nil,    17,   nil,   nil,   nil,   297,
+   204,   nil,   nil,   115,   nil,   202,   nil,   nil,   nil,   nil,
+   nil,   204,    65,    60,   nil,    65,   120,   302,   303,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   180,   nil,   nil,   nil,    73,    73,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   154,   nil,   251,   251,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   259,   nil,    73,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   267,   nil,   180,
-   nil,   269,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   271,   271,   166,   nil,   nil,   nil,    67,   202,
+   nil,    67,   121,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    85,   nil,   120,   nil,   nil,   168,   nil,   168,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   120,   101,   102,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   121,   nil,
+   nil,   nil,   nil,   202,   nil,   120,   nil,   nil,   nil,   nil,
+   nil,   nil,   121,   nil,   202,   nil,   nil,    60,   nil,   nil,
+    60,   203,   nil,   nil,   nil,   nil,   138,   nil,   nil,   nil,
+   142,   121,   275,   275,   nil,   nil,   nil,   nil,   143,   120,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   168,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   203,   121,   121,
+   nil,   nil,   nil,   nil,   nil,   121,   nil,   nil,   nil,   nil,
+   nil,   115,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   120,   nil,   nil,   nil,   nil,   nil,   nil,
+   203,   nil,   nil,   nil,   120,   nil,   nil,   nil,   214,   215,
+   216,   217,   218,   219,   220,   221,   222,   223,   224,   121,
+   226,   227,   228,   nil,   nil,   nil,   nil,   273,   273,   168,
+   121,   nil,   nil,   nil,   203,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   180,   nil,   nil,    73,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    73,   nil,   nil,
-   nil,    73 ]
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   203,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   203 ]
 
 racc_goto_check = [
-    35,     2,    27,    50,    60,     4,    35,    52,    26,    69,
-    33,    62,    18,    60,    54,     3,    72,    48,    58,     1,
-    28,    45,    39,    39,    34,    40,    28,    53,    30,    38,
-    27,    55,    35,    56,    27,    57,    26,    44,    44,    34,
-    26,    36,    32,    61,    18,    31,    63,    64,    28,    30,
-    65,     3,    28,    66,    60,    67,    68,    21,    33,     3,
-    25,    62,    70,    34,    71,     5,    73,   nil,   nil,   nil,
-   nil,    29,    60,    29,    39,    29,   nil,    58,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,    29,    29,    25,   nil,
-   nil,   nil,    25,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    69,    69,    29,     3,   nil,   nil,    29,    54,   nil,
-    60,   nil,   nil,   nil,   nil,    27,    27,    72,    24,    26,
-   nil,    26,    26,    50,    30,    18,   nil,    52,    26,    50,
-    29,    28,   nil,    28,    28,    60,    33,    35,     2,    48,
-    28,    28,    62,    45,    34,    29,    24,    34,   nil,   nil,
-    24,   nil,    27,   nil,   nil,   nil,   nil,   nil,    26,   nil,
-    35,     2,   nil,    35,     2,   nil,     4,   nil,   nil,    26,
-    28,    25,   nil,    25,    25,   nil,   nil,   nil,   nil,    23,
-    25,    28,   nil,   nil,    29,   nil,    29,    26,   nil,     4,
-   nil,     4,   nil,    35,   nil,   nil,    27,    27,   nil,    28,
-   nil,   nil,    26,    26,    35,     2,   nil,    23,   nil,   nil,
-    25,    23,   nil,   nil,    28,    28,    35,     4,    35,    29,
-    29,    25,   nil,   nil,   nil,    26,   nil,   nil,   nil,    24,
-   nil,    24,    24,   nil,   nil,   nil,   nil,    28,    24,    25,
-   nil,   nil,   nil,    29,    35,   nil,   nil,   nil,     4,     4,
-    26,   nil,   nil,   nil,    25,    25,    23,    23,   nil,   nil,
-   nil,   nil,    28,   nil,   nil,    35,     2,   nil,    24,    49,
-   nil,    49,    22,    35,     2,    35,    35,    25,   nil,    24,
-   nil,    29,    49,    49,   nil,   nil,   nil,   nil,   nil,   nil,
-    23,    29,    23,    23,   nil,    29,   nil,    24,   nil,    23,
-    22,   nil,    25,    49,    22,   nil,   nil,   nil,    23,    47,
-   nil,    47,    24,    24,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,    47,    47,   nil,   nil,    49,   nil,   nil,    23,
-   nil,   nil,   nil,   nil,   nil,    24,   nil,   nil,   nil,   nil,
-    23,    49,   nil,    47,   nil,   nil,   nil,   nil,   nil,    22,
-    22,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,
-    24,   nil,   nil,   nil,   nil,   nil,    47,   nil,   nil,   nil,
-   nil,    23,   nil,    23,    23,   nil,   nil,   nil,   nil,   nil,
-   nil,    47,   nil,    22,   nil,    22,    22,   nil,   nil,   nil,
-   nil,   nil,    22,   nil,   nil,   nil,    23,   nil,   nil,   nil,
-   nil,    22,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,    49,    49,   nil,   nil,   nil,
-   nil,    23,    22,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,    22,   nil,   nil,   nil,   nil,   nil,    49,
+    29,    27,     2,    60,    35,     4,    34,    28,    48,    50,
+    18,    55,    62,    29,    34,    45,    30,    28,     1,    29,
+    33,    69,     3,    35,    47,    72,    27,    39,    35,    39,
+    53,    58,    28,    44,    44,    40,    27,    54,    30,    60,
+    38,    56,    28,    57,    36,    18,    32,    61,    29,    47,
+    24,    31,    63,    64,    65,    66,    67,    68,     3,    47,
+    34,    21,    70,    71,     3,     5,    73,   nil,   nil,   nil,
+   nil,    33,    60,    51,   nil,    24,   nil,   nil,   nil,   nil,
+   nil,    62,   nil,   nil,   nil,    24,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    58,    39,
+   nil,   nil,   nil,   nil,    51,   nil,    60,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    30,
+    27,     3,   nil,    27,   nil,   nil,    28,   nil,    51,    28,
+    28,   nil,    18,    22,    29,    29,    55,    69,   nil,    72,
+    69,    51,   nil,    47,   nil,   nil,    47,    47,   nil,   nil,
+    60,   nil,   nil,   nil,    50,    29,    48,     2,    22,    35,
+    34,    60,    50,    45,   nil,    34,    28,    28,    22,    24,
+    62,    33,    24,    24,    27,    53,   nil,   nil,   nil,   nil,
+    28,   nil,   nil,    47,    29,   nil,     2,   nil,    35,   nil,
+   nil,    29,   nil,     2,   nil,    35,   nil,    47,   nil,    28,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    24,
+    22,     4,    22,    25,   nil,   nil,    47,   nil,   nil,   nil,
+    27,    27,   nil,    24,   nil,    29,    28,    28,   nil,    35,
+    51,    51,   nil,    28,   nil,   nil,   nil,   nil,    25,    26,
+     4,   nil,    24,    47,    47,   nil,   nil,     4,    25,    29,
+    47,     2,    22,    35,    29,    22,    22,   nil,    35,   nil,
+   nil,    29,   nil,    51,    26,    35,   nil,   nil,   nil,    24,
+    24,   nil,   nil,   nil,    26,     4,    24,    28,   nil,   nil,
+   nil,   nil,    22,   nil,   nil,   nil,   nil,   nil,    28,    29,
+   nil,   nil,    22,    35,    47,     4,   nil,     4,    23,   nil,
+    29,   nil,     2,   nil,    35,    47,    22,   nil,    29,    29,
+     2,    29,    35,    35,   nil,    35,   nil,   nil,   nil,    51,
+    24,   nil,   nil,    23,   nil,    22,   nil,   nil,   nil,   nil,
+   nil,    24,    25,    23,   nil,    25,    25,    51,    51,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,    22,    22,    22,   nil,   nil,   nil,    26,    22,
+   nil,    26,    26,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+    49,   nil,    25,   nil,   nil,    23,   nil,    23,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,    25,    49,    49,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    26,   nil,
+   nil,   nil,   nil,    22,   nil,    25,   nil,   nil,   nil,   nil,
+   nil,   nil,    26,   nil,    22,   nil,   nil,    23,   nil,   nil,
+    23,    23,   nil,   nil,   nil,   nil,    49,   nil,   nil,   nil,
+    49,    26,    25,    25,   nil,   nil,   nil,   nil,    49,    25,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,    26,    26,
+   nil,   nil,   nil,   nil,   nil,    26,   nil,   nil,   nil,   nil,
+   nil,    23,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,    25,   nil,   nil,   nil,   nil,   nil,   nil,
+    23,   nil,   nil,   nil,    25,   nil,   nil,   nil,    49,    49,
+    49,    49,    49,    49,    49,    49,    49,    49,    49,    26,
+    49,    49,    49,   nil,   nil,   nil,   nil,    23,    23,    23,
+    26,   nil,   nil,   nil,    23,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,    22,   nil,   nil,   nil,    47,    47,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    22,   nil,    22,    22,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    49,   nil,    47,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    49,   nil,    22,
-   nil,    49,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,    22,   nil,   nil,    47,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,    47,   nil,   nil,
-   nil,    47 ]
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    23 ]
 
 racc_goto_pointer = [
-   nil,    19,     1,    15,   -27,    59,   nil,   nil,   nil,   nil,
-   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -6,   nil,
-   nil,   -75,   254,   161,   100,    42,   -10,   -16,     2,    53,
-    23,    -1,   -78,   -36,   -83,     0,    -4,   nil,    -1,   -73,
-  -185,   nil,   nil,   nil,  -175,   -25,   nil,   289,   -29,   249,
-   -42,   nil,   -38,   -50,  -122,    11,  -200,  -103,  -120,   nil,
-  -125,   -86,  -118,  -133,    23,   -39,    17,    43,    12,    -3,
-   -78,   -76,  -124,   -35 ]
+   nil,    18,     2,    22,   -14,    41,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    -3,   nil,
+   nil,   -71,   120,   285,    37,   200,   226,   -12,    -6,     0,
+    11,    13,   -66,   -18,  -100,     4,     9,   nil,    23,   -63,
+  -199,   nil,   nil,   nil,  -199,   -23,   nil,    11,   -30,   354,
+   -26,    53,   nil,    -5,   -38,  -129,  -227,  -129,  -141,   nil,
+  -133,   -89,  -124,  -153,    30,   -45,    19,    46,    15,    11,
+  -112,  -111,  -149,   -42 ]
 
 racc_goto_default = [
-   nil,   nil,   nil,   148,     8,    11,    14,    16,    19,    21,
-    23,    25,    28,    31,     2,     7,    10,    13,   nil,    64,
-    66,    67,    83,    84,    85,    74,    75,    79,    80,    15,
-    17,   nil,   nil,   nil,   nil,    71,   nil,     6,   nil,   nil,
-   150,   210,   152,   153,   nil,   nil,   126,    48,    76,   nil,
-   117,   109,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   195,
-    53,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
+   nil,   nil,   nil,   169,    26,    30,    32,     3,     7,     9,
+    11,    12,    14,    18,    21,    25,    29,    31,   nil,    50,
+    53,    55,    77,    78,    79,    81,    82,    86,    87,    74,
+     6,   nil,   nil,   nil,   nil,    61,   nil,    24,   nil,   nil,
+   163,   234,   164,   165,   nil,   nil,   119,    80,    83,   nil,
+   124,    73,   103,   nil,   nil,   nil,   nil,   nil,   nil,   241,
+    68,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
    nil,   nil,   nil,   nil ]
 
 racc_token_table = {
@@ -613,11 +776,18 @@ racc_token_table = {
  :OR => 48,
  :AND => 49,
  :UNDEF => 50,
- :PARROW => 51 }
+ :PARROW => 51,
+ :PLUS => 52,
+ :MINUS => 53,
+ :TIMES => 54,
+ :DIV => 55,
+ :LSHIFT => 56,
+ :RSHIFT => 57,
+ :UMINUS => 58 }
 
 racc_use_result_var = true
 
-racc_nt_base = 52
+racc_nt_base = 59
 
 Racc_arg = [
  racc_action_table,
@@ -688,6 +858,13 @@ Racc_token_to_s_table = [
 'AND',
 'UNDEF',
 'PARROW',
+'PLUS',
+'MINUS',
+'TIMES',
+'DIV',
+'LSHIFT',
+'RSHIFT',
+'UMINUS',
 '$start',
 'program',
 'statements',
@@ -737,13 +914,13 @@ Racc_token_to_s_table = [
 'resourcename',
 'undef',
 'array',
-'rvalue',
+'expression',
 'param',
+'rvalue',
 'addparam',
 'anyparam',
 'rvalues',
 'comma',
-'iftest',
 'else',
 'caseopts',
 'caseopt',
@@ -763,13 +940,13 @@ Racc_token_to_s_table = [
 'argument',
 'classnameordefault']
 
-Racc_debug_parser = false
+Racc_debug_parser = true
 
 ##### racc system variables end #####
 
  # reduce 0 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 30
+module_eval <<'.,.,', 'grammar.ra', 42
   def _reduce_1( val, _values, result )
     if val[0]
         # Make sure we always return an array.
@@ -793,7 +970,7 @@ module_eval <<'.,.,', 'grammar.ra', 30
 
  # reduce 3 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 46
+module_eval <<'.,.,', 'grammar.ra', 58
   def _reduce_4( val, _values, result )
     if val[0] and val[1]
         if val[0].instance_of?(AST::ASTArray)
@@ -836,7 +1013,7 @@ module_eval <<'.,.,', 'grammar.ra', 46
 
  # reduce 17 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 69
+module_eval <<'.,.,', 'grammar.ra', 81
   def _reduce_18( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
@@ -847,7 +1024,7 @@ module_eval <<'.,.,', 'grammar.ra', 69
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 75
+module_eval <<'.,.,', 'grammar.ra', 87
   def _reduce_19( val, _values, result )
     result = ast AST::Function,
         :name => val[0],
@@ -857,7 +1034,7 @@ module_eval <<'.,.,', 'grammar.ra', 75
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 82
+module_eval <<'.,.,', 'grammar.ra', 94
   def _reduce_20( val, _values, result )
     args = aryfy(val[1])
     result = ast AST::Function,
@@ -874,7 +1051,7 @@ module_eval <<'.,.,', 'grammar.ra', 82
 
  # reduce 23 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 92
+module_eval <<'.,.,', 'grammar.ra', 104
   def _reduce_24( val, _values, result )
     result = aryfy(val[0], val[2])
     result.line = @lexer.line
@@ -897,7 +1074,7 @@ module_eval <<'.,.,', 'grammar.ra', 92
 
  # reduce 31 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 105
+module_eval <<'.,.,', 'grammar.ra', 117
   def _reduce_32( val, _values, result )
                     result = ast AST::Name, :value => val[0]
    result
@@ -906,7 +1083,7 @@ module_eval <<'.,.,', 'grammar.ra', 105
 
  # reduce 33 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 116
+module_eval <<'.,.,', 'grammar.ra', 128
   def _reduce_34( val, _values, result )
     unless val[0].is_a?(AST::ASTArray)
         val[0] = aryfy(val[0])
@@ -919,7 +1096,7 @@ module_eval <<'.,.,', 'grammar.ra', 116
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 137
+module_eval <<'.,.,', 'grammar.ra', 149
   def _reduce_35( val, _values, result )
     array = val[2]
     if array.instance_of?(AST::ResourceInstance)
@@ -943,7 +1120,7 @@ module_eval <<'.,.,', 'grammar.ra', 137
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 140
+module_eval <<'.,.,', 'grammar.ra', 152
   def _reduce_36( val, _values, result )
     # This is a deprecated syntax.
     error "All resource specifications require names"
@@ -951,7 +1128,7 @@ module_eval <<'.,.,', 'grammar.ra', 140
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 143
+module_eval <<'.,.,', 'grammar.ra', 155
   def _reduce_37( val, _values, result )
     # a defaults setting for a type
     result = ast(AST::ResourceDefaults, :type => val[0], :params => val[2])
@@ -959,14 +1136,14 @@ module_eval <<'.,.,', 'grammar.ra', 143
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 148
+module_eval <<'.,.,', 'grammar.ra', 160
   def _reduce_38( val, _values, result )
     result = ast AST::ResourceOverride, :object => val[0], :params => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 175
+module_eval <<'.,.,', 'grammar.ra', 187
   def _reduce_39( val, _values, result )
     type = val[0]
 
@@ -994,21 +1171,21 @@ module_eval <<'.,.,', 'grammar.ra', 175
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 176
+module_eval <<'.,.,', 'grammar.ra', 188
   def _reduce_40( val, _values, result )
  result = :virtual
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 177
+module_eval <<'.,.,', 'grammar.ra', 189
   def _reduce_41( val, _values, result )
  result = :exported
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 200
+module_eval <<'.,.,', 'grammar.ra', 212
   def _reduce_42( val, _values, result )
     if val[0] =~ /^[a-z]/
         Puppet.warning addcontext("Collection names must now be capitalized")
@@ -1031,7 +1208,7 @@ module_eval <<'.,.,', 'grammar.ra', 200
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 210
+module_eval <<'.,.,', 'grammar.ra', 222
   def _reduce_43( val, _values, result )
     if val[1]
         result = val[1]
@@ -1043,7 +1220,7 @@ module_eval <<'.,.,', 'grammar.ra', 210
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 218
+module_eval <<'.,.,', 'grammar.ra', 230
   def _reduce_44( val, _values, result )
     if val[1]
         result = val[1]
@@ -1059,7 +1236,7 @@ module_eval <<'.,.,', 'grammar.ra', 218
 
  # reduce 46 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 226
+module_eval <<'.,.,', 'grammar.ra', 238
   def _reduce_47( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
    result
@@ -1068,7 +1245,7 @@ module_eval <<'.,.,', 'grammar.ra', 226
 
  # reduce 48 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 232
+module_eval <<'.,.,', 'grammar.ra', 244
   def _reduce_49( val, _values, result )
     result = val[1]
     result.parens = true
@@ -1080,7 +1257,7 @@ module_eval <<'.,.,', 'grammar.ra', 232
 
  # reduce 51 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 240
+module_eval <<'.,.,', 'grammar.ra', 252
   def _reduce_52( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
     #result = ast AST::CollExpr
@@ -1089,7 +1266,7 @@ module_eval <<'.,.,', 'grammar.ra', 240
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 245
+module_eval <<'.,.,', 'grammar.ra', 257
   def _reduce_53( val, _values, result )
     result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
     #result = ast AST::CollExpr
@@ -1102,7 +1279,7 @@ module_eval <<'.,.,', 'grammar.ra', 245
 
  # reduce 55 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 252
+module_eval <<'.,.,', 'grammar.ra', 264
   def _reduce_56( val, _values, result )
     result = ast AST::ResourceInstance, :children => [val[0],val[2]]
    result
@@ -1111,7 +1288,7 @@ module_eval <<'.,.,', 'grammar.ra', 252
 
  # reduce 57 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 262
+module_eval <<'.,.,', 'grammar.ra', 274
   def _reduce_58( val, _values, result )
     if val[0].instance_of?(AST::ResourceInstance)
         result = ast AST::ASTArray, :children => [val[0],val[2]]
@@ -1127,21 +1304,21 @@ module_eval <<'.,.,', 'grammar.ra', 262
 
  # reduce 60 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 269
+module_eval <<'.,.,', 'grammar.ra', 281
   def _reduce_61( val, _values, result )
     result = ast AST::Undef, :value => :undef
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 273
+module_eval <<'.,.,', 'grammar.ra', 285
   def _reduce_62( val, _values, result )
     result = ast AST::Name, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 277
+module_eval <<'.,.,', 'grammar.ra', 289
   def _reduce_63( val, _values, result )
     result = ast AST::Type, :value => val[0]
    result
@@ -1160,7 +1337,7 @@ module_eval <<'.,.,', 'grammar.ra', 277
 
  # reduce 69 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 293
+module_eval <<'.,.,', 'grammar.ra', 305
   def _reduce_70( val, _values, result )
     if val[0] =~ /::/
         raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
@@ -1172,7 +1349,7 @@ module_eval <<'.,.,', 'grammar.ra', 293
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 298
+module_eval <<'.,.,', 'grammar.ra', 310
   def _reduce_71( val, _values, result )
     variable = ast AST::Name, :value => val[0]
     result = ast AST::VarDef, :name => variable, :value => val[2], :append => true
@@ -1180,21 +1357,21 @@ module_eval <<'.,.,', 'grammar.ra', 298
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 303
+module_eval <<'.,.,', 'grammar.ra', 315
   def _reduce_72( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 303
+module_eval <<'.,.,', 'grammar.ra', 315
   def _reduce_73( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 312
+module_eval <<'.,.,', 'grammar.ra', 324
   def _reduce_74( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
@@ -1206,14 +1383,14 @@ module_eval <<'.,.,', 'grammar.ra', 312
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 316
+module_eval <<'.,.,', 'grammar.ra', 328
   def _reduce_75( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0], :value => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 321
+module_eval <<'.,.,', 'grammar.ra', 333
   def _reduce_76( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0], :value => val[2],
                                      :add => true
@@ -1225,21 +1402,21 @@ module_eval <<'.,.,', 'grammar.ra', 321
 
  # reduce 78 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 329
+module_eval <<'.,.,', 'grammar.ra', 341
   def _reduce_79( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 329
+module_eval <<'.,.,', 'grammar.ra', 341
   def _reduce_80( val, _values, result )
  result = val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 338
+module_eval <<'.,.,', 'grammar.ra', 350
   def _reduce_81( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
@@ -1253,7 +1430,7 @@ module_eval <<'.,.,', 'grammar.ra', 338
 
  # reduce 82 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 347
+module_eval <<'.,.,', 'grammar.ra', 359
   def _reduce_83( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         result = val[0].push(val[2])
@@ -1296,7 +1473,7 @@ module_eval <<'.,.,', 'grammar.ra', 347
 
  # reduce 99 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 374
+module_eval <<'.,.,', 'grammar.ra', 386
   def _reduce_100( val, _values, result )
     args = aryfy(val[2])
     result = ast AST::Function,
@@ -1307,7 +1484,7 @@ module_eval <<'.,.,', 'grammar.ra', 374
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 379
+module_eval <<'.,.,', 'grammar.ra', 391
   def _reduce_101( val, _values, result )
     result = ast AST::Function,
         :name => val[0],
@@ -1317,28 +1494,28 @@ module_eval <<'.,.,', 'grammar.ra', 379
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 383
+module_eval <<'.,.,', 'grammar.ra', 395
   def _reduce_102( val, _values, result )
     result = ast AST::String, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 385
+module_eval <<'.,.,', 'grammar.ra', 397
   def _reduce_103( val, _values, result )
     result = ast AST::FlatString, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 389
+module_eval <<'.,.,', 'grammar.ra', 401
   def _reduce_104( val, _values, result )
     result = ast AST::Boolean, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 394
+module_eval <<'.,.,', 'grammar.ra', 406
   def _reduce_105( val, _values, result )
     Puppet.warning addcontext("Deprecation notice:  Resource references should now be capitalized")
     result = ast AST::ResourceReference, :type => val[0], :title => val[2]
@@ -1346,14 +1523,14 @@ module_eval <<'.,.,', 'grammar.ra', 394
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 396
+module_eval <<'.,.,', 'grammar.ra', 408
   def _reduce_106( val, _values, result )
     result = ast AST::ResourceReference, :type => val[0], :title => val[2]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 409
+module_eval <<'.,.,', 'grammar.ra', 421
   def _reduce_107( val, _values, result )
     args = {
         :test => val[1],
@@ -1371,7 +1548,7 @@ module_eval <<'.,.,', 'grammar.ra', 409
 
  # reduce 108 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 414
+module_eval <<'.,.,', 'grammar.ra', 426
   def _reduce_109( val, _values, result )
     result = ast AST::Else, :statements => val[2]
    result
@@ -1380,8 +1557,127 @@ module_eval <<'.,.,', 'grammar.ra', 414
 
  # reduce 110 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 426
+module_eval <<'.,.,', 'grammar.ra', 443
   def _reduce_111( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 446
+  def _reduce_112( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 449
+  def _reduce_113( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 452
+  def _reduce_114( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 455
+  def _reduce_115( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 458
+  def _reduce_116( val, _values, result )
+    result = ast AST::ArithmeticOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 461
+  def _reduce_117( val, _values, result )
+    result = ast AST::Minus, :value => val[1]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 464
+  def _reduce_118( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 467
+  def _reduce_119( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 470
+  def _reduce_120( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 473
+  def _reduce_121( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 476
+  def _reduce_122( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 479
+  def _reduce_123( val, _values, result )
+    result = ast AST::ComparisonOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 482
+  def _reduce_124( val, _values, result )
+    result = ast AST::Not, :value => val[1]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 485
+  def _reduce_125( val, _values, result )
+    result = ast AST::BooleanOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 488
+  def _reduce_126( val, _values, result )
+    result = ast AST::BooleanOperator, :operator => val[1], :lval => val[0], :rval => val[2]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 491
+  def _reduce_127( val, _values, result )
+    result = val[1]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ra', 499
+  def _reduce_128( val, _values, result )
     options = val[3]
     unless options.instance_of?(AST::ASTArray)
         options = ast AST::ASTArray, :children => [val[3]]
@@ -1391,10 +1687,10 @@ module_eval <<'.,.,', 'grammar.ra', 426
   end
 .,.,
 
- # reduce 112 omitted
+ # reduce 129 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 436
-  def _reduce_113( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 509
+  def _reduce_130( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push val[1]
         result = val[0]
@@ -1405,15 +1701,15 @@ module_eval <<'.,.,', 'grammar.ra', 436
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 440
-  def _reduce_114( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 513
+  def _reduce_131( val, _values, result )
     result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 445
-  def _reduce_115( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 518
+  def _reduce_132( val, _values, result )
     result = ast(AST::CaseOpt,
         :value => val[0],
         :statements => ast(AST::ASTArray)
@@ -1422,10 +1718,10 @@ module_eval <<'.,.,', 'grammar.ra', 445
   end
 .,.,
 
- # reduce 116 omitted
+ # reduce 133 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 455
-  def _reduce_117( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 528
+  def _reduce_134( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1436,26 +1732,26 @@ module_eval <<'.,.,', 'grammar.ra', 455
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 459
-  def _reduce_118( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 532
+  def _reduce_135( val, _values, result )
     result = ast AST::Selector, :param => val[0], :values => val[2]
    result
   end
 .,.,
 
- # reduce 119 omitted
+ # reduce 136 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 461
-  def _reduce_120( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 534
+  def _reduce_137( val, _values, result )
  result = val[1]
    result
   end
 .,.,
 
- # reduce 121 omitted
+ # reduce 138 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 472
-  def _reduce_122( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 545
+  def _reduce_139( val, _values, result )
     if val[0].instance_of?(AST::ASTArray)
         val[0].push(val[2])
         result = val[0]
@@ -1466,50 +1762,50 @@ module_eval <<'.,.,', 'grammar.ra', 472
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 476
-  def _reduce_123( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 549
+  def _reduce_140( val, _values, result )
     result = ast AST::ResourceParam, :param => val[0], :value => val[2]
    result
   end
 .,.,
 
- # reduce 124 omitted
+ # reduce 141 omitted
 
- # reduce 125 omitted
+ # reduce 142 omitted
 
- # reduce 126 omitted
+ # reduce 143 omitted
 
- # reduce 127 omitted
+ # reduce 144 omitted
 
- # reduce 128 omitted
+ # reduce 145 omitted
 
- # reduce 129 omitted
+ # reduce 146 omitted
 
- # reduce 130 omitted
+ # reduce 147 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 487
-  def _reduce_131( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 560
+  def _reduce_148( val, _values, result )
     result = ast AST::Default, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 489
-  def _reduce_132( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 562
+  def _reduce_149( val, _values, result )
  result = [val[0].value]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 493
-  def _reduce_133( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 566
+  def _reduce_150( val, _values, result )
     results = val[0] << val[2].value
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 501
-  def _reduce_134( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 574
+  def _reduce_151( val, _values, result )
     val[1].each do |file|
         import(file)
     end
@@ -1519,8 +1815,8 @@ module_eval <<'.,.,', 'grammar.ra', 501
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 511
-  def _reduce_135( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 584
+  def _reduce_152( val, _values, result )
     newdefine classname(val[1]), :arguments => val[2], :code => val[4]
     @lexer.indefine = false
     result = nil
@@ -1530,8 +1826,8 @@ module_eval <<'.,.,', 'grammar.ra', 511
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 515
-  def _reduce_136( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 588
+  def _reduce_153( val, _values, result )
     newdefine classname(val[1]), :arguments => val[2]
     @lexer.indefine = false
     result = nil
@@ -1539,8 +1835,8 @@ module_eval <<'.,.,', 'grammar.ra', 515
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 523
-  def _reduce_137( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 596
+  def _reduce_154( val, _values, result )
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
     newclass classname(val[1]), :code => val[4], :parent => val[2]
@@ -1549,8 +1845,8 @@ module_eval <<'.,.,', 'grammar.ra', 523
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 528
-  def _reduce_138( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 601
+  def _reduce_155( val, _values, result )
     # Our class gets defined in the parent namespace, not our own.
     @lexer.namepop
     newclass classname(val[1]), :parent => val[2]
@@ -1559,32 +1855,32 @@ module_eval <<'.,.,', 'grammar.ra', 528
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 533
-  def _reduce_139( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 606
+  def _reduce_156( val, _values, result )
     newnode val[1], :parent => val[2], :code => val[4]
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 536
-  def _reduce_140( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 609
+  def _reduce_157( val, _values, result )
     newnode val[1], :parent => val[2]
     result = nil
    result
   end
 .,.,
 
- # reduce 141 omitted
+ # reduce 158 omitted
 
- # reduce 142 omitted
+ # reduce 159 omitted
 
- # reduce 143 omitted
+ # reduce 160 omitted
 
- # reduce 144 omitted
+ # reduce 161 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 550
-  def _reduce_145( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 623
+  def _reduce_162( val, _values, result )
     result = val[0]
     result = [result] unless result.is_a?(Array)
     result << val[2]
@@ -1592,49 +1888,49 @@ module_eval <<'.,.,', 'grammar.ra', 550
   end
 .,.,
 
- # reduce 146 omitted
+ # reduce 163 omitted
 
- # reduce 147 omitted
+ # reduce 164 omitted
 
- # reduce 148 omitted
+ # reduce 165 omitted
 
- # reduce 149 omitted
+ # reduce 166 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 559
-  def _reduce_150( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 632
+  def _reduce_167( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 563
-  def _reduce_151( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 636
+  def _reduce_168( val, _values, result )
     result = ast AST::ASTArray, :children => []
    result
   end
 .,.,
 
- # reduce 152 omitted
+ # reduce 169 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 568
-  def _reduce_153( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 641
+  def _reduce_170( val, _values, result )
     result = nil
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 572
-  def _reduce_154( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 645
+  def _reduce_171( val, _values, result )
     result = val[1]
     result = [result] unless result[0].is_a?(Array)
    result
   end
 .,.,
 
- # reduce 155 omitted
+ # reduce 172 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 579
-  def _reduce_156( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 652
+  def _reduce_173( val, _values, result )
     result = val[0]
     result = [result] unless result[0].is_a?(Array)
     result << val[2]
@@ -1642,67 +1938,67 @@ module_eval <<'.,.,', 'grammar.ra', 579
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 584
-  def _reduce_157( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 657
+  def _reduce_174( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 588
-  def _reduce_158( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 661
+  def _reduce_175( val, _values, result )
     Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
     result = [val[0]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 590
-  def _reduce_159( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 663
+  def _reduce_176( val, _values, result )
     result = [val[0], val[2]]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 592
-  def _reduce_160( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 665
+  def _reduce_177( val, _values, result )
     result = [val[0]]
    result
   end
 .,.,
 
- # reduce 161 omitted
+ # reduce 178 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 597
-  def _reduce_162( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 670
+  def _reduce_179( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 163 omitted
+ # reduce 180 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 602
-  def _reduce_164( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 675
+  def _reduce_181( val, _values, result )
     result = val[1]
    result
   end
 .,.,
 
- # reduce 165 omitted
+ # reduce 182 omitted
 
- # reduce 166 omitted
+ # reduce 183 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 608
-  def _reduce_167( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 681
+  def _reduce_184( val, _values, result )
     result = ast AST::Variable, :value => val[0]
    result
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 616
-  def _reduce_168( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 689
+  def _reduce_185( val, _values, result )
     if val[1].instance_of?(AST::ASTArray)
         result = val[1]
     else
@@ -1712,21 +2008,21 @@ module_eval <<'.,.,', 'grammar.ra', 616
   end
 .,.,
 
-module_eval <<'.,.,', 'grammar.ra', 618
-  def _reduce_169( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 691
+  def _reduce_186( val, _values, result )
     result = ast AST::ASTArray
    result
   end
 .,.,
 
- # reduce 170 omitted
+ # reduce 187 omitted
 
- # reduce 171 omitted
+ # reduce 188 omitted
 
- # reduce 172 omitted
+ # reduce 189 omitted
 
-module_eval <<'.,.,', 'grammar.ra', 623
-  def _reduce_173( val, _values, result )
+module_eval <<'.,.,', 'grammar.ra', 696
+  def _reduce_190( val, _values, result )
  result = nil
    result
   end
diff --git a/spec/unit/parser/lexer.rb b/spec/unit/parser/lexer.rb
index fed1ade..c35a81a 100755
--- a/spec/unit/parser/lexer.rb
+++ b/spec/unit/parser/lexer.rb
@@ -136,7 +136,13 @@ describe Puppet::Parser::Lexer::TOKENS do
         :BACKSLASH => '\\',
         :FARROW => '=>',
         :PARROW => '+>',
-        :APPENDS => '+='
+        :APPENDS => '+=',
+        :PLUS => '+',
+        :MINUS => '-',
+        :DIV => '/',
+        :TIMES => '*',
+        :LSHIFT => '<<',
+        :RSHIFT => '>>',
     }.each do |name, string|
         it "should have a token named #{name.to_s}" do
             Puppet::Parser::Lexer::TOKENS[name].should_not be_nil
@@ -213,10 +219,34 @@ describe Puppet::Parser::Lexer::TOKENS[:NAME] do
 end
 
 describe Puppet::Parser::Lexer::TOKENS[:NUMBER] do
-    before { @token = Puppet::Parser::Lexer::TOKENS[:NUMBER] }
+    before do
+        @token = Puppet::Parser::Lexer::TOKENS[:NUMBER]
+#        @regex = Regexp.new('^'+ at token.regex.source+'$')
+        @regex = @token.regex
+    end
 
     it "should match against numeric terms" do
-        @token.regex.should =~ "2982383139"
+        @regex.should =~ "2982383139"
+    end
+
+    it "should match against float terms" do
+        @regex.should =~ "29823.235"
+    end
+
+    it "should match against hexadecimal terms" do
+        @regex.should =~ "0xBEEF0023"
+    end
+
+    it "should match against float with exponent terms" do
+        @regex.should =~ "10e23"
+    end
+
+    it "should match against float terms with negative exponents" do
+        @regex.should =~ "10e-23"
+    end
+
+    it "should match against float terms with fractional parts and exponent" do
+        @regex.should =~ "1.234e23"
     end
 
     it "should return the NAME token and the value" do
diff --git a/spec/unit/parser/parser.rb b/spec/unit/parser/parser.rb
index 94b19be..17e80bb 100755
--- a/spec/unit/parser/parser.rb
+++ b/spec/unit/parser/parser.rb
@@ -8,6 +8,7 @@ describe Puppet::Parser do
 
     before :each do
         @parser = Puppet::Parser::Parser.new :environment => "development"
+        @true_ast = AST::Boolean.new :value => true
     end
 
     describe "when parsing append operator" do
@@ -31,4 +32,49 @@ describe Puppet::Parser do
         end
 
     end
-end
+
+    describe Puppet::Parser, "when parsing 'if'" do
+        it "not, it should create the correct ast objects" do
+            AST::Not.expects(:new).with { |h| h[:value].is_a?(AST::Boolean) }
+            @parser.parse("if ! true { $var = 1 }")
+        
+        end
+
+        it "boolean operation, it should create the correct ast objects" do
+            AST::BooleanOperator.expects(:new).with { 
+                |h| h[:rval].is_a?(AST::Boolean) and h[:lval].is_a?(AST::Boolean) and h[:operator]=="or"
+            }
+            @parser.parse("if true or true { $var = 1 }")
+
+        end
+
+        it "comparison operation, it should create the correct ast objects" do
+             AST::ComparisonOperator.expects(:new).with { 
+                 |h| h[:lval].is_a?(AST::Name) and h[:rval].is_a?(AST::Name) and h[:operator]=="<"
+             }
+             @parser.parse("if 1 < 2 { $var = 1 }")
+
+        end
+
+    end
+
+    describe Puppet::Parser, "when parsing if complex expressions" do
+         it "should create a correct ast tree" do
+             AST::ComparisonOperator.expects(:new).with { 
+                 |h| h[:rval].is_a?(AST::Name) and h[:lval].is_a?(AST::Name) and h[:operator]==">"
+             }.returns("whatever")
+             AST::ComparisonOperator.expects(:new).with { 
+                 |h| h[:rval].is_a?(AST::Name) and h[:lval].is_a?(AST::Name) and h[:operator]=="=="
+             }.returns("whatever")
+             AST::BooleanOperator.expects(:new).with {
+                 |h| h[:rval]=="whatever" and h[:lval]=="whatever" and h[:operator]=="and"                
+             }
+             @parser.parse("if (1 > 2) and (1 == 2) { $var = 1 }")
+         end
+
+         it "should raise an error on incorrect expression" do
+             lambda { @parser.parse("if (1 > 2 > ) or (1 == 2) { $var = 1 }") }.should raise_error
+        end
+
+     end
+ end
diff --git a/test/data/snippets/arithmetic_expression.pp b/test/data/snippets/arithmetic_expression.pp
new file mode 100644
index 0000000..aae98a4
--- /dev/null
+++ b/test/data/snippets/arithmetic_expression.pp
@@ -0,0 +1,8 @@
+
+$one = 1.30
+$two = 2.034e-2
+
+$result = ((( $two + 2) / $one) + 4 * 5.45) - (6 << 7) + (0x800 + -9)
+
+
+notice("result is $result == 1295.87692307692")
\ No newline at end of file
diff --git a/test/data/snippets/ifexpression.rb b/test/data/snippets/ifexpression.rb
new file mode 100644
index 0000000..eea3b85
--- /dev/null
+++ b/test/data/snippets/ifexpression.rb
@@ -0,0 +1,6 @@
+$one = 1
+$two = 2
+
+if ($one < $two) and (($two < 3) or ($two == 2)) {
+    notice("True!")
+}

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list