표기법

표기법 (Notation)

Go 스펙 문서를 읽다 보면 Syntax = { Production } . 같은 기호를 마주치게 돼요. 겁먹을 필요 없어요. 이건 그냥 스펙의 문법을 적는 규칙, 즉 '스펙을 어떻게 읽을지'를 알려주는 안내판이에요. 이 표기법만 먼저 알아두면 뒤에서 나오는 온갖 문법 구절들을 훨씬 편하게 해석할 수 있어요. 지금 이 챕터에서는 이 표기법이 어떤 규칙으로 되어 있는지를 하나씩 풀어볼게요.

출처: Go Specification

본문

Go 스펙의 문법은 EBNF(Extended Backus-Naur Form)의 변형 형태로 적혀 있어요. EBNF라는 이름이 낯설게 들릴 수 있는데, 걱정하지 않아도 돼요. 표기법 자체의 규칙이 아래처럼 또 하나의 문법으로 정의되어 있거든요.

Syntax      = { Production } .
Production  = production_name "=" [ Expression ] "." .
Expression  = Term { "|" Term } .
Term        = Factor { Factor } .
Factor      = production_name | token [ "…" token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
Option      = "[" Expression "]" .
Repetition  = "{" Expression "}" .

한 줄씩 뜯어서 볼게요. 규칙(Production)은 production_name "=" ... 형태라서, 왼쪽에 규칙 이름이 오고 그다음 = 오른쪽에 내용이 와요. 여기서 쓰이는 연산자들을 우선순위가 낮은 것부터 정리하면 이렇게 돼요.

|   alternation
()  grouping
[]  option (0 or 1 times)
{}  repetition (0 to n times)

|는 '또는'이라는 뜻이고요, ()는 묶음, []는 01번, {}는 0n번 반복을 뜻해요.

이제 규칙 이름을 구분하는 기준도 알아둘게요. 소문자로 시작하는 production name은 어휘(terminal) 토큰을 가리키고, CamelCase로 적힌 이름은 비단말(non-terminal)이에요. 어휘 토큰들은 큰따옴표 ""나 역따옴표 ``로 감싸서 표시돼요.

a … b 형태는 조금 특별한 의미를 갖는데요, a부터 b까지의 문자 집합을 대안(alternatives)으로 나타내는 거예요. 이 가로 줄임표 는 스펙 안에서 여러 곳에, 더 자세히 규정되지 않는 열거나 코드 조각을 느슨하게 가리킬 때도 쓰여요. 여기서 중요한 주의점! (한 글자)는 ...(세 글자)와 다르게 Go 언어의 토큰이 아니에요. 그래서 코드를 쓸 때는 이걸 그대로 쓰면 안 돼요.

마지막으로 [Go 1.xx]처럼 생긴 링크를 볼 때가 있는데요, 이건 해당 언어 기능(또는 그 일부)이 언어 버전 1.xx에서 바뀌거나 추가됐다는 표시예요. 다시 말해 그 기능을 쓰려면 최소한 그 언어 버전이 필요하다는 뜻이죠. 자세한 내용은 부록연결된 섹션에서 확인하면 돼요.

더 알아보기