CMTDEFS(5)

名前
cmtdefs - cmt の言語定義データベース

形式
/usr/local/lib/cmtdefs

国際機能
cmtdefs では EUC 主コードセットおよび補助コードセットの文字を使用できます。正規表現による パターン検索は，バイト単位ではなく文字単位に行われます。

正規表現のパターン・マッチングでは，特殊文字は主コードセット（コードセッ ト 0）に含まれるものでなければなりません。大かっこ‘[]’で囲んだ文字列内 で‘-’を使ってコード範囲を指定する場合には，範囲の始点と終点の文字は同 じコードセットに属さなければなりません。

oc フラグを立てたとき，主コードセットの大文字・小文字（半角英字）のみが 等価として扱われます。

機能説明

cmtdefs には cmt(1) 用のすべての言語定義が含まれています。このデータベースは termcap(5) に酷似していて，1 つの言語に対する定義を 1 つの項目にまとめます。各項目 は 1 行で完結します。ただし，行末に‘\’を置くことによって次行に継続さ せ，1 つの項目を複数行にわたって入力することができます。‘#’で始まる行 は注釈として無視されます。

それぞれの言語に関する項目は，‘:’で区切られた複数の欄から構成されま す。最初の欄には一般的な言語名を記述します。この言語名は -v オプションで出力される以外には意味を持ちません。‘:’・‘\’と改行以外 の任意の文字を使うことができます。

第 2 欄以降には各要素の定義が続きます。それぞれの要素は 2 文字のコードで 示され，ブール型と文字列型の 2 つの型があります。文字列型の要素では 2 文 字のコードのあとに文字‘=’と文字列（あとに続く‘:’で終わる）を指定しま す。

欄を注釈にする場合，その欄（‘:’のあと）の最初の文字として‘.’（ピリオ ド）を挿入します。

  要素

下記の表は，それぞれの要素の名前と説明を示します。

名前	型
    説明
nm	文字列
    言語名（-l オプションで使用）の正規表現
fn	文字列
    ファイル名の正規表現
cb	文字列
    注釈の始まりの正規表現
ce	文字列
    注釈の終わりの正規表現
ab	文字列
    第 2 注釈（alternative comment）の始まりの正規表現
ae	文字列
    第 2 注釈の終わりの正規表現
sb	文字列
    文字列の始まりの正規表現
sn	文字列
    文字列中で文字列を終わらせない文字列の正規表現
se	文字列
    文字列の終わりの正規表現
hb	文字列
    文字定数の始まりの正規表現
hn	文字列
    文字定数中で文字定数を終わらせない文字列の正規表現
he	文字列
    文字定数の終わりの正規表現
nc	文字列
    数値定数の正規表現
pb	文字列
    前処理文の始まりの正規表現
pn	文字列
    前処理文中で前処理文を終わらせない文字列の正規表現
pe	文字列
    前処理文の終わりの正規表現
id	文字列
    識別子（identifier）の正規表現
kw	文字列
    空白により区切って並べた，予約語リスト
pw	文字列
    空白により区切って並べた，前処理文中での予約語リスト
oc	ブール
    存在する場合，大文字と小文字が等価であることを意味する
al	ブール
    存在する場合，すべての識別子を予約語として扱うことを意味する

予約語リストをのぞくすべての文字列は，正規表現で表されます。（正規表現の 項を参照）

正規表現のマッチングは表の順番に行われ，先に一致したものが有効になりま す。

cmt(1) では，注釈と第 2 注釈に下線が付き，また，識別子として認識されかつ予約語 リストに見出された文字列が太字になります。al フラグが立っているときは識 別子として認識された文字列すべてが太字になります。

cb・ce のグループと ab・ae のグループ，sb・sn・se のグループと hb・hn・ he のグループは，それぞれマッチングの優先度が異なるほかは同じ機能を持ち ます。

前処理文は C 言語のプリプロセッサー文のように異なった構文を持つ文を処理 するのに使います。前処理文のなかでは kw とは別の予約語リスト pw が使われ ます。

oc は，nm と fn に対しては有効でありません。

予約語リストは，言語の予約語を空白で区切って並べたものです。

nm と fn のマッチングは cmtdefs 内で項目が並んでいる順番に行われます。

