エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

パーサ、なんどでも


calc.tt

grammar Arithmetic
  rule additive
    multitive r:( op:[+-] multitive )* {
      def to_i
        r.elements.reduce(multitive.to_i) do |s, e|
          s.send(e.op.text_value, e.multitive.to_i)
        end
      end
    }
  end

  rule multitive
    primary r:( op:[*/%] primary )* {
      def to_i
        r.elements.reduce(primary.to_i) do |s, e|
          s.send(e.op.text_value, e.primary.to_i)
        end
      end
    }
  end

  rule primary
    '(' additive ')' {
      def to_i
        additive.to_i
      end
    }
    /
    number
  end

  rule number
    '-'? [1-9] [0-9]* {
      def to_i
        text_value.to_i
      end
    }
  end
end


calc.rb

require 'treetop'

Treetop.load 'calc.tt'

parser = ArithmeticParser.new

puts parser.parse(ARGV.shift).to_i


Treetop のインストール。

$ gem install treetop


実行。

$ ruby calc.rb "2*(3+4)"
14


…。

ここまでくるのに3日ぐらいかかってしまった (-''-) 。


つづく