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가 없으면 표시 대신 fooa가 됩니다 .NAMEFUNC_NAME(

관련 정보