awkで組み込み関数の前にスペースを入れるのはなぜ正当なのですか?

awkで組み込み関数の前にスペースを入れるのはなぜ正当なのですか?

私はbusyboxのawkがどのように機能するかを理解しようとしています。だから標準を調べているのに、なぜ合法的なのか完全に理解できない不思議なことに直面しています。基準(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.htmlUser-Defined Functionsセクションで指摘)

関数を呼び出すとき、関数名と開いた角かっこの間にスペースを入れることはできません。

後で表示される構文接頭辞は次のとおりです。

この形式的な文法は、前のテキスト文法の説明を上書きする必要があります。

non_unary_expr   : '(' expr ')'
                 | '!' expr
                 ...
                 | FUNC_NAME '(' expr_list_opt ')'
                      /* no white space allowed before '(' */
                 | BUILTIN_FUNC_NAME '(' expr_list_opt ')'
                 | BUILTIN_FUNC_NAME

BUILTIN_FUNC_NAMEと構文はまったく同じですFUNC_NAME。ただし、ユーザー機能と組み込み機能については異なる動作をします。

+$echo | awk -P '{ print length() 1 }'
01
+$echo | awk -P '{ print length () 1 }'
01
+$echo | awk -P 'function foo() { return 0 } ; { print foo() 1 }'
01
+$echo | awk -P 'function foo() { return 0 } ; { print foo () 1 }'
awk: cmd. line:1: error: function `foo' called with space between name and `(',
or used as a variable or an array
awk: cmd. line:1: function foo() { return 0 } ; { print foo () 1 }
awk: cmd. line:1:                                            ^ syntax error
awk: cmd. line:1: function foo() { return 0 } ; { print foo () 1 }
awk: cmd. line:1:                                              ^ syntax error

文法のどの部分がこの動作を指定しますか?

答え1

FUNC_NAME引用したものと同じ仕様で定義を確認してください。

12.タグはNAMEキーワードや組み込み関数名ではなく単語で構成する必要があり、後に文字(区切り文字なし)を続けることはできません(

13.トークンはFUNC_NAMEキーワードまたは組み込み関数の名前ではなく単語で構成する必要があり、直後に文字が続く必要があります(区切り文字なし)(。この(文字はトークンに含めないでください。

だから違いがありました内部に語彙アナライザ、likeという単語の後にaがない場合は、表示の代わりにfooaになります。NAMEFUNC_NAME(

関連情報