문법 읽는 법
이 매뉴얼은 이 작은 문법 하나를 주 예제로 써요 (ε 같은 특별한 개념엔 가끔 작은 보조 문법을 따로 보여주고요).
본격적인 내용에 들어가기 전에, 이 문법을 읽을 줄 알아야겠죠?
걱정 마세요 — 기호 딱 네 개만 알면 술술 읽혀요.
같이 천천히 뜯어볼게요.
이게 그 문법이에요.
처음 보면 기호가 많아 조금 낯설 수 있어요.
Expr : Expr '+' Term | Term ; Term : Term '*' Factor | Factor ; Factor : '(' Expr ')' | id ; id := "[a-zA-Z]+" ;
🎨 색 힌트 — 보라 는 비단말, 청록 은 단말 이에요. (둘 다 곧 아래에서 제대로 설명해요. 지금은 "색이 다른 두 종류가 있구나" 만.)
기호 네 개
| 기호 | 뜻 | 쉽게 말하면 |
|---|---|---|
: |
"~는 이렇게 만들어진다" | 왼쪽 이름을, 오른쪽 방법으로 만든다 |
| |
"또는" | 만드는 방법이 여러 개일 때 갈라줌 |
; |
"이 규칙 끝" | 문장 끝의 마침표 같은 것 |
'+' (따옴표) |
글자 그 자체 | 화면에 진짜로 찍히는 + 기호 |
첫 줄을 한국어로 번역하면
Expr : Expr '+' Term | Term ;→ "Expr 은 이렇게 만들 수 있어: Expr 다음에
+다음에 Term, 또는 그냥 Term 하나."
천천히 다시 읽어보세요.
: 는 "는 이렇게 만든다", | 는 "또는", ; 는 "끝".
어렵지 않죠?
잠깐, Expr 안에 또 Expr 이 있어요 (재귀)
눈치채셨나요?
Expr 을 설명하는데 그 안에 또 Expr 이 나와요.
자기가 자기를 가리키죠.
이걸 재귀(recursion) 라고 불러요.
"어, 무한루프 아니야?" 싶어서 불안할 수 있는데 — 걱정 마세요. 전혀요.
이건 그냥 "+ 로 여러 개를 계속 이어붙일 수 있다" 는 뜻일 뿐이에요.
예를 들어 a + a + a 처럼요.
(a + a 가 Expr 이고, 거기에 + a 를 또 붙인 거죠.)
자연스럽죠?
재귀라는 단어만 무섭지, 내용은 "여러 개 이어붙이기"가 전부예요.
나머지 줄도 같은 식이에요
Term : Term '*' Factor | Factor ;→ "Term 은 Term*Factor, 또는 Factor 하나." (*곱하기로 이어붙이는 것)Factor : '(' Expr ')' | id ;→ "Factor 는(Expr)(괄호로 감싼 식), 또는 id(이름 하나)."
마지막 줄만 살짝 달라요
id := "[a-zA-Z]+" ;→ "id 는 알파벳 글자들로 된 토큰이야."
여기 "[a-zA-Z]+" 는 정규식(regular expression) 이라는 거예요.
근데 — 정규식 몰라도 정말 괜찮아요.
지금은 그냥 "영어 알파벳으로 된 이름"(예: a, x, foo) 정도로만 이해하면 100% 충분해요.
(:= 는 "이건 글자 패턴으로 정의하는 토큰"이라는 표시고요.)
방금 우리가 읽은 그것 — 이름이 있어요
여기까지 왔으면 이 문법을 읽을 줄 알게 된 거예요.
그리고 — 방금 우리가 다룬, 이렇게 규칙으로 문법을 적는 표기법에는 이름이 있어요.
EBNF(Extended Backus–Naur Form, '확장 배커스–나우어 표기법')라고 불러요.
이름은 거창하지만 형태는 방금 본 그게 전부예요.
앞으로 누가 "EBNF" 라고 하면 "아, 그 규칙 적는 방식!" 하시면 돼요.
전문 용어 하나 챙겼네요 😎
단어 딱 두 개: 단말 / 비단말
마지막으로 단어 두 개만.
문법 속 이름들은 두 종류로 나뉘어요.
이 둘만 구분하면 끝이에요.
- 비단말(non-terminal) = 더 쪼개지는 "규칙 이름" →
Expr,Term,Factor(오른쪽에 "만드는 방법"이 적혀 있죠.) - 단말(terminal) = 더 안 쪼개지는 "실제 토큰" →
+,*,(,),id(입력에 진짜로 등장하는 조각들.)
이름이 왜 이러냐면 — "단말(終端, terminal)"은 끝, 종착점이라는 뜻이에요. 더 이상 쪼갤 게 없어서 거기서 "끝"나니까요. 비단말은 그 반대 — 아직 더 풀어 쓸 게 남은 거고요. 이름의 뜻만 알아도 헷갈릴 일이 확 줄어요.
비유하자면 — 비단말은 "요리 이름"(예: 김치찌개), 단말은 "실제 재료"(김치, 두부, 물)예요.
요리 이름은 다른 요리나 재료로 풀어 쓸 수 있지만, 재료는 그 자체로 끝이죠.
한 줄 요약: 대문자로 시작(Expr, Term…)은 비단말, 기호나
id는 단말.
(앞의 요리/재료 비유로 치면 — 비단말 = 요리 이름, 단말 = 재료.)
다음 장
문법을 읽을 줄 알게 됐어요!
가장 낯선 고비는 사실 방금 넘었어요 👍
이제 LR 파싱의 첫 개념, FIRST / FOLLOW 로 갑니다.