全般/構文解析
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#navi(全般)
#contents
/////////////////////////////////////////////////////////...
*構文解析のおおまかな順序 [#sdbf768f]
+環境変数の展開、引数の展開、if/for/( ) 等の構造を持った...
+for 制御変数の展開
+環境変数遅延展開の展開
+コマンド名、リダイレクトファイル名の確定とリダイレクト・...
+(コマンドの探索と実行)
ただし、パイプ構文の場合は、for 制御変数の展開や、環境変...
& && | || < > >> 等の文の構文解析、% による環境変数展開が...
/////////////////////////////////////////////////////////...
*構文解析 [#m8bf1483]
以下の解析が同時になされる。
**行末の ^ による継続行処理 [#c1b965a8]
行末がクォートされていない ^ である場合は次の行とつなげて...
**文の区切りの認識 [#b334b9a7]
1行に複数の文を書く場合がある。クォートされていない & && ...
見なしてその前後で、それぞれ構文解析を行う。
**括弧による複合文の認識 [#u30a3bf5]
改行や上記文区切り記号で区切られた複数の文を、クォートさ...
囲んで一つの文として扱う。プログラミング言語でよくある { ...
do/end などと同じ。~
括弧を開いたまま閉じる括弧がなくバッチスクリプトのファイ...
開く括弧以降が構文解析できないため全て捨てられる。
**if/for という構造を持った構文の解析 [#u62bb045]
文頭が if か for ならそれぞれの構文に従って解析を進める。
**リダイレクトの処理 [#ne4afac4]
クォートされていない < > >> があればその次のトークンをフ...
リダイレクト指定であるというマーキングを行う。実際のファ...
まだ先で環境変数遅延展開の後、コマンド実行の前である。~
[[全般/ファイルディスクリプタとリダイレクト]]も参照。
**2個連続した % の1個の % への置換 [#s0e0ca3e]
バッチスクリプトであれば連続した % は1つにして、環境変数...
**% による環境変数の展開 [#iabd15b7]
単独の % がありその後に % が出てくれば、環境変数展開と見...
:~ が途中にあれば部分文字列の修飾で、: = がこの順に途中に...
修飾である。
**単独の % の削除 [#ea9702e9]
対応する % が行内に無い単独の % を削除する。
**空白文字の無視 [#f119fd64]
構文解析時にいくつかの箇所で、クォートされていない = ; , ...
扱いを受ける。~
行頭、リダイレクト記号とファイル名の間、if 構文の比較の =...
for 構文。
**^ による特殊文字のクォート [#af966e05]
^ の次の特殊文字 ^ " < > & | ( ) = ; ,の特殊な意味を失わ...
また、リダイレクト記号の直前の1桁の数字も ^ によってクォ...
ファイルディスクリプタ番号としての意味を失う。
これら以外の文字が続く場合は ^ が削除される。
! はこの時点では特殊文字ではないので、^! と書いても遅延展...
**" による文字列のクォートと1トークン化 [#a46ff77b]
クォートされていない " が出てきたらそこから次の " または...
% 以外の全ての特殊文字が特殊な意味を失う。
途中に空白や、構文解析上空白と見なされる場合のある = ; , ...
トークンの区切りとはみなさず複合した1つのトークンとみなす...
複合したトークンとして扱われて意味があるのは、リダイレク...
if 構文の比較対象、for 構文の in ( ) の括弧の中。
*文頭の @ の認識 [#p099d19b]
クォートされていない @ が文頭にあれば、実行時に echo off ...
その文が表示されないという印をつける。
実際に表示するのは、for 制御変数の展開を行ってから、環境...
/////////////////////////////////////////////////////////...
*for 制御変数の展開 [#n733932f]
for 文の制御変数の展開は、前項の構文解析が終わってからな...
展開後に < > & | ( ) @ の特殊記号が出てきても、
前項の構文解析の結果は変更されない。~
for 文や if 文のトークンやオプションにも for 制御変数は使...
展開後に echo on で文頭に @ がなければ文が表示される。
この時、for 文や if 文の /オプション や if 文の比較演算子...
英大文字として表示される。
/////////////////////////////////////////////////////////...
*環境変数遅延展開の展開 [#jbf7c2b6]
遅延展開が有効でかつ ! が行内にあるとき、以下の処理が行わ...
! が無い行については何もなされない。
[[コマンド別/set]]の「set /a 特殊記号の演算子」も参照。
**^ による ^ ! のクォート [#j4da5af5]
% と違って文字として ! を残したい場合 !! と書くのは駄目で...
! を環境変数展開に使わず普通の文字として扱いたい場合は ^ ...
ただし、^ は構文解析時の特殊文字でもあるので、この時点で...
最初に ^^ と書いておくと構文解析時に1つの ^ になる。~
つまり単独の ! 文字が必要なら、^^! と書き、単独の ^ が必...
**! による環境変数の展開 [#gd37d352]
単独の ! がありその後に ! が出てくれば、環境変数展開と見...
:~ が途中にあれば部分文字列の修飾で、: = がこの順に途中に...
修飾である。
**クォートされなかった ! の削除 [#w856d6a5]
クォートされていない残った ! を削除する。
/////////////////////////////////////////////////////////...
*コマンド実行時の特殊記号の扱い [#c8b83115]
コマンド実行時には、構文解析時の各特殊記号にどのような意...
各コマンドの解釈次第である。
例:
dir や ren、del、call 等といった比較的単純な多くのビルト...
クォートされていない = ; , は空白と同じ扱いを受ける。~
しかし、echo や set、cd 等ではいずれも特別扱いはされない...
start 等では扱いが複雑なようだ。
例:
ファイル A から " を含む行を検索し、ファイル B に入れるこ...
findstr """ A >B
構文解析時には、3つ目の " から行末までは文字をクォートし...
はりダイレクトでなくそのままの文字列として扱われる。~
findstr コマンドは """ を1つの " として検索文字として扱い、
A と >B を検索対象のファイル名として扱う。~
つまり、A と >B は構文解析時は引用符の中、コマンド実行時...
その結果として、ファイルA中で " を含んだ行があればそれを...
FINDSTR: 開くことができません (>B)
というエラーになる。~
意図どおりの結果を得るには、リダイレクトが " " の中に入ら...
findstr >B """ A
findstr < A > B """
等と書けばよい。
/////////////////////////////////////////////////////////...
#navi(全般)
終了行:
#navi(全般)
#contents
/////////////////////////////////////////////////////////...
*構文解析のおおまかな順序 [#sdbf768f]
+環境変数の展開、引数の展開、if/for/( ) 等の構造を持った...
+for 制御変数の展開
+環境変数遅延展開の展開
+コマンド名、リダイレクトファイル名の確定とリダイレクト・...
+(コマンドの探索と実行)
ただし、パイプ構文の場合は、for 制御変数の展開や、環境変...
& && | || < > >> 等の文の構文解析、% による環境変数展開が...
/////////////////////////////////////////////////////////...
*構文解析 [#m8bf1483]
以下の解析が同時になされる。
**行末の ^ による継続行処理 [#c1b965a8]
行末がクォートされていない ^ である場合は次の行とつなげて...
**文の区切りの認識 [#b334b9a7]
1行に複数の文を書く場合がある。クォートされていない & && ...
見なしてその前後で、それぞれ構文解析を行う。
**括弧による複合文の認識 [#u30a3bf5]
改行や上記文区切り記号で区切られた複数の文を、クォートさ...
囲んで一つの文として扱う。プログラミング言語でよくある { ...
do/end などと同じ。~
括弧を開いたまま閉じる括弧がなくバッチスクリプトのファイ...
開く括弧以降が構文解析できないため全て捨てられる。
**if/for という構造を持った構文の解析 [#u62bb045]
文頭が if か for ならそれぞれの構文に従って解析を進める。
**リダイレクトの処理 [#ne4afac4]
クォートされていない < > >> があればその次のトークンをフ...
リダイレクト指定であるというマーキングを行う。実際のファ...
まだ先で環境変数遅延展開の後、コマンド実行の前である。~
[[全般/ファイルディスクリプタとリダイレクト]]も参照。
**2個連続した % の1個の % への置換 [#s0e0ca3e]
バッチスクリプトであれば連続した % は1つにして、環境変数...
**% による環境変数の展開 [#iabd15b7]
単独の % がありその後に % が出てくれば、環境変数展開と見...
:~ が途中にあれば部分文字列の修飾で、: = がこの順に途中に...
修飾である。
**単独の % の削除 [#ea9702e9]
対応する % が行内に無い単独の % を削除する。
**空白文字の無視 [#f119fd64]
構文解析時にいくつかの箇所で、クォートされていない = ; , ...
扱いを受ける。~
行頭、リダイレクト記号とファイル名の間、if 構文の比較の =...
for 構文。
**^ による特殊文字のクォート [#af966e05]
^ の次の特殊文字 ^ " < > & | ( ) = ; ,の特殊な意味を失わ...
また、リダイレクト記号の直前の1桁の数字も ^ によってクォ...
ファイルディスクリプタ番号としての意味を失う。
これら以外の文字が続く場合は ^ が削除される。
! はこの時点では特殊文字ではないので、^! と書いても遅延展...
**" による文字列のクォートと1トークン化 [#a46ff77b]
クォートされていない " が出てきたらそこから次の " または...
% 以外の全ての特殊文字が特殊な意味を失う。
途中に空白や、構文解析上空白と見なされる場合のある = ; , ...
トークンの区切りとはみなさず複合した1つのトークンとみなす...
複合したトークンとして扱われて意味があるのは、リダイレク...
if 構文の比較対象、for 構文の in ( ) の括弧の中。
*文頭の @ の認識 [#p099d19b]
クォートされていない @ が文頭にあれば、実行時に echo off ...
その文が表示されないという印をつける。
実際に表示するのは、for 制御変数の展開を行ってから、環境...
/////////////////////////////////////////////////////////...
*for 制御変数の展開 [#n733932f]
for 文の制御変数の展開は、前項の構文解析が終わってからな...
展開後に < > & | ( ) @ の特殊記号が出てきても、
前項の構文解析の結果は変更されない。~
for 文や if 文のトークンやオプションにも for 制御変数は使...
展開後に echo on で文頭に @ がなければ文が表示される。
この時、for 文や if 文の /オプション や if 文の比較演算子...
英大文字として表示される。
/////////////////////////////////////////////////////////...
*環境変数遅延展開の展開 [#jbf7c2b6]
遅延展開が有効でかつ ! が行内にあるとき、以下の処理が行わ...
! が無い行については何もなされない。
[[コマンド別/set]]の「set /a 特殊記号の演算子」も参照。
**^ による ^ ! のクォート [#j4da5af5]
% と違って文字として ! を残したい場合 !! と書くのは駄目で...
! を環境変数展開に使わず普通の文字として扱いたい場合は ^ ...
ただし、^ は構文解析時の特殊文字でもあるので、この時点で...
最初に ^^ と書いておくと構文解析時に1つの ^ になる。~
つまり単独の ! 文字が必要なら、^^! と書き、単独の ^ が必...
**! による環境変数の展開 [#gd37d352]
単独の ! がありその後に ! が出てくれば、環境変数展開と見...
:~ が途中にあれば部分文字列の修飾で、: = がこの順に途中に...
修飾である。
**クォートされなかった ! の削除 [#w856d6a5]
クォートされていない残った ! を削除する。
/////////////////////////////////////////////////////////...
*コマンド実行時の特殊記号の扱い [#c8b83115]
コマンド実行時には、構文解析時の各特殊記号にどのような意...
各コマンドの解釈次第である。
例:
dir や ren、del、call 等といった比較的単純な多くのビルト...
クォートされていない = ; , は空白と同じ扱いを受ける。~
しかし、echo や set、cd 等ではいずれも特別扱いはされない...
start 等では扱いが複雑なようだ。
例:
ファイル A から " を含む行を検索し、ファイル B に入れるこ...
findstr """ A >B
構文解析時には、3つ目の " から行末までは文字をクォートし...
はりダイレクトでなくそのままの文字列として扱われる。~
findstr コマンドは """ を1つの " として検索文字として扱い、
A と >B を検索対象のファイル名として扱う。~
つまり、A と >B は構文解析時は引用符の中、コマンド実行時...
その結果として、ファイルA中で " を含んだ行があればそれを...
FINDSTR: 開くことができません (>B)
というエラーになる。~
意図どおりの結果を得るには、リダイレクトが " " の中に入ら...
findstr >B """ A
findstr < A > B """
等と書けばよい。
/////////////////////////////////////////////////////////...
#navi(全般)
ページ名: