Awk
為什麼在awk中的內置函式之前有空格是合法的?
我試圖了解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
語法的哪一部分確實指定了這種行為?
檢查
FUNC_NAME
您引用的同一規範中的定義:**12.**標記
NAME
應由一個不是關鍵字或內置函式名稱的單片語成,並且後面不緊跟字元(沒有任何分隔符)(
。**13.**標記
FUNC_NAME
應由一個不是關鍵字或內置函式名稱的單片語成,後跟(
字元(沒有任何分隔符)。該(
字元不應作為令牌的一部分包含在內。所以區別已經*在詞法分析器*中產生了,一個單詞 like
foo
將變成 aNAME
,而不是一個FUNC_NAME
標記,而不是緊跟 a(
。