Next: , Previous: Motion and Syntax, Up: Syntax Tables


34.6 釣り合った式の解析

ここでは、括弧が対になっているS式(sexp)とも呼ばれる 釣り合った式を解析したり走査する関数について述べます。 構文テーブルで文字の解釈を制御することで、 LispモードではLispの式に対して、CモードではCの式に対して これらの関数を用いることができます。 釣り合った式を飛び越えて移動するための便利な上位レベルの関数については、 See List Motion

— Function: parse-partial-sexp start limit &optional target-depth stop-before state stop-comment

この関数は、カレントバッファのstartから始まるS式を解析するが、 limitを越えては走査しない。 位置limitで止まるか、 以下に述べる条件が満たされると解析を停止し、当該箇所にポイントを置く。 ポイントを置いた箇所での解析状況を表す値を返す。

statenilであると、 位置startは、関数定義の先頭のような 括弧の構造のトップレベルであると仮定する。 あるいは、構造の途中から解析を再開したい場合もある。 それには、解析の初期状態を引数stateに指定する必要がある。

3番目の引数target-depthnil以外であると、 括弧の深さがtarget-depthに等しくなると解析を停止する。 深さは0、あるいは、stateで指定された値から始まる。

4番目の引数stop-beforenil以外であると、 S式を始める文字に出会うと解析を停止する。 stop-commentnil以外であると、 コメントの始まりに出会うと解析を停止する。 stop-commentがシンボルsyntax-tableであると、 コメントや文字列の始まり、コメントや文字列の終りのいずれかに 出会ったあとで解析を停止する。

5番目の引数stateは9要素のリストであり、 以下に述べるようにこの関数の値と同じ形である。 (9番目の最後の要素は省いてもよい。) parse-partial-sexpの呼び出しの戻り値を、 別のparse-partial-sexpの呼び出しの解析状態の初期値に使ってよい。

結果は、解析の最終状態を記述した9要素のリストである。

  1. 0から数えた括弧の深さ。
  2. ポイントを停止した箇所を含むもっとも内側の括弧式の開始位置。 なければnil
  3. 閉じている最後の完全な部分式の開始位置。 なければnil
  4. 文字列の内側であるとnil以外である。 より正確には、これは文字列を終える文字である。 あるいは、汎用文字列区切り文字で終えるときにはtである。
  5. (どちらかの形式の)コメントの内側であるとtである。
  6. ポイントがクォート文字の直後であるとtである。
  7. この解析中に出会った最小の括弧の深さ。
  8. どの形式のコメントが活性であるかを表す。 『a』形式であるとnil、 『b』形式であるとt、 汎用コメント区切り文字で終るコメントの場合にはsyntax-tableである。
  9. 文字列やコメントの開始位置。 コメントの内側であるときにはこれはコメントの開始位置であり、 文字列の内側であるときにはこれは文字列の開始位置である。 文字列やコメントの外側では、この要素はnilである。

引数stateでは、要素0、3、4、5、7は重要である。

この関数は、入れ子にあった括弧を持つ言語向けに 字下げを計算するためにしばしば用いられる。

— Function: scan-lists from count depth

この関数は、位置fromから前方へ向けてcount個の 釣り合った括弧のグループを走査する。 走査を停止した位置を返す。 countが負であると、後方へ向けて走査する。

depthが0以外であると、括弧の深さをその値から数え始める。 停止箇所の候補位置は、括弧の深さが0になる箇所である。 scan-listsは、そのような箇所をcount回数えてから停止する。 したがって、depthに正の値を指定すると、 括弧のレベルをdepthレベルだけ抜けることを意味する。

parse-sexp-ignore-commentsnil以外であると、 コメントを無視して走査する。

走査がバッファ(あるいはその参照可能部分)の先頭や末尾に達し、 深さが0でないと、エラーを通知する。 深さは0であるが指定個数だけ数えてない場合には、nilを返す。

— Function: scan-sexps from count

この関数は、位置fromから前方へ向けてcount個のS式を走査する。 走査を終えた位置を返す。 countが負であると、後方へ向けて移動する。

parse-sexp-ignore-commentsnil以外であると、 コメントを無視して走査する。

走査が括弧によるグループの途中で バッファ(あるいはその参照可能部分)の先頭や末尾に達すると、 エラーを通知する。 指定個数だけ数えるまえに括弧によるグループのあいだで 先頭や末尾に達した場合はnilを返す。

— Variable: parse-sexp-ignore-comments

値がnil以外であると、 本節の関数やforward-sexpは、コメントを白文字として扱う。

Emacsの古い版では、コメントの終了が‘*/’のような形であり、かつ、 コメントの終了と思える場合にのみ、この機能は動作した。 改行でコメントを終える言語では、改行すべてがコメントの終りではないために、 この変数をnilにする必要があった。 このような制限事項はすでにない。

forward-commentを使うと、 1つのコメントや複数のコメントを飛び越えて前後に移動できます。

— Function: forward-comment count

この関数は、ポイントを前方へ向けて(countが負ならば後方へ向けて) count個のコメントを飛び越えて移動する。 コメントか白文字以外のものに出会うと停止し、当該箇所にポイントを置く。 count個だけ数えたあとにももちろん停止する。

ポイントに続くすべてのコメントと白文字を飛び越えるには、 (forward-comment (buffer-size))を使います。 バッファ内のコメントの個数は(buffer-size)を越えるはずがないので、 引数に使うには(buffer-size)はよいものです。