我试图了解 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
(