我试图了解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
您引用的同一规范中的定义:所以区别已经在词法分析器中产生了,一个单词 like
foo
将变成 aNAME
,而不是一个FUNC_NAME
标记,而不是紧跟 a(
。