Views
演習3
木構造その他
いつものように
- ~/da/ex3 ディレクトリを作成してその下で演習をおこなう
逆ポーランド記法による電卓
- rpn.py を実行してみよう。
100 100 + 5 / 20 2 / +
標準入力の利用
- 次のように計算式を1行ずつ読み取って、その計算結果を表示するようにしてみる。
- rpn2.py
- 上のプログラム用のテストデータ:test.rpn
- 使用法:
$ python rpn2.py < test.rpn
パーザ・ジェネレータで作る電卓プログラム
- パーザ・ジェネレータ (yacc, bison, ... ) の練習に、電卓プログラムがよく取り上げられる
- が、電卓ごときに yacc を使うのは面倒
- なので、Python で書かれたパーザ・ジェネレータを探してきました。
- Toy Parser Generator
TPG の使い方
calc.py について
- class Calc(tpg.Parser) ... パーザクラスの定義
- r""" ... 実は docstring に書いてある(普通はコメント/ヘルプに使用)
- 文法の書き方
- 正規表現形式に近い構造
- E -> T (+ T)* ... * は0回以上の繰り返し
- E/e ... e は変数
- $ e += t ... 動作を与える
と、理解した上で
- calc2.py
- 文法を簡単に
- 実数/整数 -> 実数のみ
- 単項演算子の
-
を省略 - べき乗
**
を省略
- 直ぐに計算するのでなく、リストで木を作る
問題
- q3-1.py ... rpn2.py を参考に、標準入力から(RPNでない普通の)計算式を入力してその計算結果を表示するプログラムを作成しなさい。(例えば以下のようなコマンドで計算ができる)計算式(test2.calc)
$ python q3-1.py < test2.calc
- q3-2.py ... 前回の講義で習った「後順走査」を使って、標準入力から入れた計算式を 逆ポーランド記法に
して出力するプログラムを作成しなさい。(例えば以下のようなコマンドで計算ができる)
$ python q3-2.py < test2.calc > test2.rpn $ python rpn2.py < test2.rpn