[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31. 構文テーブル

構文テーブル(syntax table)には、それぞれの文字の構文上の働きが 記述されていま す。この情報は、解析コマンドや、複雑な移動のコマンドを制御したり、語、 シンボル、構文要素 の始まりと終わりを決定するために使用されます。また、現在の構 文テーブルは、この章でふれる関数のほかにも、語移動関数(see section 単語単位での移動)や リスト移動関数(see section 釣り合った式をまたがる移動)の意味の制御も行なっています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.1 構文テーブルの基本的な考え方

構文テーブルは、256個の要素からなるベクタです。そして、 1バイト(8ビット)で表すことのできる256文字に対して、 一つのエントリを持っています。 おのおのの要素は整数であり、その文字の構文をコード化したものです。

構文テーブルは、Lispリーダのためにではなく、テキストを操作するた めにだけ、利用されます。Lisp式を読むときには、Emacs Lispは、最初から組み込まれた構文規則を使います。また、これらの規則は変更できません。

バッファには、それぞれ主モードがあり、主モードごとに、さ まざまな文字の構文クラスに独自の考え方を持っています。たとえば、 Lispモードでは、`;'という文字は、コメントの始まりとなりますが、 Cモードでは、文の終わりを表します。このような変化に対応するために、 Emacsではバッファごとにローカルの構文テーブルを選択します。特に、主 モードでは、おのおの独自のテーブルをもっていて、そのモードを使うバッフ ァごとにそれらテーブルが利用可能になっています。このテーブルを変更する と、あるモードを次に利用するときの文法ばかりでなく、すべての同じモードのバッファ上 での構文を変更すことになります。しばしば、似ているモードは一つのテーブルを 共有しています。どのように構文テーブルをセットアップするかの例は、 See section 主モードの例

構文テーブルは、いくつかの文字については標準のテーブルから情報を 継承することができます。また、残りの文字について独自に情報を指定することも できます。この構文クラスの「継承」とは、 「標準の構文テーブルから、その文字の構文を継承する」ことを意味し ています。ほとんどの主モードの構文テーブルは、0から31までと 128から255までの文字コードを引き継いでいます。これは、 128から255の間に追加のアルファベット文字をもつISO Latin-1のような文字集合では 便利です。こういった文字について、標準構文テーブルだけを変更すると全ての主 モードに影響があります。

Function: syntax-table-p object

この関数は、objectが256の要素をもつ長さのベクタであれば、 tを返します。つまり、そのベクタが構文テーブルであるかもしれない ということを意味します。しかし、この検査だけでは、なかに何が含まれてい ても、長さが256のベクタであれば、構文テーブルであると判断されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.2 構文記述子

この節では文字の構文を示す構文クラスやフラグについて、そして それらがどうやって構文記述子(syntax descriptor)として表 されるかについて述べます。構文記述子とは modify-syntax-entryに渡して望みの構文を指定するための Lisp文字列です。

Emacsには、多くの構文クラス(syntax classes)が定義してあります。 構文テーブルは、各文字を一つのクラスに置きます。ある構文テーブルにおける ある文字のクラスと、ほかの構文テーブルにおける同じ文字のクラスとに、 関連がある必要はありません。

各クラスはニモニック文字で指示され、このニモニック文字はクラスを 指定したい場合に、そのクラスの名前となります。通常この指示子は そのクラスでよく使われる文字になっています。とはいうものの、 指示子としての意味は不変で、現在その文字がどんな構文を持っているかとも 無関係です。

構文記述子は、構文クラスや、対応文字(かっこの対応を調べるためだけに使わ れる)、フラグを記述するためのLisp文字列です。最初の文字は、構文クラスの 指示子になります。2番目の文字は対応文字で、使わなければ、ス ペースを置きます。その次には、望みのフラグ用文字がきます。対応文字やフラグが必 要なければ、1文字だけで十分です。

たとえば、Cモードでは、文字`*'の記述子は`. 23'となります (句読点、対応文字なし、コメント開始の2番目の文字、 コメント終了の1番目の文字)。また、`/'のエントリ は、`. 14'です(句読点、対応文字なし、コメントの開始 の1番目の文字、コメント終了の2番目の文字)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.2.1 構文クラスのテーブル

ここでは、構文クラスのテーブルや、それらを表す文字、意味、使い方の例 について述べます。

Syntax class: 空白文字[くうはくもじ]

空白文字(whitespace characters)(` '`-'で指示する)は、 シンボルや語をお互いから分離する働きがあります。ほとんどの場合、空白には 構文上ほかに重要な意味はなく、空白が何文字あっても構文上は、1個の空白と同じ 意味です。スペース、タブ、改行、改ページもたいていは空白とほぼ 同じように分類されます。

Syntax class: 語構成可能[ごこうせいかのう]

語構成可能(word constituents)(`w'で指示する)は、普通の英単語の一部 となるもので、たいていは、プログラム内の変数やコマンドの名前で使われます。 すべて の大文字や、小文字、数字が語構成可能として使われます。

Syntax class: シンボル構成可能[しんぼるこうせいかのう]

シンボル構成可能(symbol constituents)(`_'で指示する)は、 変数やコマンド名内で語構成可能と一緒に使われる特別な文字です。 たとえば、Lispモードで使うシンボル構成可能クラスは、ある種の文字が、 英単語の一部ではないが、シンボル名の一部になるかもしれないということを 表します。これらの文字は、`$&*+-_<>'です。標準のCでは、語構成可能以外で シンボルに使用できるのは、(`_')だけです。

Syntax class: 句読点文字[くとうてんもじ]

句読点文字(punctuation characters)(`.')は、 英語における句読点と同じように使われます。また、 プログラミング言語によっては、シンボルの区切りに使われることもあります。 Emacs Lispモードを含めて、ほとんどのプログラミング言語モードは、 シンボルあるいは語構成可能以外の僅かな文字には全てほかの使い道があるので、 このクラスには文字がありません。

Syntax class: 開き括弧文字[ひらきかっこもじ]
Syntax class: 閉じ括弧文字[とじかっこもじ]

開きと閉じ括弧文字(parenthesis characters)は、 違ったものの対で、文や式を囲むために使われる文字です。 こういうグループは、開き括弧文字で始まり、閉じ括弧文字で終わります。 各開き括弧文字は、特定 の閉じ括弧文字に対応しています。逆も同じです。普通、Emacsは、閉じ括弧を 挿入したとき、対応する開き括弧を一瞬示してくれます。See section 対応括弧の点滅表示

開き括弧のクラスは`('で、閉じ括弧のそれは、`)'で指示されます。

TextモードやCモードでは、対になる括弧には、`()'`[]'`{}'があります。Emacs Lispでは、リストやベクタの区切り、 (`()'`[]')が、括弧文字として分類されています。

Syntax class: 文字列quote[もじれつquote]

文字列quote文字(String quote characters)(`"'で指示する)は、 LispやCを含めて、多くの言語 で文字列定数の区切りとして使われています。同じ文字列quote文字が、文字列の始 まりと終わりに記述されます。そのようにquoteされた文字列を入れ子にするこ とはできません。

Emacsの構文解析は、1文字列を1トークンとみなします。文字が 通常もっている構文上の意味は、文字列中では抑止されます。

Lispモードには、2種類の文字列quote文字があります。二重引用符 (`"')と縦棒(`|')です。`|'は、Emacs Lispでは、使われ ませんが、Common Lispでは、使われます。C言語も、2種類の文字列quote文字 があります。文字列のための二重引用符と、文字定数のための単一引用符 (`'')です。

英文テキストは、プログラミング言語でないので、文字列quote文字はありま せん。英文のなかで、引用符が使われることはありますが、引用符中の文字に、 通常の構文上の属性をなくして欲しくはありません。

Syntax class: エスケープ[えすけーぷ]

エスケープ文字(escape character)(`\'で指示する)は、 C言語の文字列や文字定数で 使われているのと同様に、エスケープ・シーケンスを始めます。文字`\'は、 CとLispの両方でこのクラスに属します(C言語では、それは、文字列の中で だけに使われますが、Cコード全体の中でこのように扱っても、 障害を起こさないということがわかります)。

このクラスの文字は、words-include-escapesが非nilの場 合、語の一部としてみなされます。See section 単語単位での移動

Syntax class: 文字quote[もじquote]

文字quote文字(character quote character)(`/'で指示する)は、 それに続いて記述される文字 をquoteします。quoteされた文字は、通常の構文上の意味を失います。エスケープ 文字との違いは、ただ直後の文字だけに効果があることです。

このクラスの文字は、words-include-escapesが非nilの場合、 語の一部とみなされます。See section 単語単位での移動

TeXモードのバックスラシュために、このクラスは使われます。

Syntax class: 対の区切り[ついのくぎり]

対の区切り文字(paired delimiter characters)(`$'で指示する)は、 これによって囲まれた文字の 構文上の属性が抑制されないことを除けば、文字列quote文字と同じです。 この区切り文字は、現在、TeXモード でのみで使われます(`$'は、数式モードの開始と終了を表します)。

Syntax class: 式前置[しきぜんち]

式前置演算子(expression prefix operator)(`''で指示する)は、 式がこれに続いた場合、その式の一部としての構文上の演算子として使われます。 Lispでのこれらの文 字には、アポストロフィ、`''(quoteに使われる)、カンマ、`,'(マクロ で使われる)、`#'(あるデータ型のリード構文として 使われる)が含まれます。

Syntax class: コメント開始[こめんとかいし]
Syntax class: コメント終了[こめんとしゅうりょう]

コメント開始(comment starter)コメント終了(comment ender)文字は、 さまざまな言語 でコメントの範囲を定めるために使われます。これらのクラスは、それぞれ `<'`>'で指示されます。

英文テキストには、コメント文字はありません。Lispでは、セミコロン(`;') でコメントが始まり、改行、改ページで終わります。

Syntax class: 継承[けいしょう]

この構文クラスは、構文を示してはいません。この文字の構文を見つけるために、 標準構文テーブルをみるようにと書かれています。この構文規則に対する 指示子は、`@'です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.2.2 構文フラグ

構文テーブル中の文字に対するエントリには、 クラスのほかにもフラグを含めることができます。 六つのフラグを利用可能で、それらは、`1'`2'`3'`4'`b'`p'といった文字で表されます。

`p'を除くすべてのフラグは、複数文字からなるコメント区切りを表すため に使われます。数字のフラグは、文字クラスに関連づいた構文上の属性に加えて、 文字がコ メント・シーケンスにもなりうることを示します。フラグは、Cモードの `*'のような文字があるために、クラスからもほかのフラグからも独立です。 Cモードの`*'は、句読点文字であり、かつ、コメント開始シーケンス (`/*')の2番目の文字であり、かつ、コメント終了シーケンス (`*/')の最初の文字です。

文字cのためのフラグは:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.3 構文テーブル関数

この節では、構文テーブルを作成したり、アクセスしたり、変更するための 関数について述べます。

Function: make-syntax-table

この関数は、新しい構文テーブルを作成します。文字コード0から31までと128 から255までは、標準の構文テーブルを継承して作られます。ほかの文字コード については、標準の構文テーブルを複写して作成されます。

ほとんどの主モードの構文テーブルはこのようにして作成されます。

Function: copy-syntax-table &optional table

この関数は、tableのコピーを作り、それを返します。tableが与えられ なかった場合(もしくは、nilだった場合)、現在の構文テーブルのコピー を返します。tableが、構文テーブルでなかった場合、エラーが通知されます。

Command: modify-syntax-entry char syntax-descriptor &optional table

この関数は、syntax-descriptorcharの構文エントリを 設定します。構文はtable(デフォルトは現在のバッファの構文テーブル)に ついてのみ変更され、ほかの構文テーブルは、変更されません。 引数syntax-descriptorで、望む構文を指定します。これは、クラス指示子 で始まる文字列で、オプションとして対応文字やフラグも含んでいます。 See section 構文記述子

この関数は常に、nilを返します。この文字のテーブル中の古い構文情報は 捨てられます。

構文記述子の最初の文字が、12のクラス指示子の一つでなかった場合、エラーが 通知されます。charが、文字でない場合もまた、エラーが通知されます。

 
例:

;; スペース文字をクラス空白に入れる。
(modify-syntax-entry ?\  " ")
     ⇒ nil

;; `$'`^'が対応する
;;   閉じ括弧となる、開き括弧文字とする。
(modify-syntax-entry ?$ "(^")
     ⇒ nil

;; `^'`$'が対応する
;;   開き括弧となる、閉じ括弧文字とする。
(modify-syntax-entry ?^ ")$")
     ⇒ nil

;; `/'を句読点文字とする。
;;   コメント開始シーケンスの第1文字で、
;;   コメント終了シーケンスの第2文字である。
;;   Cモードで使われる。
(modify-syntax-entry ?/ ". 14")
     ⇒ nil
Function: char-syntax character

この関数は、ニモニック指示子で表されたcharacterの構文クラスを返します。 この関数は、クラスだけを返します。対応括弧やフラグは返しません。

charが、文字でなければ、エラーが通知されます。

以下の例は、Cモードに当てはまります。最初の例は、スペースの構文クラスが 空白(スペースで表される)であることを示します。2番目の例は、`/'の 構文が句読点であることを示します。これは、コメント開始と終了のシーケ ンスでもあるということは、示していません。3番目の例は、開き括弧は、開き 括弧のクラスに属していることを示しています。対応文字が`)'であ ることは示していません。

 
(char-to-string (char-syntax ?\ ))
     ⇒ " "

(char-to-string (char-syntax ?/))
     ⇒ "."

(char-to-string (char-syntax ?\())
     ⇒ "("
Function: set-syntax-table table

この関数は、カレント・バッファの構文テーブルをtableにします。 tableを返します。

Function: syntax-table

この関数は、現在の構文テーブル、つまりカレント・バッファで使われている 構文テーブルを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.4 移動と構文

この節では、ある構文クラスの文字をまたがって移動する関数について述べます。 Emacsのバージョン18以前には、これらの関数は存在しません。

Function: skip-syntax-forward syntaxes &optional limit

この関数は、syntaxesで記述されている構文クラスをもつ文字をまたがって、 ポイントを前方に移動します。 バッファの終端や、(指定されていれば)limitの位置、 飛ばすことになっていない文字にきたとき、止まります。 戻り値は、移動の距離で、非負整数です。

Function: skip-syntax-backward syntaxes &optional limit

この関数は、syntaxesに記述されている構文クラスをもつ文字をまたがって、 ポイントを後方に移動します。 バッファの終端や、(指定されていれば)limitの位置、飛ばすことになってい ない文字にきたとき、止まります。 戻り値は、移動の距離で、非正整数です。

Function: backward-prefix-chars

この関数は、式前置構文をもつ文字を越えて、ポイントを戻します。これは、 式前置構文クラスの文字と `p'フラグをもつ文字の両方を含みます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.5 釣り合った式の解析

ここに括弧が対で対応する、釣り合った式(S式(sexp)としても知られる)を 解析したりスキャンしたりする関数をいくつか挙げます。 構文テーブルは、文字の解釈を制御します。つまり、これらの関数は、 LispモードのときはLisp式向けに、Cモードのときは、Cの式向けに使用されます。 釣り合った式にまたがって移動する、便利で高機能の関数については、 See section 釣り合った式をまたがる移動

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

この関数は、startから始まるカレント・バッファのS式を解析します。 limit以降はスキャンしません。位置limitまたは いかに示すある種の基準を満たしたとき、解析を止め、 解析が止まった場所にポイント を移します。解析が止まった場所で、解析の状態を表す値を返します。

statenilの場合、startは、関数定義の始まりのような、 括弧をつかった構造の先頭であると仮定されます。一方、構造体の中間で 解析を再開したい場合もあるでしょう。このためには、解析状態の初期値を 記述したstate引数を与えなければなりません。

3番目の引数target-depthが、非nilの場合、括弧の深さが target-depthと等しくなると、解析を止めます。深さは、0もしくは、 stateに与えられた数で始まります。

4番目の引数stop-beforeが、非nilの場合、S式を始める 文字が現れたとき解析が止まります。stop-commentが非nilの 場合、コメントの開始にきたとき、解析は止まります。

5番目の引数stateは、以下に述べるこの関数の値と同じ形式の八つの 要素からなるリストです。1回の呼出しの戻り値は、parse-partial-sexp に対する次の呼出し時の解析の状態を初期化するために使うことができます。

結果は、解析の最終的な状態を表す八つの要素からなるリストとなります:

  1. 0から数えた括弧の深さ。
  2. 停止点を含んでいる、最も内側の括弧のグループが開始した文字位置です。 なければ、nil
  3. 完全な終了した直前の部分式が開始する文字位置。 なければ、nil
  4. 文字列内であれば、非nil。より正確には、これは、 文字列を終了させる文字です。
  5. コメント(いずれの形式でも)の内であれば、t
  6. quote文字の直後であれば、t
  7. このスキャンの間にみつけられた最小の括弧の深さ。
  8. "b"形式のコメント内であれば、t

引数state内の要素0、3、4、5、7は重要です。

この関数は、入れ子になった括弧を使う言語の字下げを計算するために最もよ く使われます。

Function: scan-lists from count depth

この関数は、文字位置fromからcount回釣り合った括弧のグループを スキャンします。スキャンが終わったところで、その文字の位置を返します。

depthが非ゼロならば、括弧の深さはこの値から数えます。 止まるためのただ一つの候補は、括弧の深さがゼロになる場所です。 scan-listsは、そういう場所をcount回数えて、止まります。 それゆえ、depthの正の値は、depth段の括弧を抜け出ることを 意味します。

parse-sexp-ignore-commentsが、非nilの場合、スキャンはコメ ントを無視します。

スキャンがバッファ(もしくは、そのアクセス可能部分)の先頭、末尾に達した場合で、 深さがゼロではない場合、エラーが通知されます。深さがゼロなのに、 countを使い切ってない場合、nilが返ります。

Function: scan-sexps from count

この関数は、文字位置fromから、count回S式をスキャンします。 スキャンが止まった文字位置を返します。

parse-sexp-ignore-commentsが、非nilならば、コメントは 無視されます。

スキャンが、括弧のグループの途中で、バッファの(アクセス可能な部分の) 先頭や末尾に達したら、エラーが通知されます。countを使い切る前に、 先頭や末尾に達したら、nilが返されます。

Variable: parse-sexp-ignore-comments

値が非nilであれば、この節の関数やforward-sexpによって コメントは、空白として扱われます。

古いEmacsのバージョンでは、コメント終了が`*/'のよう なものであり、コメントを終らせるときにだけ現れるという場合にかぎり、 使えた機能でした。改行がコメントを終わらせる言語では、全ての改行が コメントの終わりではないため、この変数をnilにする必要がありました。 この制限は、もうなくなりました。

一つあるいは、複数のコメントを越えて前方あるいは後方に移動するために、 forward-commentを利用することができます。

Function: forward-comment count

この関数は、count個のコメントをまたがって、ポイントを前方に移動します (countが負の場合は、後方)。コメントか空白以外のものを みつけたら止まり、止まった場所にポイントを置きます。count分進めた 場合も止まります。

ポイント以後、全てのコメントと空白を越えて前方に移動するには、 (forward-comment (buffer-size))を使ってください。 引数には(buffer-size)が使えます。 バッファ内のコメント数がこの値を越えることは、あり得ないからです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.6 標準の構文テーブル

Emacsのほとんどの主モードは、おのおの独自の構文テーブルを備えています。 ここでは、それらをいくつか紹介します。

Function: standard-syntax-table

この関数は、標準の構文テーブルを返します。それは、Fundamentalモードで 使われる構文テーブルです。

Variable: text-mode-syntax-table

この変数の値は、Textモードで使われる構文テーブルです。

Variable: c-mode-syntax-table

この変数の値は、Cモード・バッファのための構文テーブルです。

Variable: emacs-lisp-mode-syntax-table

この変数の値は、Emacs Lispモードで編集コマンドによって使われる 構文テーブルです(Lisp readでは、影響ありません)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.7 構文テーブルの内部

構文テーブルの各要素は、1文字の構文をコード化した整数です。 内容は、構文クラス、対応文字候補、フラグです。 Lispプログラムは、その要素で直接働くわけではありません。 Lispレベルの構文テーブル関数は、普通は構文記述子 (see section 構文記述子)によって機能します。

構文テーブルの各要素の下位8ビットは、構文クラスを示しています。

整数

クラス

0

空白

1

句読点

2

3

シンボル

4

開き括弧

5

閉じ括弧

6

式前置

7

文字列quote

8

対の区切り

9

エスケープ

10

文字quote

11

コメント開始

12

コメント終了

13

継承

次の8ビットは対応する逆括弧(その文字が括弧構文をもつなら)です。 違う場合、意味を持ちません。 その次の6ビットは、フラグです。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.