![토큰 식별자 WORD와 NAME의 차이점은 무엇입니까?](https://linux55.com/image/85721/%ED%86%A0%ED%81%B0%20%EC%8B%9D%EB%B3%84%EC%9E%90%20WORD%EC%99%80%20NAME%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
POSIX 7에서 쉘 구문(XCU의 섹션 2.10)에는 여러 토큰 식별자가 언급되어 있습니다. 나는 단어와 이름이라는 두 가지에 대해 혼란스러워합니다. 그들 사이의 차이점은 무엇입니까?
예를 들어, 명령 옵션이 WORD입니까 아니면 NAME입니까? 명령에 대한 비선택적 인수는 어떻습니까?
답변1
이 섹션의 모든 대문자 이름은 (아마도 기계 컴파일이 가능한) lex
구문 설명을 참조합니다(2.10. 쉘 구문). 질문된 기능은 항목 5에 명시되어 있습니다.
[
NAME
존재하다for
]
언제. . . 언제TOKEN
이름 요구 사항을 충족합니다(참조XBD 이름) 토큰 식별자NAME
결과를 만들어내게 됩니다. 그렇지 않으면 토큰WORD
반환되어야 합니다.
즉 (참고로3.231 이름), ㅏNAME
어떤 종류인가WORD
:
쉘 명령 언어에서는단어이식 가능한 문자 집합의 밑줄, 숫자 및 문자로만 구성됩니다. a의 첫 번째 문자이름숫자가 아닙니다.
모든 단어가 이름은 아닙니다. 십진 정수는 단어이지만 이름은 아닙니다.
구문과 관련하여 다음 줄은 yacc
기호 상수( via #define
) 가 lex
반환할 수 있는 내용을 알려줍니다.
%token WORD
%token ASSIGNMENT_WORD
%token NAME
%token NEWLINE
%token IO_NUMBER
그리고 yacc
문법(규칙)은 다음과 같이 시작됩니다.
%start complete_command
WORD
구문에 가 나타나는 것을 볼 수 있습니다 . 이 지점에서 해당 기호 상수가 반환될 것으로 예상합니다. 관례적으로 대문자 이름은 이러한 목적으로 사용되며 다른 이름은 구문상의 규칙일 뿐입니다.NAME
yacc
lex
yacc
명령을 해석할 때 쉘 인터프리터는 NAME이 될 것으로 예상되는 첫 번째 WORD에만 관심을 갖습니다. 다른 단어를 명령에 대한 인수로 전달하며 명령은 그 의미를 결정해야 합니다. 이에 대한 구문은 yacc
모호하지만 "7a"에 대한 참조를 참고하세요. 이를 표시하는 서면 표준에는 항목이 없지만 다음으로 이동되었습니다.2.9.1 간단한 명령문법에서 이 클러스터에 해당합니다.
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
(연습으로 누군가 문법을 완성하고 실제로 만들어 볼 수도 있습니다.성냥용어 표준).
답변2
명령줄 처리 측면에서 단어는 일반적으로 여러 언어에서 단어로 이해됩니다. (대부분) 공백으로 제한된 문자 집합입니다.
기술적으로 메타 문자(따옴표가 없을 때 단어를 구분하는 문자)로 구분된 문자 집합입니다.
첫 번째 단계는 다음과 같습니다.명령줄 처리에 대한 매우 명확한 설명:
- 명령을 고정된 메타 문자 집합(SPACE, TAB, NEWLINE, ;, (,), <, >, | 및 &)으로 구분된 토큰으로 분할합니다. 토큰 유형에는 단어, 키워드, I/O 리디렉터 및 세미콜론이 포함됩니다.
뒤쪽에라인이 나누어져 있어요성격(또는 태그) 태그는 구문 규칙을 사용하여 식별되고 그에 따라 표시됩니다.
이름은 명령 이름, 변수 이름, 매개변수 이름, 내장 이름 등을 식별하는 데 사용되는 레이블일 뿐입니다.