次: , 前: Syntactic Analysis, 上: Custom C Indent


20.5.5.2 第2段階−−字下げ計算

Cの字下げ機構は、構文解析で得られた構文構成要素リスト c-syntactic-contextを使って、現在行の字下げ幅を計算します。 このリストの各要素は、構文シンボルを含むコンスセルですが、 バッファ内位置を含んでいる場合もあります。

リストの各要素は、最終的な総字下げ量に2つの方法で寄与します。 まず、各構文シンボルに字下げオフセットを対応付ける連想リスト c-offsets-alistから要素を探すために構文シンボルが使われます。 各構文構成シンボルのオフセットを総字下げ量に加えます。 つぎに、リストの要素にバッファ内位置が含まれていれば、 その箇所の桁位置を字下げ量に加えます。 これらのオフセットと桁数をすべて加えることで、総字下げ量が求まります。

以下の例でCの字下げ機構の動作を説明しましょう。

     1: void swap (int& a, int& b)
     2: {
     3:   int tmp = a;
     4:   a = b;
     5:   b = tmp;
     6: }

3行目にポイントがあって、そこで<TAB>と打って字下げし直すとしましょう。 上(see Syntactic Analysis)でも説明しましたが、 その行に対する構文構成要素リストはつぎのようになります。

     ((defun-block-intro . 28))

ここでは、まず、連想リストc-offsets-alistから defun-block-introを探すことから始めます。 その結果が整数値2であったとしましょう。 この値を計算中の合計(0で初期化されている)に加えて、 総字下げ量は空白2文字と更新されます。

つぎの段階は、バッファ内位置28の桁位置を求めることです。 バッファ内位置28の中括弧は0桁目にあるので、 0を計算中の合計に加えます。 3行目には構文要素が1つしかないので、総字下げ量は空白2文字となります。

     1: int add (int val, int incr, int doit)
     2: {
     3:   if (doit)
     4:     {
     5:       return(val + incr);
     6:     }
     7:   return(val);
     8: }

4行目で<TAB>と打つと、同じ過程を繰り返しますが、 異なる値を使って計算されます。 この行に対する構文構成要素リストはつぎのとおりです。

     ((substatement-open . 43))

まずは、シンボルsubstatement-openを連想リスト c-offsets-alistから探します。 このシンボルに対するオフセットが2であったとしましょう。 この時点で計算中の合計は2(0 + 2 = 2)です。 つぎに、バッファ内位置43(3行目のifの`i'の位置)の 桁位置2を加えます。 結果として、空白4文字という総字下げ量が求まります。

行を解析した結果、c-offsets-alistに現れない構文シンボルが みつかった場合、そのシンボルは無視します。 しかし、変数c-strict-syntax-pnil以外の値であれば、 エラーを報告します。