次へ: 5 getline
上へ: C のソースからプロトタイプ宣言を作成
前へ: 3 関数定義部の取り出しについて
(PDF ファイル: awktg.pdf)
4 行のチェック
今回のプログラムでは、AWK の正規表現によるパターンマッチ機能を利用して、
入力行がどのような行であるかを調べながら進行するものを考えますが、
行のチェックは次のようなことを行います。
- ア: 行の先頭文字がアルファベットかアンダースコアで始まり、
`(' が含まれる行
- イ: 行の最後が `)' で終わる行
- ウ: 行の最初がスペースかタブで始まる行 (インデントされている行)
- エ: 行の最初が `{' で、それだけの行
「ア」は関数定義の先頭、「イ」は定義の終わりを意味します。
「イ」は「ア」と同じ行かもしれませんし、その後かもしれません。
「ウ」は「ア」の関数定義の続きの 2 行目以降の部分で、
その終わりは「イ」になっているはずです。
逆にそうでなければ関数定義ではないと見れます。
そしてさらに、その「イ」の次の行が「エ」になっている場合に
関数定義と見なして出力を行なうことにします。
ただし、例えばソースにすでにプロトタイプ宣言が含まれている次のような場合、
int f1(char *name, double x);
int f2(char *name)
{
...
この先頭行で「ア」のチェックを行った後で「イ」のチェックを行いますが、
これは「イ」ではないので、
今度は次の行を読んで「ウ」のチェックを行うことになります。
そうするとこの 2 行目は「ウ」ではないので、
この 1 行目が関数定義ではないことがわかります。
しかしこの方法だと、2 行目を読んだ後で 1 行目が関数定義でないとわかり、
しかもこの 2 行目を元に戻って「ア」の処理にかけないといけないことに
なってしまいます。
よって、それよりも 1 行目の段階でこれが関数定義ではないと
判別してしまう方が楽ですから、必要に応じて、
の判別を行って、現在考えている部分が関数定義ではないことを
判断してやることにします。
次へ: 5 getline
上へ: C のソースからプロトタイプ宣言を作成
前へ: 3 関数定義部の取り出しについて
竹野茂治@新潟工科大学
2006年6月22日