1

マクロを処理できるC定義プロセッサを作成する最善の方法を考えています。残念ながら、知的なことは頭に浮かびません。Cの場合とまったく同じように動作する必要があるため、次のような式を処理します。

#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, b));

またはこれ:

#define F 10
#define max(a, b) (a > b ? a : b)

 printf("%d\n", max(a, F));

K&R2 のインストール機能とルックアップ機能については知っていますが、括弧内のテキストを置き換えるには他に何が必要ですか? 誰かアドバイスや疑似コードがありますか? 複雑な作業であることは承知していますが、それでも、最善の方法は何でしょうか?

4

3 に答える 3

1

マクロ プロセッサは非常に興味深いものですが、飼いならすのが難しい獣になる可能性があります (たとえば、再帰的な展開について考えてみてください)。

M4 ( http://www.scs.stanford.edu/~reddy/links/gnu/m4.pdf )のような既存のマクロ プロセッサの実装を見ることができます。

非常に一般的に言えば、次のものが必要になります。

  • 最初にファイルからマクロ定義を抽出するパーサー (もちろん、ファイルからそれらを削除します)
  • マクロを展開する必要がある場所を特定し、展開を実行する別のパーサー (たとえば、文字列とコメントをスキップしたい!)

とても面白い運動だと思います。これらすべてを処理するための適切なデータ構造は簡単ではありません。

于 2009-11-16T10:38:22.757 に答える
0

これはパターン マッチングの問題です。最初に正規表現を調べてから、その理論を理解したら、lexersについて読むことに進むことができます。

正規表現は基本的に、文字列を定義済みのパターンに一致させます。

一部の正規表現 (正規表現の略) ソフトウェア/ライブラリ:
- Boost.Regexp
- GNU C ライブラリ regexp
- PCRE

そして、レクサーは、一致したテキストで何かを行うソフトウェアの一部です。たとえば、そのテキストの一部を別のテキストに置き換えるなど、基本的に必要と思われるものです。

いくつかの既知のレクサー:
- flex
- Boost.Wave

于 2009-11-16T05:45:53.650 に答える
-1

2 つの提案:

つまり、「家でこれを試さないでください」。

于 2009-11-16T05:37:59.150 に答える