Updated on 2013-03-09 (土) 23:45:32 (1718d)

数式を解釈するプログラムのサンプル

本研究室で「ユーザが入力した数式を処理したい」というニーズがあったので、 コンパイラの教科書ならどれにも載っているような四則演算の数式を処理するサンプルを作ってみました。 このサンプルで対応するのは参考文献1.のP143にG3として載っている文法(の一部)で、以下に示します。 赤い文字は文法そのものを記述するためのメタ文字です。

数式のための文法G3
E T { ( + | - ) T }
T F { ( * | / ) F }
F ( E ) | i | num

EはExpression(式)、TはTerm(項)、FはFactor(要素、つまり数値や変数名など)に対応しています。

ファイル名説明
fileparser.Cちょっとわかりやすいように作ったもの、約130行
fileparser_opt.C普通に作ったもの、約100行

ソースはどちらもC++用ですが、1行コメント(//で始まる部分)以外はC++の機能を用いてないので、 C用にすぐ書き直せると思います(出力もprintfですし)。 機能はシンプルで、コマンドラインで引数として与えられた式を解釈してその値を表示します。 変数や関数を扱うようにも簡単に拡張できるでしょう。 それではKさん、がんばってください。

なお、上記のソースは漢字コードがEUC、改行がLFです(要するにUNIX)。 WindowsやMacで利用するには、Vectorあたりで何か変換要ソフトをさがしてください。 例えば、TeraPadあたりです。 蛇足とは思いますが、MS-DOSは漢字コードがSJISで改行コードがCR+LFです。

実行例

実数を用いた括弧付きの四則演算を解釈して実行します。変数などには対応していません。

UNIX

./a.out  '(38.2-15.366)*14+13.6/4.6' ←引数として式を入力
Result = 322.632522 ←結果が表示される

UNIXのように*などの文字がシェルで展開される環境では、 引数をシングルクォーテーションで囲まないとうまく機能しません。

MS-DOS

parser  (38.2-15.366)*14+13.6/4.6 ←引数として式を入力
Result = 322.632522 ←結果が表示される

MS-DOSは低能なので、*などの文字を処理せずにそのままコマンドに渡すため、 クォートなしで動きます。 参考

参考

  1. 岩波講座ソフトウェア科学5 「プログラミング言語処理系」 佐々政孝 著、岩波書店
  2. 「コンパイラ」 中田育男 著、産業図書
  3. 「コンパイラ I,II」 A.V.Aho他著、サイエンス社

2013-03-09追記

  • parser.Cに2文字バグがあり、うまく動いていなかったのを修正しました。parser_opt.Cの方はもともとOKです。