Awk

為什麼在awk中的內置函式之前有空格是合法的?

  • January 17, 2020

我試圖了解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應由一個不是關鍵字或內置函式名稱的單片語成,後跟(字元(沒有任何分隔符)。該(字元不應作為令牌的一部分包含在內。

所以區別已經*在詞法分析器*中產生了,一個單詞 likefoo將變成 a NAME,而不是一個FUNC_NAME標記,而不是緊跟 a (

引用自:https://unix.stackexchange.com/questions/562701