━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
課題2の補足
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●補足 2a

*参考になるコマンド

        UNIX の bc コマンドは数式を読み込んで値を計算する機能をもつ.
        実装するプログラムは,このコマンドの簡易版である.

*BNF の読み方

        A::=B は「AとはBである」,A|B は「AまたはB」の意味である.

*構文に合う算術式の例

        0
        x
        (a+1)
        (3*(4*5))
        ((x+a)*(y+b))
        (4+(3+(2+(1+Z))))
        (((7*i)+(7*j))*(7*k))

*参考になる関数

        表示関数 show_exp() は tree.c の show_tree() を参考にして作るとよい.

*デバッグの方法

        プログラム本体 ex2.c の実行結果は期待通りではないかもしれない.
        その場合には,作成中の関数に一時的に動作確認用の表示処理を加えたり,
        新たに debug.c 等の名前で動作確認用プログラムを作ったりして修正する.
        必要に応じて Makefile も編集すること.

●補足 2b

*式の値を求める別の方法

        算術式の値を求めるにはスタックを使う方法もあるが,
        この課題では,より柔軟な処理が可能な,2分木を使う方法を採用する.

*数値への変換の参考資料

        数字から数値への変換については,ホームページ上の
        「C言語の 数字・数字列」の資料(第2回演習時に公開)が参考になる.

*入出力の切り替え

        標準入力からデータを読む検査を繰り返す場合,データファイル
        (ex2.data 等) を作り,ファイルから標準入力へデータを送る
        シェルの機能を使う.

        実行時に,次のように入力データファイルを指定する.

                ./ex2 < ex2.data

        また,結果をファイルに保存するには,

                ./ex2 < ex2.data > ex2.result

        のように,標準出力のデータをファイルに保存するシェルの機能を使う.

●補足 2c

*高度な変形

        結合法則 (A+(B+C))=((A+B)+C) や (A*(B*C))=((A*B)*C) を適用できない
        x や (a+1) や (8+(8*8)) などの式は,変形しないこと.

        式全体でなく式の一部分に対してだけ括弧をくくり直せる
        (a+(b*(c*d))) や (a*((x+(y+z))+1)) のような式も変形しない.

        部分式に対する再帰的な式変形もしない.例えば,式 (w+(x+(y+z))) は
        ((w+x)+(y+z)) へと1度だけ左にくくればよく,(((w+x)+y)+z) にはしない.

        結合法則を繰り返し使って,すべての括弧をくくり直す処理は,次回に扱う.

*参考になるコマンド

        算術式の文字列よりも木の図の方が動作確認しやすいと思うなら,
        演習用コマンド ~toshi/show-exp を使うとよい.

──────────────────────────────────────

●補足 2d

*発展課題

        発展課題に取り組む場合は,あらかじめ動作試験の実施方法を読み,
        正常にコンパイルできるように機能拡張するとよい.

        特に,ヘッダファイル tree.h や exp.h は,配布したものを
        そのまま動作試験で使うため,内容を変えないこと.

*領域の解放

        変形後に不要になる記憶領域があれば解放すること.

●補足 2e

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
演習のホームページ

山田 俊行
https://www.cs.info.mie-u.ac.jp/~toshi/