トークン識別子WORDとNAMEの違いは何ですか?

トークン識別子WORDとNAMEの違いは何ですか?

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構文にが表示されることがわかります。この時点で、対応するシンボル定数が返されると予想します。通常、大文字の名前はこの目的に使用され、他の名前は構文上の規則にすぎません。NAMEyacclexyacc

コマンドを解釈するとき、シェルインタプリタは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

コマンドライン処理の観点から言えば、単語は通常複数の言語で単語として理解されます。 (ほとんど) 空白に制限された文字セットです。

技術的には、メタ文字(引用符がない場合に単語を区切る文字)で区切られた文字セットです。

最初のステップは次のとおりです。コマンドライン処理の非常に明確な説明:

  1. コマンドを固定メタ文字セット(SPACE、TAB、NEWLINE、;、(、)、<、>、|、および&)で区切られたトークンに分割します。トークンの種類には、単語、キーワード、I/O リダイレクタ、セミコロンが含まれます。

後ろにラインが分かれています。性格(またはタグ)タグは構文規則を使用して識別され、それに応じて表示されます。


名前は、コマンド名、変数名、パラメータ名、組み込み名などを識別するために使用されるラベルにすぎません。

関連情報