diff options
| author | Brice Figureau <brice-puppet@daysofwonder.com> | 2008-09-26 22:54:42 +0200 |
|---|---|---|
| committer | Brice Figureau <brice@daysofwonder.com> | 2008-09-30 17:22:07 +0200 |
| commit | cfa230a2d7b0c5e57cc0379785bd2025520f1c35 (patch) | |
| tree | 046bc7c55a6a1a8ed9b36c5371a3901a89a779c4 /lib/puppet/parser/ast | |
| parent | 850e0baf0fbe321f14d4b9d913ce7dea39c9aa27 (diff) | |
| download | puppet-cfa230a2d7b0c5e57cc0379785bd2025520f1c35.tar.gz puppet-cfa230a2d7b0c5e57cc0379785bd2025520f1c35.tar.xz puppet-cfa230a2d7b0c5e57cc0379785bd2025520f1c35.zip | |
Add arithmetic operators to AST
This changeset adds +,-,/,*,<< and >> computation and
AST parse nodes.
Diffstat (limited to 'lib/puppet/parser/ast')
| -rw-r--r-- | lib/puppet/parser/ast/arithmetic_operator.rb | 41 | ||||
| -rw-r--r-- | lib/puppet/parser/ast/minus.rb | 23 |
2 files changed, 64 insertions, 0 deletions
diff --git a/lib/puppet/parser/ast/arithmetic_operator.rb b/lib/puppet/parser/ast/arithmetic_operator.rb new file mode 100644 index 000000000..8d9cef86a --- /dev/null +++ b/lib/puppet/parser/ast/arithmetic_operator.rb @@ -0,0 +1,41 @@ +require 'puppet' +require 'puppet/parser/ast/branch' + +class Puppet::Parser::AST + class ArithmeticOperator < AST::Branch + + attr_accessor :operator, :lval, :rval + + # Iterate across all of our children. + def each + [@lval,@rval,@operator].each { |child| yield child } + end + + # Returns a boolean which is the result of the boolean operation + # of lval and rval operands + def evaluate(scope) + # evaluate the operands, should return a boolean value + lval = @lval.safeevaluate(scope) + lval = Puppet::Parser::Scope.number?(lval) + if lval == nil + raise ArgumentError, "left operand of %s is not a number" % @operator + end + rval = @rval.safeevaluate(scope) + rval = Puppet::Parser::Scope.number?(rval) + if rval == nil + raise ArgumentError, "right operand of %s is not a number" % @operator + end + + # compute result + lval.send(@operator, rval) + end + + def initialize(hash) + super + + unless %w{+ - * / << >>}.include?(@operator) + raise ArgumentError, "Invalid arithmetic operator %s" % @operator + end + end + end +end diff --git a/lib/puppet/parser/ast/minus.rb b/lib/puppet/parser/ast/minus.rb new file mode 100644 index 000000000..b0779a8ee --- /dev/null +++ b/lib/puppet/parser/ast/minus.rb @@ -0,0 +1,23 @@ +require 'puppet' +require 'puppet/parser/ast/branch' + +# An object that returns a boolean which is the boolean not +# of the given value. +class Puppet::Parser::AST + class Minus < AST::Branch + attr_accessor :value + + def each + yield @value + end + + def evaluate(scope) + val = @value.safeevaluate(scope) + val = Puppet::Parser::Scope.number?(val) + if val == nil + raise ArgumentError, "minus operand %s is not a number" % val + end + return -val + end + end +end |
