POSIX 7では、シェル構文(XCUのセクション2.10)には複数のトークン識別子が記載されています。私は言葉と名前の2つについて混乱しています。それらの違いは何ですか?
たとえば、コマンドオプションがWORDですか、それともNAMEですか?コマンドの非選択的な引数はどうですか?
答え1
このセクションのすべての大文字の名前は(おそらくマシンをコンパイル可能な)lex
構文の説明を参照します(2.10。シェル構文)。質問された機能は項目5に記載されています。
[
NAME
存在するfor
]
いつ。 。 。いつTOKEN
名前の要件を満たしています(参照XBD名) トークン識別子NAME
結果を生み出します。そうでなければトークンWORD
返す必要があります。
つまり(参考として3.231 名前)、ㅏNAME
どんな種類なのかWORD
:
シェルコマンド言語では言葉移植可能な文字セットの下線、数字、および文字のみで構成されます。 aの最初の文字名前数字ではありません。
すべての単語が名前ではありません。 10進整数は単語ですが、名前ではありません。
構文に関して、次の行はyacc
シンボル定数( via #define
)がlex
返すことができる内容を示します。
%token WORD
%token ASSIGNMENT_WORD
%token NAME
%token NEWLINE
%token IO_NUMBER
そしてyacc
文法(規則)は次のように始まります。
%start complete_command
WORD
構文にが表示されることがわかります。この時点で、対応するシンボル定数が返されると予想します。通常、大文字の名前はこの目的に使用され、他の名前は構文上の規則にすぎません。NAME
yacc
lex
yacc
コマンドを解釈するとき、シェルインタプリタはNAMEになると予想される最初のWORDにのみ興味があります。他の単語をコマンドの引数として渡し、コマンドはその意味を決定する必要があります。これの構文はyacc
あいまいですが、「7a」への参照を参照してください。これを表示する書面標準には項目はありませんが、次に移動しました。2.9.1 簡単なコマンド文法では、このクラスターに対応します。
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
(練習で誰かが文法を完成させ、実際に作ってみることもできます。マッチ用語標準)。
答え2
コマンドライン処理の観点から言えば、単語は通常複数の言語で単語として理解されます。 (ほとんど) 空白に制限された文字セットです。
技術的には、メタ文字(引用符がない場合に単語を区切る文字)で区切られた文字セットです。
最初のステップは次のとおりです。コマンドライン処理の非常に明確な説明:
- コマンドを固定メタ文字セット(SPACE、TAB、NEWLINE、;、(、)、<、>、|、および&)で区切られたトークンに分割します。トークンの種類には、単語、キーワード、I/O リダイレクタ、セミコロンが含まれます。
後ろにラインが分かれています。性格(またはタグ)タグは構文規則を使用して識別され、それに応じて表示されます。
名前は、コマンド名、変数名、パラメータ名、組み込み名などを識別するために使用されるラベルにすぎません。