私はbusyboxのawkがどのように機能するかを理解しようとしています。だから標準を調べているのに、なぜ合法的なのか完全に理解できない不思議なことに直面しています。基準(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html、User-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がない場合は、表示の代わりにfoo
aになります。NAME
FUNC_NAME
(