표기법
표기법 (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번, n번 반복을 뜻해요.{}는 0
이제 규칙 이름을 구분하는 기준도 알아둘게요. 소문자로 시작하는 production name은 어휘(terminal) 토큰을 가리키고, CamelCase로 적힌 이름은 비단말(non-terminal)이에요. 어휘 토큰들은 큰따옴표 ""나 역따옴표 ``로 감싸서 표시돼요.
a … b 형태는 조금 특별한 의미를 갖는데요, a부터 b까지의 문자 집합을 대안(alternatives)으로 나타내는 거예요. 이 가로 줄임표 …는 스펙 안에서 여러 곳에, 더 자세히 규정되지 않는 열거나 코드 조각을 느슨하게 가리킬 때도 쓰여요. 여기서 중요한 주의점! …(한 글자)는 ...(세 글자)와 다르게 Go 언어의 토큰이 아니에요. 그래서 코드를 쓸 때는 이걸 그대로 쓰면 안 돼요.
마지막으로 [Go 1.xx]처럼 생긴 링크를 볼 때가 있는데요, 이건 해당 언어 기능(또는 그 일부)이 언어 버전 1.xx에서 바뀌거나 추가됐다는 표시예요. 다시 말해 그 기능을 쓰려면 최소한 그 언어 버전이 필요하다는 뜻이죠. 자세한 내용은 부록의 연결된 섹션에서 확인하면 돼요.
더 알아보기
- 스펙 전체:Go Specification
- 다음 섹션:Source code representation — 실제 어휘 토큰들이 어떻게 정의되는지
- EBNF 기초:Wirth syntax notation