正規表現
cmtdefs では， egrep(1) に類似した正規表現を使用します。文字‘:’‘.’‘^’‘$’‘[’‘(’‘)’ ‘|’‘*’‘+’‘?’‘\’は特殊文字であるため，これらを普通の文字として 含めたい場合には，直前に‘\’を付けなければなりません。特に‘:’を表す には，8 進表現を用いて \072 のようにしないと，欄の区切りとして解釈され てしまいます。

  原始正規表現

c   文字 c そのものに一致します。

\c  バックスラッシュに任意の文字が続く場合は文字 c そのものに一致します。ただし，以下に挙げるものは特殊な意味を持ちます。

    \t  タブ文字
    \s  空白文字（半角スペース）
    \b  後退文字
    \v  垂直タブ文字
    \f  用紙送り文字
    \r  復帰文字
    \ooo
        3 けたの 8 進数 ooo で表した文字

.   改行をのぞくすべての文字に一致します。

^   行頭に一致します。

$   行末に一致します。

[string]
    大かっこで囲んだ文字列は，文字の集合を表し，文字列のいずれかの文字と一致 します。ただし，文字列の最初の文字が‘^’の場合，この正規表現は，文字列 にない改行文字以外の文字と一致します。これ以外の位置にある‘^’は，普通 の文字として解釈されます。マイナス符号‘-’を使用して，連続する文字の範 囲を示すことができます。たとえば範囲 [0-9] は文字列 [0123456789] と同じ です。‘-’と‘]’は，文字列の先頭（または先頭の‘^’の直後）にある場合 は普通の文字として解釈されます。たとえば，[]a-f] は‘]’または文字‘a’ 〜‘f’と一致します。この string 内では，‘:’・‘\’・文字列の先頭以外の‘-’と‘]’・文字列の先頭の ‘^’が特殊文字となり，それ以外の文字は普通の文字として解釈されます。特 殊文字は，バックスラッシュを付けるか 8 進表現を用いることでことで通常の 文字として表現できます。

(expression)
    かっこ‘()’で囲った正規表現はそのものに一致します。演算子の優先度を変え る場合に用います。

  演算子

|   代替。2 つの正規表現を‘|’で区切った場合は，いずれかの正規表現に一致す るものと一致します（左側優先）。

*   原始正規表現とそれに続く‘*’は，0 個以上のその原始正規表現と一致しま す。一致する対象が複数個ある場合は，できるだけ左端に近い最長の正規表現と 一致します。

+   原始正規表現とそれに続く‘+’は，1 個以上のその原始正規表現と一致しま す。一致する対象が複数個ある場合は，できるだけ左端に近い最長の正規表現と 一致します。

?   原始正規表現とそれに続く‘?’は，0 個または 1 個のその原始正規表現と一致 します。一致する対象が複数個ある場合は，できるだけ左端に近い最長の正規表 現と一致します。

  連結
連結は暗黙的な演算子で，正規表現を連結したものは，テキスト文字列を連結し たものと一致し，それぞれが検索パターンの連続する正規表現と一致します。

  優先順位
優先順位は高いほうから，

    くり返し（‘*’・‘+’・‘?’）
    連結
    代替（‘|’）

の順になります。

使用例
言語定義の典型として C 言語を表す項目を示します。

    C:\
    	:nm=c|C:\
    	:fn=.*\.[ch](\.(BAK|bak|~[0-9]+~)|~)?:\
    	:cb=/\*:ce=\*/:\
    	:sb=":se="|$:sn=\\(.|$):\
    	:hb=':he='|$:hn=\\(.|$):\
    	:pb=^#:pe=$:pn=\\(.|$)|<.*>:\
    	:nc=(0x[0-9a-fA-F]+|([0-9]+(\.[0-9]*)?|\.[0-9]+)\
    ([eE][-+]?[0-9]+)?)[fluFLU]*:\
    	:id=[a-zA-Z_][a-zA-Z0-9_]*:\
    	:kw=asm auto break case char const continue\
    	default do double else enum extern float for\
    	fortran goto if int long register return short\
    	signed sizeof static struct switch typedef union\
    	unsigned void volatile while:\
    	:pw=define defined elif else endif error if ifdef\
    	ifndef include line pragma undef:

sn は，文字列中に \" があっても誤って文字列の終わりとして認識しないよう にするためのものです。

pw を利用してプリプロセッサー行では異なった予約語リストを使うようにして います。

ファイル
/usr/local/lib/cmtdefs    言語定義データベース

関連項目
cmt(1)