【ISSUE】再帰下降法でC言語数式パーサーもどきを作ってみる

1

2024年12月23日 17:28

追記(2018/11/20)

動作しなかった「ネストされたカッコのある数式」「優先順位が同じ演算子が全て右結合になってしまう」などの不具合を修正しました。一番下に修正した点とコードを載せておきますので、ご確認いただければと...。

目的

今回の目的は、数式の構文解析を行うことのできる、パーサーを作ることです。最近では、構文解析を作成する際にはlex+yacc(flex+bison)などを用いることが多いですが、今回は再帰下降法を用いたパーサーを作ります。ただ、対応できていない部分などもなるので、コメントなどで対策を教えていただけるとありがたいです...。

基本的な流れとしては、BNF記法に基づいて言語の文法を表現してから、それをコードに落とし込みます。

BNF(バッカスナウア記法)

構文解析を行うにあたって、以下のようなBNF文法を作成しました

img

再帰下降パーサ

expr

img

term

img

factor

img

DIGIT

img

VARIABLE, OPERATOR

img

表示関数

img

検証

img

img

解説

プログラム一式はここに置いておきます。

再帰下降法を用いたC言語数式パーサーもどき - Github

基本的な計算式は計算できるようです(できました)。四則演算のほかに剰余、代入演算子が使えます。その他の演算子は追加すれば使えますが、今は追加してません(気力が持ちません...笑)

唯一、カッコがネストされてる数式はうまく解析できません。対策法を教えてください....。また、OPERATORの処理がvariableの部分と同じになっていますが、分割してもいいと思います。ってか分割するべきなんです...。

変数の定義方法としてはexpr("a = 2", &test);とすれば、それ以降のコードで使用することができます。

img

お知らせ

ブログの月間PVが、やっと1000PVを超えることができました!!みなさんありがとうございます。
これからも、様々なことを書いていきたいと思うので、よろしくお願いします:)

http://nomunomu.hateblo.jp/

修正(2018/11/20)

上記のコードでは「カッコがネストされた数式」、コメントにもあるような「"8/4/2", "1-2-3"といった数式」がうまく解析できませんでした。なので、BNF記法から見直してみました。

修正版BNF記法

元々のBNF記法を以下のように修正してみました。

img

修正版演算子関数

そして、上記のBNF記法に沿って"expr", "term", "factor"を書き換えました。

img

img

img

コード検証

書き換えたら、前回の検証コードに加えて、以下のようなコードもテストしました。

img

これで、一応は計算を真面目にすることはできるようになったのではないでしょうか...。(たぶん)

不明点

「カッコがネストされた数式」では、以下のような処理を行っています。

img

ただ、デバッグのようにライン実行だと、うまくいくのですが、コンパイル実行だと文字列連結がうまく行われません。プログラムの組み方が悪いんだと思いますが、要検討点です...。
[cv:issue_marketplace_engineer]

1

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。