BRIT テキスト記述変換

書法

BRIT [filename]* [option]*

SHELLMODE

@記述、!記述、^記述

詳細

入力ファイルのテキスト記述言語に基づいてテキストを展開する。
複数のファイルを指定するとそれらを順次処理し、連結して出力する。 展開処理は入力ファイル毎に行う。 ファイル名を省略すると標準入力を処理する。
BRIT.EXE は簡易な書式制御を備えているが、主な用途はテキスト展開である。

入力するソースファイルや、出力ファイル、また、スクリプト内でのファイルアクセスにはパスの配慮が必要である。

  1. カレントパスの管理

    コマンドラインに書かれたソースファイル(トップレベルのソース)の処理を開始したときに、カレントパスを設定する機能が用意されている。
    特に指定しない限り、これは、プログラムの起動時のカレントパスである。
    -Pオプションを指定すると、トップレベルのソースのパスが開始時のパスになる。また、-Pdirnameで特定のディレクトリを指定できる。
    通常は、-Pオプションを指定しておけば、ソース内でのファイルの相対記述が簡単になる。

  2. インクルードパスの管理

    特に指定しない限り、インクルードは現在のカレントパスを基に行われる。このため、現在のパスと、トップレベルのソースのパスが一致していれば、インクルードファイルは現在のファイルを基点にして記述できる。
    -Iオプションを指定すると、インクルードの基点がトップレベルのソースのパスとなる。 このときは、現在のカレントパスに関係無く、トップレベルのソースに相対的にパスを記述できる。スクリプト内でパス操作などをしても、この方法ならば影響がない。
    -Idirnameオプションで、インクルードの基点を直接指定できる。 トップレベルのソースと別のディレクトリに一括してインクルード先のファイルが存在するならば、この方法も有効である。

  3. 出力パスの管理

    .OUTNAMEコマンドで出力ファイルをソース内を指定する場合のパスは、通常はカレントディレクトリ相対に行われる。
    出力先の基準パスは-O:dirnameオプションで指定することも出来る。 出力先のディレクトリがソースと別にある場合はこの方法を取ると良い。

それぞれの基準パスやディレクトリ名は相対記述も可能だが、混乱を避けるため、基準パスは絶対パスで記述するべきである。

いくつかの情報は、環境変数にセットされるので、スクリプトで参照できる。

BRITトップレベルのソースファイルのあるパス
BRIT_NAMEトップレベルのソースファイル名
BRIT_INC指定したインクルードの基準パス
BRIT_OUT指定した出力基準パス
BRIT_FBLK最後の.FBLKで指定したファイル名
BRIT_ARG-Aで与えた引数文字列

