입력 형식(Input format)

입력 형식(Input format)

컴파일러가 소스 파일을 토큰의 시퀀스로 해석할 때, 거치는 전처리 단계들이 있어요. 이 장에서는 소스 파일이 어떻게 토큰 시퀀스로 해석되는지를 설명해요. 프로그램이 파일로 어떻게 구성되는지는 "Crates and source files"에서 다뤄요.

출처: Rust Reference

문법

CHAR → [U+0000-U+D7FF] ∪ [U+E000-U+10FFFF]   //  a Unicode scalar value
ASCII → [U+0000-U+007F]
NUL → U+0000
EOF → !CHAR                                    //  End of file or input

소스 인코딩(Source encoding)

각 소스 파일은 UTF-8로 인코딩된 유니코드 문자들의 시퀀스로 해석돼요. 파일이 유효한 UTF-8이 아니면 오류예요.

바이트 순서 마크(BOM) 제거

시퀀스의 첫 문자가 U+FEFF(BYTE ORDER MARK)이면, 그 문자는 제거돼요.

CRLF 정규화

U+000D(CR) 바로 뒤에 U+000A(LF)가 따라오는 각 문자 쌍은 단일 U+000A(LF)로 대체돼요. 이 과정은 한 번만 일어나고 반복되지 않으므로, 정규화 후에도 입력에 U+000D(CR) 바로 뒤에 U+000A(LF)가 오는 경우가 남을 수 있어요(예: 원시 입력이 "CR CR LF LF"인 경우). U+000D(CR)의 다른 발생은 그 자리에 남아요(공백으로 취급돼요).

셔뱅(Shebang) 제거

셔뱅이 있으면 입력 시퀀스에서 제거되고(따라서 무시되고), 그다음 토큰화가 이뤄져요.

토큰화(Tokenization)

결과로 나온 문자 시퀀스는 이 장의 나머지에서 설명하는 대로 토큰으로 변환돼요.

표준 라이브러리의 include! 매크로는 읽은 파일에 다음 변환을 적용해요.

  • 바이트 순서 마크 제거
  • CRLF 정규화
  • 항목(item) 맥락에서 호출될 때(표현식이나 문(statement) 맥락과 달리) 셔뱅 제거

include_str!include_bytes! 매크로는 이런 변환을 적용하지 않아요.

더 알아보기