为什么 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

语法的哪一部分指定了这种行为?

答案1

FUNC_NAME检查您引用的同一规范中的定义:

12.标记NAME应由不是关键字或内置函数名称的单词组成,并且后面不紧跟着字符(没有任何分隔符)(

13.令牌FUNC_NAME应包含一个不是关键字或内置函数名称的单词,紧跟其后(没有任何分隔符)字符(。该(字符不应包含在令牌中。

所以差异已经产生了在里面词法分析器,并且单词 like后面不紧跟着 a 时foo会变成 a NAME,而不是标记。FUNC_NAME(

相关内容