また、入力テキスト内に何種類かのスクリプトなどを埋めこんで実行することが出来る。 現在サポートしているのは次の4種類である。

  1. コマンドライン.EXEC
  2. TSスクリプト.TS
  3. QSスクリプト.QS
  4. TFCALCスクリプト (.CALC_DEF.CALC.CALC_TAB.CALC_GEN

記述法

処理は、基本的に行毎に行う。
行は、大きく、コマンド行、テキスト行に分けられる。

コマンド行は先頭に一つの.が有る行であり、 テキスト行は先頭に.がない行と、先頭に二つ以上の.がある行である。 テキスト行の先頭の...に置き換えられる。 特殊なコマンド行とコマンド行に挟まれた間の行は先頭に.が無くても、 コマンド行の内容と解釈されるものが有る。

テキスト行

テキスト行は、空の空行と、それ以外に分けることが出来る。

通常行

行の内容をそのまま出力する。
通常は、行末で改行を行わない。従って複数の行を連結して一行として出力する。 後述の .BRコマンドで、行末の改行を行うように指定できる。

空行

空行は、改行を出力する。
後述の .BLNKコマンドで、空行を無視するように指定できる。

スイッチ

テキスト行の取扱は以下のスイッチのオンオフ状態で決められる。

BR ON空行ではないテキスト行末で改行を出力。
OFF空行ではないテキスト行末で改行をしない。デフォルト。
BLNK ON空行では改行を出力。デフォルト。
OFF空行では何もしない。
HEAD ONテキスト行の行頭の空白を削除する。
OFF行頭の空白を削除しない。デフォルト。
TAIL ONテキスト行の行末の空白を削除。
OFF行末の空白を削除しない。デフォルト。
NORMAL ON不正コードや、TAB以外の制御コードを排除。デフォルト。
OFF排除しない。
VOID ON出力しない。コマンド自体は実行する。
OFF出力する。デフォルト。
INCLUDE ON.INCLUDE機能は有効。デフォルト。
OFF.INCLUDE機能は無効。何もしない。
USER ON.USER機能は有効。デフォルト。
OFF.USER機能は無効。何もしない。
EXPAND ONコマンドライン・パラメータ展開は有効。デフォルト。
OFFコマンドライン・パラメータ展開は無効。
ESC ON通常行の引数置換は有効。置換は行毎に行う。
OFF通常行の引数置換は無効。デフォルト

コマンド行

いくつかのフラグスイッチを操作したり、改行を行ったり、あるいは、埋めこみ言語の記述や実行のために用いる。
コマンド名の大文字小文字は区別しない。

注釈
.REM
一行注釈。
.COMMENT
注釈ブロックの開始。
.COMMENT_ENDコマンドまでのソースをコメントにする。
注釈ブロックの内部では.INCLUDE.USERは機能しない。注釈ブロックのネスティングは可能。
.COMMENT_END
注釈ブロックの終了。
テキスト記述
.
行頭にピリオド一つを書くと、ピリオドの出力となる。改行は行わない。
.SP []
.SPを単独で書くと、スペースを一つだけ出力する。
数を指定すると、その数だけスペースを出力する。
.STR [ 文字列 ]*
文字列を出力する。
文字列一つ毎に、BRスイッチに従って改行を行う。文字列はコマンドライン文法に従い、!記述、^記述、@記述、#記述が可能。
テキスト詰め合わせ指定
.L []
インデントを左へ一つ戻す。実際に効果が現れるのは改行の直後の有効な文字出力からである。
数を指定するとインデント段数の指定となる。通常は0を指定する。(インデントのクリア)
.R []
インデントを右へ進める。実際に効果が現れるのは改行の直後の有効な文字出力からである。数を指定するとインデント段数の指定となる。通常は0を指定する。(インデントのクリア)
.I []
.Iを単独で書くと、インデントはTABで行う。
数を指定すると、その数だけのスペースがインデント幅となる。数が0の場合はTAB。
.SEP [ 文字列 ]
行の詰め合わせの際に挟むセパレータを文字列で指定する。.SEPを単独で書くと、セパレータを省略。
通常は、使用する必要は無い。
文字列はコマンドライン文法に従い、!記述、^記述、@記述が可能。
スイッチ
.BR [ スイッチ | 改行数 ]
.BRを単独で書くと、改行を出力する。
改行数を指定すると、その数だけ改行を出力する。スイッチを指定すると、BRスイッチを操作する。
.BLNK スイッチ
BLNKスイッチを操作する。
.HEAD スイッチ
HEADスイッチを操作する。
.TAIL スイッチ
TAILスイッチを操作する。
.NORMAL スイッチ
NORMALスイッチを操作する。
.VOID スイッチ
VOIDスイッチを操作する。
.INCLUDE_SW スイッチ
INCLUDEスイッチを操作する。
.USER_SW スイッチ
USERスイッチを操作する。
.EXPAND スイッチ
EXPANDスイッチを操作する。
.ESC スイッチ
ESCスイッチを操作する。
.PUSH
全てのスイッチの値をスタックする。
スタックは各スイッチ毎に設けられていて、このコマンドは、それらのスタックを操作するだけである。スタックの矛盾を避けるために、.PUSHコマンドには、.POPコマンドを対応させ、コマンドのPUSHオプションにはPOPオプションを対応させるべきである。
.POP
全てのスイッチの値をスタックから回復する。
インクルード
.INCLUDE ファイル名
指定のファイルを現在位置に指しこむ。
Cでいうプリプロセッサで処理されるコマンドである。
このコマンドは他のコマンドと異なり、ブロック中でも有効。例えば、.BEGINコマンドブロックの中でも動作する。
INCLUDEスイッチがオフになっていると、テキストとしては何もせず、ブロック中では、この文字列がそのまま現れる。ネスティングは40段程度可能である。
ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
マクロ
.USER_DEF マクロ名
ユーザーマクロを定義する。
.USER_END行までがマクロの内容。マクロ名は英字で始まる半角英数字。大文字小文字を区別しない。同一名称のマクロは定義できない。
ここでマクロはそのまま文字列として記憶する。
マクロの中で、直接、.USER_DEFを書くことはできない。
また、.INCLUDE.USERをマクロに書くと、定義時にこれを展開してからマクロに記憶する。定義時の展開を防ぐためには、INCLUDEスイッチや、USERスイッチをオフにしておけば良い。これで、これらのコマンドがマクロテキストの中に含まれ、実行時に展開出来るようになる。
.USER_END
ユーザーマクロを定義の終了。
.USER [ *|*シフト数|**シフト数 | 繰り返し数 ] [=]マクロ名 [ 引数 ]*
マクロを展開する。
このコマンドはプリプロセッサ的に動作する。他のコマンドと異なり、常に有効である。
マクロ名の前に書くオプション指定によって動作が異なる。
無し一度だけ展開する。
*引数の数だけマクロを繰り返す。このとき、引数は、繰り返し毎に前の方へ移動する。マクロ内の文字列%1;に順番に現れることになる。引数が省略された場合はマクロを展開しない。
*シフト数*とシフト数の間は開けてはいけない。シフト数の数だけ引数を組にしてマクロを繰り返す。繰り返しの数は、引数の数/シフト数となる。このとき、引数は、繰り返し毎にシフト数の分だけ、前の方へ移動する。例えば、シフト数が2の場合ならば、マクロ内の文字列%1;%2;に順番に現れることになる。引数の数がシフト数より小さい場合はマクロを展開しない。
**シフト数**とシフト数の間は開けてはいけない。*シフト数と同様だが、半端な引数の分も実行する。
繰り返し数指定の回数だけ繰り返す。繰り返し数が0の場合はマクロ展開しない。

マクロの記述は、ARGREP 文字列引数置換の記述に従う。
マクロ名の前に=をつけると引数置換の動作が変わる。このとき、=とマクロ名の間を空けてはいけない。
  1. マクロ名の前に「=」が無いとき(デフォルト)
    変数置換は行単位で逐次的に行う。このため、文字列置換中の範囲は行単位となる。
    この方法の長所は、展開中の操作の順序が出力の現れる順になること。
    短所は、複数行に渡る置換要素を書くことが出来ないこと。
  2. マクロ名の前に「=」があるとき
    変数置換は、マクロ全体に対してまとめて行う。このため置換中の範囲はマクロ全体となる。
    この方法の長所は、複数行に渡る置換要素を書けること。短所は、展開がマクロの登場時に行われ、マクロの中にかかれたマクロの展開がその後となるため、操作の順序が直感的でないことである。
    機能番号argrep記法tsexpr関数tsexpr変数名説明
    n%n;@nなどn は引数番号(1〜)。引数。
    0%0;&0??ix繰り返しの序数(1 から増えていく)
    -1%-1;&(-1)??argc引数の個数(繰り返しに従って減っていく)
    -2%-2;&(-2)??loopc全体の繰り返し数
    -3%-3;&(-3)??shiftc引数のシフト数

USERスイッチがオフになっていると、テキスト中では何もせず、ブロック中ではこのまま文字列として現れる。
マクロ名、引数はコマンドライン文法に従い、!記述、^記述、@記述、#記述が可能。
.U [ *|*シフト数|**シフト数 | 繰り返し数 ] [=]マクロ名 [ 引数 ]*
.USERと同じ。略記形式。
出力先制御
.OUTNAME ファイル名
メイン出力ファイル名の指定。
-Oオプションをファイル名無しで指定したときに有効となる。すべての有効な出力に先だってかかれなければならない。
複数記述した場合はその時点で現在のメイン出力ファイルを閉じ、新たなファイルを作成する。
出力はメインに切り替わる。-Oの特殊な記述で、ここのファイル名の先頭をパスで修飾できる。
ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
.AUXOPEN チャンネル ファイル名
補助出力ファイルのオープン。
チャンネルは1-16の番号で指定する。指定したファイルを作成し、ファイルを指定のチャンネルに結び付ける。
出力は、指定したチャンネルに切り替わる。
使用中のチャンネルであれば、ファイルを閉じ、新たな指定のファイルに切り替える。
チャンネル、ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
.AUXCLOSE チャンネル
チャンネルを閉じる。
チャンネルは1-16の番号で指定するチャンネルのファイルを閉じ、チャンネルを開放する。出力は、標準に切り替わる。
チャンネルはコマンドライン文法に従い、!記述、^記述、@記述が可能。
.OUTSEL [チャンネル]
出力をきりかえる。
チャンネルは1-16の番号で指定するチャンネルを指定しなければ、標準の出力。ファイルが割り当てられていないチャンネルを指定するとエラー。ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
簡易式演算
.EXPR 式 [ 引数 ]*
TSEXPRとして式を計算し、結果を出力する。
名称番号関数変数説明
引数n@n指定番号の引数
引数の数??argc引数の数
  1. BRスイッチにしたがって改行を行う。
  2. コマンドライン文法に従い、!記述、^記述、@記述が可能。
.NEXPR 式 [ 引数 ]*
TSEXPRとして式を計算する。出力しない
名称番号関数変数説明
引数n@n指定番号の引数
引数の数??argc引数の数
  1. コマンドライン文法に従い、!記述、^記述、@記述が可能。
.XBLK 式 [ 引数 ]*
TSEXPRとして式を計算し出力する。
.END までのソースを読み取り式で引用できるようにする。
名称番号関数変数説明
引数n@n指定番号の引数
ブロック0??source.ENDまでのソースの内容
引数の数??argc引数の数
  1. BRスイッチにしたがって改行を行う。
  2. コマンドライン文法に従い、!記述、^記述、@記述が可能。
.NXBLK 式 [ 引数 ]*
TSEXPRとして式を評価する。出力しない。
.END までのソースを読み取り式で引用できるようにする。
名称番号関数変数説明
引数n@n指定番号の引数
ブロック0??source.ENDまでのソースの内容
引数の数??argc引数の数
  1. コマンドライン文法に従い、!記述、^記述、@記述が可能。
.VAR 変数名 式 [ 引数 ]*
環境変数にTSEXPRとして計算した式の値を代入する。
.FXPR 式 [ 引数 ]*
TSFXPRとして式を計算し、結果を出力する。
FXPRは使われなくなった。EXPR で完全に代替できるので、EXPR を使うべきである。
  1. 引数以降はsys関数・m関数の1以降に対応する。
  2. BRスイッチにしたがって改行を行う。
  3. コマンドライン文法に従い、!記述、^記述、@記述が可能。
コマンドライン実行
.EXEC コマンドライン
コマンドライン処理の標準出力を受け取って、出力する。行末に改行がある場合は、BRスイッチに従って改行を行う。
.EXECBLK コマンドライン
.ENDまでを標準入力にリダイレクトして、コマンドラインを実行。その標準出力を受け取って、出力する。行末に改行がある場合は、BRスイッチに従って改行を行う。
ブロックの終了は.EXECBLK_ENDも有効だが、これは過去のバージョンとの互換性を保つために残してある。
.EXECBLK_END
ブロックの終了を宣言する。古い書き方。.ENDを使用すべきである。
TSスクリプト実行
.TS
TSスクリプト実行。
.ENDコマンドまでのソースをTSスクリプトとして実行する。スクリプト全体の標準入出力にはnullが割り当てられているので、これを取り出すことは出来ない。中間ファイルを明示して取り出すこと。
QSスクリプト実行
.QS
QSスクリプト実行。
.ENDコマンドまでのソースをQSスクリプトとして実行する。スクリプト全体の標準入出力にはnullが割り当てられているので、これを取り出すことは出来ない。中間ファイルを明示して取り出すこと。
TFCALCスクリプト実行
.CALC_DEF [スクリプト名]
TFCALCスクリプトの記述。
.ENDコマンドまでのソースをTFCALCスクリプトとしてコンパイルする。
スクリプト名を省略すると無名スクリプト。無名スクリプトは、再定義可能で、ソースファイル内で最新のものを一つだけ保持する。
名称付スクリプトは再定義できない。!記述、^記述、@記述が可能。
.CALC_SEP [出力区切り]
TFCALCスクリプト実行時の出力区切り文字列を定義する。
出力区切りを書かなければ、tabを使用する。!記述、^記述、@記述が可能。
.CALC [ スクリプト名 [ :EXPAND] ]
TFCALCスクリプトの実行。
.ENDコマンドまでのソースをデータとして、TFCALCスクリプトを実行する。
スクリプト名を省略、あるいは、空文字列とすると無名スクリプト。スクリプト名以降は、!記述、^記述、@記述が可能。
一行が一件のレコードに相当し、入力フィールドはコマンドライン文法に従った方法で区切られる。第二パラメータに:EXPANDを指定すると、入力行中の!記述、^記述、@記述も可能なので注意。
通常の記述には、この形式が便利。
.CALC_TAB [ スクリプト名 ]
TFCALCスクリプトの実行。
.CALCコマンドと同様だが、入力フィールドの区切りとしてTABを用いる。タブファイルをインクルードする場合などにはこの形式が便利。!記述、^記述、@記述が可能。
.CALC_GEN [ 行数 [ スクリプト名] ]
TFCALCスクリプトの実行。
入力データ無しに行数分だけ実行する。行数を省略すると1行分だけ実行。出力フィールドの区切りは.CALCと同じ。
!記述、^記述、@記述が可能。
環境変数
.ENV [ 環境変数名 ]*
環境変数の内容を出力する。複数記述すると連結して出力。コマンドライン文法に従い、!記述、^記述、@記述が可能。
.ENVSET 環境変数名 []
環境変数に値をセットする。値を省略すると環境変数をクリアする。コマンドライン文法に従い、!記述、^記述、@記述が可能。
.PBLK 環境変数名
環境変数に複数行セット。
.ENDコマンドまでのソースを環境変数に書き込む。
各行は行末に改行コード (LF 0x0a) が付加されている。ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
ブロック出力
.FBLK ファイル名
ブロック出力。
.FBLK_ENDコマンドまでのソースをファイルに出力する。中間ファイルを作成したり、サブスクリプトを作成するのに便利。
ここで指定したファイル名は、環境変数BRIT_FBLKに記憶される。ファイル名はコマンドライン文法に従い、!記述、^記述、@記述が可能。
.FBLK_END
ブロック出力の終了。
条件制御
.IFPAR [ パラメータ ]
パラメータが存在して、空文字列でなければ、真となる。
複雑な使用を避けること
.IFPAR ...
成立テキスト
.ELSE
不成立テキスト
.ENDIF
または、
.IFPAR ...
成立テキスト
.ENDIF
コマンドライン文法に従い、!記述、^記述、@記述が可能。
.IF tsexpr
式を評価。式の戻り値は論理値でなければならない
複雑な使用を避けること
.IF ...
成立テキスト
.ELSE
不成立テキスト
.ENDIF
または、
.IF ...
成立テキスト
.ENDIF
.ELSE
IF節の記述に使用。
.ENDIF
IF節の記述に使用。

スイッチの記述法は以下の通り。

コマンド{ON |OFF |PUSH [ ON | OFF ] | POP }

ON値をONにする。
OFF値をOFFにする。
EXPR(tsexpr)論理式の値に従う
PUSH値をスタックに退避する。
PUSH ON値をスタックに退避し、値をONにする。
PUSH OFF値をスタックに退避し、値をOFFにする。
PUSH EXPR(tsexpr)値をスタックに退避し、論理式の値にする。
POP値をスタックから回復する。

出力の取扱

メイン出力の他に、チャンネル出力が16用意されている。通常はもっぱらメイン出力を使う。メイン出力と、チャンネル出力はファイルを開いたまま切替えて使用できる。
  1. .OUTSELでメイン出力とチャンネル出力を切り返る。ここで出力先を切替えても、ファイル自体は閉じない。
  2. メイン出力は、あらかじめ外部から割り当てられているか、あるいは、.OUTNAMEで指定する。
  3. チャンネル出力は、.AUXOPEN.AUXCLOSEで割り当て、切り離しを行う。
  4. .AUXOPENは、特にパス管理を行わない。現在のカレントディレクトリを基準に考えれば良い。

コマンドライン記述の注意

いくつかのコマンドでは、コマンドラインパラメータによる記述が有効である。このとき、通常のコマンドラインと異なり、FXPRを使用できる。

TFCALCスクリプトの取扱

TFCALCスクリプトの注意事項は以下の通り
  1. 無名スクリプト
    無名スクリプトは再定義可能で、最後に定義したものが有効。
  2. 名前付スクリプト
    名前付スクリプトは再定義できない。名前は100文字程度に収めることを勧める。英字で始まり、英数字あるいはアンダスコアが続く形で書くべきである。大文字小文字の区別はしない。
  3. ENBALE関数出力フラグは各行実行以前に常にONになっている。
  4. INFO関数アプリケーションへのデータ通知のみ可能。
    番号は改行フラグを表わす。0ならば改行しない。それ以外ならば改行。
    出力データはそのまま、出力テキストに現れる。行処理中であれば、どこで書いても最初に出力する。行内の出力は後回しにする。
    .BRスイッチや、.VOIDの影響を受ける。インデント処理も行う。
  5. 行フィールドの引用.CALCブロックでは、行内をコマンドラインと同様の規則で区切ってフィールドにする。
    .CALC_TABブロックでは、行内をTABで区切ってフィールドにする。
    .CALC_GENでは、無効。

OPTION

-Astr
スクリプトに引数を与える。環境変数BRIT_ARGに値が入る。
-B
標準入力を扱わない。
-I
.INCLUDEの基準ディレクトリをトップレベルのソースのあるディレクトリにする。
-Idirname
.INCLUDEの基準ディレクトリを指定する。
-O
ソーステキスト中にある.OUTNAME行で指定したファイルに対して出力する。
-O:dirname
ソーステキスト中にある.OUTNAME行で指定したファイルに対して出力する。ファイル名の基準パスをdirnameにする。
-Ofilename
指定のファイルに出力を切り替える。
-P
トップレベルのソースファイルを開いた時にカレントディレクトリをそのソースファイルのあるディレクトリに切替える。標準入力ではこの機能は働かない。また、ネットワーク上のファイルに対しても無効。
-Pdirname
トップレベルのソースファイルを開いた時にカレントディレクトリを切替える。
-Renvname=value
実行に先だって指定の環境変数に値を代入する。

用例

参考

コマンドラインコマンドライン文法解説
TSスクリプトTSスクリプト文法解説
TFCALCスクリプトTFCALCスクリプト文法解説

バージョン

Ver 1.062013/05/02.. の記法改善
Ver 1.052012/06/06.xblk の不具合解消
.esc 導入
Ver 1.042012/04/25.expand 追加
Ver 1.032012/04/21.nxblk 追加
Ver 1.022012/04/10.xblk コマンド追加
Ver 1.012011/10/14.user #展開を許可
Ver 1.00初版