나는 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
(