1

C99で書かれたcヘッダーファイルから戻り値の型、引数、および関数名を決定する最も簡単な方法を探しています。

それは私の学校のプロジェクトで、ライブラリなしで Perl で書かなければなりません。したがって、いくつかのオプションがあります。正規表現を使用できますが、次のような最も難しい機能には適用できません。

int * (* func(int * arg[]))();

戻り値の型は " int * (* )() " で、引数は " int * [] " でなければなりません。

2 番目の方法は、文法を使用して解析することですが、これは正しい方法ではないと思います。

私の友人は、それを実行できる既存のアルゴリズムについて教えてくれました。しかし、彼は名前も、どこで彼を見たかも覚えていません。アルゴリズムは非常に単純でした。次のようなもの: 最初の終了括弧を見つけます。この終了括弧と最初に一致する前の開始括弧の間のすべてが引数です...

誰かが私が何を探しているのか知っていますか?

4

3 に答える 3

2

KernighanとRitchieによるCプログラミング言語を入手できる場合。それはC聖書であるだけでなく、第5章では、C宣言を解析するためのコードを示しています。そこを見て、彼らがそれをどのように行っているかを確認し、おそらく彼らのアプローチを適応させることができます(第5章、セクション12)。

于 2013-02-22T00:45:28.323 に答える
2

C宣言のマジックデコーダーリングを見てください

于 2013-02-22T01:31:36.750 に答える
0

その種の問題のためにパーサーを構築する必要があります。通常、トップダウンアプローチ(再帰下降など)は、この種のジョブに対してそれを行います。幸いなことに、トップダウンパーサーは多かれ少なかれ簡単に実装できます。

Cのような言語の唯一の難しい点は、これらの言語は通常、少なくともLL1(1トークン先を見越す)またはさらに悪いLL2以上であるということです。そのため、たとえば、関数宣言なのか関数呼び出しなのかを確認するために、事前にいくつかのトークンを確認する必要がある場合があります。

于 2013-02-22T00:14:19.353 に答える