6 初歩的な電卓(2)

基礎1 擬似BNFでの文法記述

BNF-2
::= トークン [トークン …] 行はトークンの並びとして認識できる
トークン ::= 数値|演算子 トークンとは数値か演算子のどちらかである
演算子 ::= ‘+’ | ‘-’ | ’*’ | ‘/’| ‘%’ 現時点では 四則演算と%だけを扱う
数値 ::= 数字 [数字 …]
数字 ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

BNF-1 BNF-2

補足1 BNFについて
主な略語
補足2 整数の文法

6.2 方針の検討:

6.3 計算の実行 の手前まで(構文解析は今日は省略)

=> ここまでの過程をプログラムの改良過程としてまとめたページを参照しつつ、 ここまで紹介したプログラムを1つのファイルにまとめたもの(12-1.rb)を 各自動かしてみて下さい。

補足3 予約語

スキャナーの拡張 スキャナ

6.5 スキャナーを改良

  1. パターンを増やす

  2. 種類に応じて、データを適切な型に変換しておく

    line.scan(%r![-+/*%]|\d+(?:\.\d+)?!).map{|e|
        case e
        when /\d+\.\d+/  then e.to_f
        when /\d+/       then e.to_i
       when %r![-+/*]!   then e.to_sym
        end
    }
    t.is_a?(Symbol)
    t.is_a?(Numeric)
  3. 関数 scan にしてまとめておく

    def scan(str)
       ...
    end

ここ(12-2.rb)にここまでの完成版を置いたので参考にして下さい。 正規表現

補足4 正規表現のまとめ
補足5 配列(の各要素)に関する繰り返し