이 문서에 대하여

이 문서에 대하여

이 문서는 Nim 언어의 어휘(lexis), 문법(syntax), 그리고 의미(semantics)를 다루는 공식 매뉴얼이에요. 처음 Nim을 접하는 분이라면 "언어가 어떻게 생겼는지, 문장이 어떻게 쓰이는지"를 한곳에서 훑어보는 용도로, 실제로 컴파일하거나 문서를 만들 때는 뒤에서 알려드릴 안내서를 함께 보시면 됩니다.

출처: Nim Manual

본문

먼저 짚고 넘어갈 점이 있어요. 이 문서는 아직 초안(draft) 수준이라, Nim의 몇몇 기능은 더 정밀한 표현이 필요할 수 있어요. 매뉴얼이 제대로 된 명세(specification)로 자라나가는 중이라고 보시면 돼요.

Nim의 실험적(experimental) 기능에 대한 내용은 별도 문서로 정리되어 있어요. 그리고 할당(assignment), 이동(move), 소멸(destruction)에 관한 규칙은 destructors 문서에서 다루고 있죠.

이 문서가 설명하는 범위는 Nim 언어의 어휘, 문법, 의미론이에요. 실제로 Nim 프로그램을 컴파일하고 문서를 생성하는 방법까지 알고 싶다면 Compiler User GuideDocGen Tools Guide를 함께 보시는 걸 추천해요.

문법 표기법: 확장 BNF

이 문서는 언어 구성 요소를 **확장 BNF(extended BNF)**로 설명해요. 기호 몇 개만 익혀두면 표기법이 어렵지 않게 읽혀요:

  • (a)*a0번 이상 반복됨을 뜻해요.
  • a+a1번 이상 반복됨을 뜻해요.
  • (a)?a있어도 되고 없어도 되는 선택 요소예요.
  • 괄호는 요소들을 묶는 데 사용할 수 있어요.

&lookahead(전방 탐색) 연산자예요. &aa가 오기는 하지만 소비되지는 않는다는 뜻이에요. 실제 소비는 다음 규칙에서 일어나죠.

|/ 기호는 대안(alternative)을 표시하는 데 쓰이며 가장 낮은 우선순위를 가져요. 특히 /는 **순서 지정 선택(ordered choice)**이라는 점이 중요한데, 파서가 주어진 순서대로 대안을 시도하도록 강제해요. 그래서 문법에 모호함이 생기지 않도록 할 때 자주 사용돼요.

터미널 기호 구분

비터미널(non-terminal)은 소문자로 시작하고, 추상 터미널 기호는 대문자로 표기해요. 키워드를 포함한 문자 그대로의 터미널 기호는 '로 감싸죠. 예시를 볼게요:

ifStmt = 'if' expr ':' stmts ('elif' expr ':' stmts)* ('else' stmts)?

이진 ^* 연산자는 "두 번째 인자로 구분되며 0번 이상 반복"을 줄여 쓰는 기호예요. 마찬가지로 ^+는 "1번 이상 반복"을 뜻하죠. 즉 a ^+ ba (b a)*의 축약이고, a ^* b(a (b a)*)?의 축약이에요. 예시로 확인해 볼게요:

arrayConstructor = '[' expr ^* ',' ']'

스코프 규칙이나 런타임 의미처럼 나머지 부분들—예를 들어 변수가 살아 있는 범위나 실행 시점의 동작—은 형식 문법이 아니라 비공식적으로 설명되어 있어요. 그쪽은 BNF보다는 자연어 설명이 훨씬 더 이해하기 쉬운 영역이기 때문이에요.

더 알아보기 (Learn more)