Syntax Analysis Part 4
COMP321 Compiler โ Syntax Analysis Part 4
Kyungpook National University | Hwisoo So | Spring 2026
๐ 1ํ์ด์ง
๐ท ๋ฌธ์ฅ
Syntax Analysis โ 4
๐ ํด์ ๊ตฌ๋ฌธ ๋ถ์ โ 4
โ ์ค๋ช ์ปดํ์ผ๋ฌ์์ Syntax Analysis(๊ตฌ๋ฌธ ๋ถ์) ํํธ์ 4๋ฒ์งธ ๊ฐ์๋ผ๋ ๋ป์ด๋ค. ์ฆ, ์ด์ ํ์ฑ(Parsing)์ ํต์ฌ ์ด๋ก ์ผ๋ก ๋ค์ด๊ฐ๋ ๋จ๊ณ๋ค.
๐ท ๋ฌธ์ฅ
Hwisoo So Kyungpook National University
๐ ํด์ ์ํ์ ๊ต์ ๊ฒฝ๋ถ๋ํ๊ต
โ ์ค๋ช ๊ฐ์ ๋ด๋น ๊ต์์ ์์ ํ๊ต ์ ๋ณด
๐ท ๋ฌธ์ฅ
COMP321 Compiler Spring 2026
๐ ํด์ ์ปดํ์ผ๋ฌ ๊ณผ๋ชฉ (COMP321) 2026๋ ๋ดํ๊ธฐ
โ ์ค๋ช ๊ณผ๋ชฉ ์ฝ๋ + ํ๊ธฐ ์ ๋ณด
โ ๊ทธ๋ฆผ ์ค๋ช
- ๊ฐ์ด๋ฐ ํฌ๊ฒ Syntax Analysis โ 4
- ์๋์ ํ๊ต ๋ก๊ณ
- ์ ํ์ ์ธ ๊ฐ์ ํ์ง ์ฌ๋ผ์ด๋
๐ ์๋ฏธ ์์ (๋ด์ฉ ์์), ๋จ์ ํ์ดํ ํ์ด์ง
๐ 2ํ์ด์ง
๐ท ์ ๋ชฉ
Outlook
๐ ํด์ ์ ์ฒด ๊ฐ์ / ์์ผ๋ก ๋ค๋ฃฐ ๋ด์ฉ
๐ท ๋ฌธ์ฅ
Syntax and Semantics of Programming Languages โ
๐ ํด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ โ
โ ์ค๋ช ์ด๋ฏธ ๋ฐฐ์ด ๋ด์ฉ (์ฒดํฌ ํ์ ์์)
- Syntax โ ๋ฌธ๋ฒ ๊ตฌ์กฐ
- Semantics โ ์๋ฏธ
๐ท ๋ฌธ์ฅ
Specifying the Syntax of a programming language: โ
๐ ํด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ตฌ๋ฌธ ์ ์ ๋ฐฉ๋ฒ โ
โ ์ค๋ช ๋ฌธ๋ฒ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค๋ ๋ป
๐ท ๋ฌธ์ฅ
CFGs, BNF and EBNF โ
๐ ํด์ CFG, BNF, EBNF โ
โ ์ค๋ช
- CFG: Context-Free Grammar
- BNF/EBNF: ๋ฌธ๋ฒ ํ๊ธฐ ๋ฐฉ์
๐ท ๋ฌธ์ฅ
Grammar transformations โ
๐ ํด์ ๋ฌธ๋ฒ ๋ณํ โ
โ ์ค๋ช
- left recursion ์ ๊ฑฐ
- left factoring
๐ท ๋ฌธ์ฅ
Parsing
๐ ํด์ ํ์ฑ
โ ์ค๋ช ๐ ์ด์ ๋ถํฐ ํต์ฌ ํํธ ์์
๐ท ๋ฌธ์ฅ
Top-down parsing (LL) โ
๐ ํด์ ํ๋ค์ด ํ์ฑ (LL) โ
โ ์ค๋ช ์ด๋ฏธ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋ฐฐ์
๐ท ๋ฌธ์ฅ
Recursive descent (LL) parser construction
๐ ํด์ ์ฌ๊ท ํ๊ฐ ํ์ ๊ตฌ์ฑ
โ ์ค๋ช ๐ ์ง์ ์ฝ๋๋ก ํ์ ๋ง๋๋ ๋จ๊ณ
๐ท ๋ฌธ์ฅ
LL Grammars
๐ ํด์ LL ๋ฌธ๋ฒ
โ ์ค๋ช ๐ ์ค๋ ํต์ฌ ์ฃผ์
๐ท ๋ฌธ์ฅ
AST Construction
๐ ํด์ AST ์์ฑ
โ ์ค๋ช ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ง๋๋ ๋จ๊ณ
๐ท ๋ฌธ์ฅ
Parse trees vs. ASTs
๐ ํด์ ํ์ค ํธ๋ฆฌ vs AST
โ ์ค๋ช ๋์ ์ฐจ์ด ๋น๊ต ์์
๐ท ๋ฌธ์ฅ
Chomskyโs Hierarchy
๐ ํด์ ์ด์คํค ๊ณ์ธต
โ ์ค๋ช ๋ฌธ๋ฒ์ ๋ถ๋ฅ ์ฒด๊ณ
โ ์ ์ฒด ์์ฝ
- ๐ ์ง๊ธ๊น์ง: ๋ฌธ๋ฒ ์ ์
- ๐ ์ด์ ๋ถํฐ: ํ์ฑ + LL(1) + FIRST/FOLLOW
๐ 3ํ์ด์ง
๐ท ์ ๋ชฉ
LL(1) Grammars
๐ ํด์ LL(1) ๋ฌธ๋ฒ
๐ท ๋ฌธ์ฅ
The presented algorithm to convert EBNF into a parser does not work for all possible grammars.
๐ ํด์ EBNF๋ฅผ ํ์๋ก ๋ณํํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๋ฌธ๋ฒ์ ๋ํด ๋์ํ์ง ์๋๋ค.
โ ์ค๋ช ๐ ๋ชจ๋ CFG๊ฐ ํ์ฑ ๊ฐ๋ฅํ ๊ฑด ์๋๋ค
๐ท ๋ฌธ์ฅ
It only works for so called โLL(1)โ grammars
๐ ํด์ ์ด ์๊ณ ๋ฆฌ์ฆ์ LL(1) ๋ฌธ๋ฒ์์๋ง ๋์ํ๋ค.
โ ์ค๋ช ๐ LL(1) = ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ โ์ข์ ๋ฌธ๋ฒโ
๐ท ๋ฌธ์ฅ
LL(1) is an acronym for
๐ ํด์ LL(1)์ ๋ค์์ ์๋ฏธํ๋ค
๐ท ๋ฌธ์ฅ
Left-to-right parsing of the input stream
๐ ํด์ ์ ๋ ฅ์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฝ๋๋ค
๐ท ๋ฌธ์ฅ
Leftmost derivation
๐ ํด์ ๊ฐ์ฅ ์ผ์ชฝ๋ถํฐ ์ ๋ํ๋ค
๐ท ๋ฌธ์ฅ
1 token look-ahead
๐ ํด์ 1๊ฐ์ ํ ํฐ๋ง ๋ฏธ๋ฆฌ ๋ณธ๋ค
๐ท ๋ฌธ์ฅ
What grammars are LL(1)?
๐ ํด์ ์ด๋ค ๋ฌธ๋ฒ์ด LL(1)์ธ๊ฐ?
๐ท ๋ฌธ์ฅ
A grammar containing left-recursion is not LL(1)
๐ ํด์ left recursion์ด ์์ผ๋ฉด LL(1)์ด ์๋๋ค
๐ท ๋ฌธ์ฅ
A grammar containing common prefixes is not LL(1)
๐ ํด์ ๊ณตํต prefix๊ฐ ์์ผ๋ฉด LL(1)์ด ์๋๋ค
๐ท ๋ฌธ์ฅ
An ambiguous grammar is not LL(1)
๐ ํด์ ๋ชจํธํ ๋ฌธ๋ฒ๋ LL(1)์ด ์๋๋ค
โ ํต์ฌ ์์ฝ
LL(1) ์กฐ๊ฑด:
- left recursion ์์
- ๊ณตํต prefix ์์
- ambiguity ์์
๐ 4ํ์ด์ง โ Notation and Terminology
๐ท ์ ๋ชฉ
Notation and Terminology
๐ ํด์ ํ๊ธฐ๋ฒ๊ณผ ์ฉ์ด
๐ท ๋ฌธ์ฅ
Given a context-free grammar G
๐ ํด์ CFG G๊ฐ ์ฃผ์ด์ก์ ๋
๐ท ๋ฌธ์ฅ
Vt is the set of terminal symbols
๐ ํด์ Vt๋ terminal ์งํฉ
โ ์ค๋ช ํ ํฐ (ID, +, etc)
๐ท ๋ฌธ์ฅ
Vn is the set of nonterminals
๐ ํด์ Vn์ ๋น๋จ๋ง ์งํฉ
โ ์ค๋ช Expr, Term ๊ฐ์ ๊ฒ
๐ท ๋ฌธ์ฅ
P is a finite set of productions
๐ ํด์ P๋ ์์ฑ ๊ท์น ์งํฉ
๐ท ๋ฌธ์ฅ
V = Vt โช Vn
๐ ํด์ ์ ์ฒด ๊ธฐํธ ์งํฉ
๐ท ๋ฌธ์ฅ
a, b, c โ Vt
๐ ํด์ a,b,c๋ terminal
๐ท ๋ฌธ์ฅ
A, B, C โ Vn
๐ ํด์ A,B,C๋ nonterminal
๐ท ๋ฌธ์ฅ
ฮฑ, ฮฒ โ V*
๐ ํด์ ฮฑ, ฮฒ๋ ๋ฌธ์์ด
๐ท ๋ฌธ์ฅ
ฮฑAฮฒ โ ฮฑฮณฮฒ
๐ ํด์ A๋ฅผ ฮณ๋ก ์นํ
โ ์ค๋ช ๐ derivation ์ ์
๐ท ๋ฌธ์ฅ
โ , โ+*
๐ ํด์ ์ฌ๋ฌ ๋จ๊ณ / ์ต์ 1๋จ๊ณ ์ ๋
โ ํต์ฌ ๐ CFG ๊ธฐ๋ณธ ์ ์ ๋ณต์ต
๐ 5ํ์ด์ง โ Predictive Parsing
๐ท ์ ๋ชฉ
Predictive Parsing (aka Recursive Descent Parsing)
๐ ํด์ ์์ธก ํ์ฑ (์ฌ๊ท ํ๊ฐ ํ์ฑ)
๐ท ๋ฌธ์ฅ
Basic idea
๐ ํด์ ๊ธฐ๋ณธ ์์ด๋์ด
๐ท ๋ฌธ์ฅ
For any two productions A โ ฮฑ ฮฒ โฆ
๐ ํด์ A โ ฮฑ | ฮฒ๊ฐ ์์ ๋
๐ท ๋ฌธ์ฅ
distinct way of choosing
๐ ํด์ ๋ช ํํ๊ฒ ํ๋๋ฅผ ์ ํํด์ผ ํ๋ค
โ ์ค๋ช ๐ ํ์๊ฐ ํท๊ฐ๋ฆฌ๋ฉด ์๋จ
๐ท ๋ฌธ์ฅ
define FIRST(ฮฑ)
๐ ํด์ FIRST(ฮฑ)๋ฅผ ์ ์ํ๋ค
๐ท ๋ฌธ์ฅ
tokens that appear first
๐ ํด์ ๋งจ ์์ ์ฌ ์ ์๋ ํ ํฐ
๐ท ๋ฌธ์ฅ
FIRST(ฮฑ) โฉ FIRST(ฮฒ) = โ
๐ ํด์ ๋ FIRST ์งํฉ์ ๊ฒน์น๋ฉด ์ ๋๋ค
โ ํต์ฌ ๐ ์ด๊ฒ LL(1) ํต์ฌ ์กฐ๊ฑด
๐ท ๋ฌธ์ฅ
predict with one lookahead
๐ ํด์ 1๊ฐ ํ ํฐ๋ง ๋ณด๊ณ ์ ํ ๊ฐ๋ฅ
โ ํต์ฌ ์ ๋ฆฌ ๐ LL(1)์ ๋ณธ์ง: โ์ ํ ํฐ ํ๋๋ก ๊ท์น ์ ํ ๊ฐ๋ฅโ
๐ฅ ์ฌ๊ธฐ๊น์ง ํต์ฌ ์์ฝ
์ด 1~5ํ์ด์ง๋: ๐ โLL(1) ํ์ฑ์ด ๋ญ์ง + ์ ํ์ํ์ง + ์กฐ๊ฑดโ ์ค๋ช
ํต์ฌ 3๊ฐ:
- LL(1) = 1-token lookahead
- FIRST ์งํฉ ์ค์
- ๊ฒน์น๋ฉด ํ์ฑ ๋ถ๊ฐ๋ฅ
๐ 6ํ์ด์ง
๐ท ์ ๋ชฉ
Left-Recursive Grammars are not LL(1)
๐ ํด์ ์ผ์ชฝ ์ฌ๊ท ๋ฌธ๋ฒ์ LL(1)์ด ์๋๋ค
๐ท ๋ฌธ์ฅ
Expr ::= Expr "+" INT
| INT
๐ ํด์ Expr๋ ๋ค์ ๋ ๊ฐ์ง๋ก ์์ฑ๋๋ค:
- Expr + INT
- INT
โ ์ค๋ช ๐ ์ด ๋ฌธ๋ฒ์ ํต์ฌ ๋ฌธ์ : ์ผ์ชฝ์์ ์๊ธฐ ์์ ์ผ๋ก ์์ํจ (Expr โ Expr โฆ) โ ์ด๊ฒ ๋ฐ๋ก left recursion
๐ท ๋ฌธ์ฅ
What happens if we donโt perform left-recursion elimination?
๐ ํด์ left recursion ์ ๊ฑฐ๋ฅผ ํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๐ท ์ฝ๋
def parseExpr(self):
match self.currentToken.kind:
case Token.INT:
self.parseExpr()
self.accept(Token.PLUS)
self.accept(Token.INT)
case Token.INT:
self.accept(Token.INT)
case _: report syntax error
๐ ํด์ + ์ค๋ช
ํ์ฌ ํ ํฐ์ด INT๋ฉด:
- parseExpr() ๋ ํธ์ถ
- ์ฝ๊ณ
- INT ์ฝ์
๐ ๋ฌธ์ : case๊ฐ ๋ ๋ค Token.INT
๐ท ๋ฌธ์ฅ
Problem1: overlapping cases
๐ ํด์ ๋ฌธ์ 1: case๊ฐ ๊ฒน์น๋ค
๐ท ๋ฌธ์ฅ
FIRST ( Expr โ+โ INT ) = {INT}
๐ ํด์ Expr + INT์ FIRST๋ {INT}
๐ท ๋ฌธ์ฅ
FIRST ( INT ) = {INT}
๐ ํด์ INT์ FIRST๋ {INT}
โ ์ค๋ช ๐ ๋ ๋ค ์์์ด INT โ ๊ตฌ๋ถ ๋ถ๊ฐ๋ฅ โ LL(1) ์กฐ๊ฑด ์๋ฐ
๐ท ๋ฌธ์ฅ
Problem2: infinite recursion via parseExpr()
๐ ํด์ ๋ฌธ์ 2: ๋ฌดํ ์ฌ๊ท ๋ฐ์
โ ์ค๋ช (์ง์ง ์ค์)
parseExpr โ parseExpr โ parseExpr โ ...
๐ ์ ๋ ฅ์ ์๋นํ๊ธฐ ์ ์ ์ฌ๊ท ํธ์ถ โ ๋์์ด ๋ฐ๋ณต
๐ฅ ํต์ฌ
left recursion ๋ฌธ์ :
- FIRST ์ถฉ๋
- ๋ฌดํ ์ฌ๊ท
๐ 7ํ์ด์ง
๐ท ์ ๋ชฉ
Left-Recursive Grammars are not LL(1)
๐ท ๋ฌธ์ฅ
Expr ::= INT
| Expr "+" INT
๐ ํด์ ์์๋ฅผ ๋ฐ๊ฟ๋ ์ฌ์ ํ left recursion
๐ท ๋ฌธ์ฅ
eliminate left-recursion
๐ ํด์ left recursion ์ ๊ฑฐ
๐ท ๋ฌธ์ฅ
Expr ::= INT ( "+" INT )*
๐ ํด์ Expr๋:
- INT ๋ค์์
- โ+โ INT๊ฐ 0๋ฒ ์ด์ ๋ฐ๋ณต
โ ์ค๋ช ๐ ํต์ฌ ๋ณํ:
Expr โ Expr + INT โ
โ ๋ฐ๋ณต ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝ
๐ ์ฆ: ์ฌ๊ท โ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํ
๐ท ์ผ๋ฐ์
N ::= X | N Y โ N ::= X Y*
๐ ํด์ ์ผ์ชฝ ์ฌ๊ท๋ ๋ฐ๋ณต์ผ๋ก ๋ฐ๊พผ๋ค
๐ท ์ฝ๋
def parseExpr(self):
self.accept(Token.INT)
while self.currentToken.kind == Token.PLUS:
self.accept(Token.PLUS)
self.accept(Token.INT)
โ ์ค๋ช ๐ ๋์:
- INT ํ๋ ์ฝ์
- โ+โ ์์ผ๋ฉด ๊ณ์ ๋ฐ๋ณต
๐ ์์ ํ ๋ฐ๋ณต ๊ธฐ๋ฐ ํ์ฑ
๐ฅ ํต์ฌ
left recursion ์ ๊ฑฐ = ๐ ์ฌ๊ท โ while loop
๐ 8ํ์ด์ง
๐ท ์ ๋ชฉ
Grammars with Common Prefixes are not LL(1)
๐ ํด์ ๊ณตํต prefix๊ฐ ์๋ ๋ฌธ๋ฒ์ LL(1)์ด ์๋๋ค
๐ท ๋ฌธ์ฅ
Expr ::= Term "+" Expr
| Term
๐ ํด์ ๋ ๊ท์น ๋ชจ๋ Term์ผ๋ก ์์
โ ๋ฌธ์ ๐ ๋ ๋ค FIRST(Term)์ผ๋ก ์์
๐ท ์ฝ๋
case FIRST(Term):
parseTerm()
accept("+")
parseExpr()
case FIRST(Term):
parseTerm()
โ ์ค๋ช ๐ ๋ ๋ค ์กฐ๊ฑด ๋์ผ โ ์ ํ ๋ถ๊ฐ๋ฅ
๐ท ๋ฌธ์ฅ
Problem of overlapping cases in FIRST (TERM)
๐ ํด์ FIRST(Term)์์ ๊ฒน์นจ ๋ฌธ์ ๋ฐ์
๐ท ๋ฌธ์ฅ
Note: this does not lead to infinite recursion
๐ ํด์ ์ด ๊ฒฝ์ฐ๋ ๋ฌดํ ์ฌ๊ท๋ ๋ฐ์ํ์ง ์๋๋ค
โ ์ค๋ช ๐ ์ด์ :
- ์ค๊ฐ์ โ+โ๋ฅผ ์๋นํจ
- โ ์ ๋ ฅ์ด ์ค์ด๋ฆ โ ๋ฌดํ๋ฃจํ ์์
๐ฅ ํต์ฌ
๊ณตํต prefix ๋ฌธ์ : ๐ ์ด๋ค ๊ท์น ์ ํํ ์ง ๊ฒฐ์ ๋ถ๊ฐ๋ฅ
๐ 9ํ์ด์ง
๐ท ์ ๋ชฉ
perform left-factorization
๐ ํด์ left factoring ์ํ
๐ท ๋ณํ
Expr ::= Term ( "+" Expr | ฮต )
๐ ํด์ Term ๋ค์:
- Expr
- ๋๋ ์๋ฌด๊ฒ๋ ์์
โ ์ค๋ช ๐ ๊ณตํต prefix ์ ๊ฑฐ
Term + Expr
Term
โ
Term ( + Expr | ฮต )
๐ท ์ผ๋ฐ์
X Y | X Z โ X (Y | Z)
๐ท ์ฝ๋
def parseExpr(self):
self.parseTerm()
if self.currentToken.kind == Token.PLUS:
self.accept(Token.PLUS)
self.parseExpr()
โ ์ค๋ช ๐ ์์:
- Term ๋จผ์ ์ฒ๋ฆฌ
- ์์ผ๋ฉด ์ถ๊ฐ ์ฒ๋ฆฌ
๐ ์ด์ ๋ถ๊ธฐ ๋ช ํํจ
๐ฅ ํต์ฌ
left factoring = ๐ ๊ณตํต prefix๋ฅผ ๋ฐ์ผ๋ก ๋นผ๊ธฐ
๐ 10ํ์ด์ง
๐ท ์ ๋ชฉ
Intuition behind LL(1) Grammars
๐ ํด์ LL(1) ๋ฌธ๋ฒ์ ์ง๊ด
๐ท ๋ฌธ์ฅ
parse X Y
๐ ํด์ X ๋๋ Y ์ ํ
๐ท ์ฝ๋
case FIRST(X): parse X
case FIRST(Y): parse Y
๐ท ์กฐ๊ฑด 1
FIRST(X) and FIRST(Y) must be disjoint
๐ ํด์ FIRST(X)์ FIRST(Y)๋ ๊ฒน์น๋ฉด ์ ๋๋ค
โ ์ค๋ช ๐ ๊ฒน์น๋ฉด ์ด๋ค ๊ฑธ ์ ํํ ์ง ๋ชจ๋ฆ
๐ท ๋ฌธ์ฅ
parse X*
๐ ํด์ X ๋ฐ๋ณต
๐ท ์ฝ๋
while token โ FIRST(X):
parse X
๐ท ์กฐ๊ฑด 2
FIRST(X) must be disjoint from FOLLOW(X)*
๐ ํด์ FIRST(X)์ FOLLOW(X*)๋ ๊ฒน์น๋ฉด ์ ๋๋ค
โ ์ค๋ช (์ค์) ๐ ์ธ์ ๋ฉ์ถ์ง ๊ฒฐ์ ํด์ผ ํจ
- ๊ณ์ํ ์ง
- ๋๋ผ์ง โ ์ด ํ๋จ์ ์ํด ํ์
๐ฅ ์ต์ข ํต์ฌ ์ ๋ฆฌ
LL(1) ์กฐ๊ฑด 2๊ฐ:
- FIRST๋ผ๋ฆฌ ์ ๊ฒน์นจ
- FIRST vs FOLLOW๋ ์ ๊ฒน์นจ
๐ฅ 6~10ํ์ด์ง ์ ์ฒด ํต์ฌ ์์ฝ
์ด ๊ตฌ๊ฐ์ ์ง์ง ์ํ ํต์ฌ์ด๋ค:
1. LL(1) ๊นจ์ง๋ ์ด์
- left recursion
- common prefix
2. ํด๊ฒฐ ๋ฐฉ๋ฒ
- left recursion ์ ๊ฑฐ โ ๋ฐ๋ณต๋ฌธ
- left factoring โ prefix ๋ถ๋ฆฌ
3. ํต์ฌ ์กฐ๊ฑด
- FIRST disjoint
- FIRST vs FOLLOW disjoint
๐ 11ํ์ด์ง
๐ท ์ ๋ชฉ
Generality
๐ ํด์ ์ผ๋ฐ์ฑ
๐ท ๋ฌธ์ฅ
Question:
๐ ํด์ ์ง๋ฌธ
๐ท ๋ฌธ์ฅ
By left-factoring and elimination of left-recursion, can we transform any grammar such that it can be parsed with a single token lookahead?
๐ ํด์ left factoring๊ณผ left recursion ์ ๊ฑฐ๋ฅผ ํ๋ฉด ๋ชจ๋ ๋ฌธ๋ฒ์ 1-token lookahead๋ก ํ์ฑ ๊ฐ๋ฅํ ํํ๋ก ๋ฐ๊ฟ ์ ์์๊น?
๐ท ๋ฌธ์ฅ
Answer:
๐ ํด์ ๋ต
๐ท ๋ฌธ์ฅ
Given a context-free grammar that does not meet our conditions, it is undecidable whether an equivalent grammar exists that meets our conditions.
๐ ํด์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ CFG๊ฐ ์ฃผ์ด์ก์ ๋, ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์ผํ ๋ฌธ๋ฒ์ด ์กด์ฌํ๋์ง๋ ๊ฒฐ์ ๋ถ๊ฐ๋ฅํ๋ค
โ ์ค๋ช ๐ ํต์ฌ:
- ๋ชจ๋ CFG๋ฅผ LL(1)๋ก ๋ฐ๊ฟ ์ ์๋ ๊ฑด ์๋
- ์ฌ์ง์ด ๊ฐ๋ฅํ์ง์กฐ์ฐจ ํ๋จ ๋ถ๊ฐ๋ฅ
๐ ์ด๊ฑด ์ด๋ก ์ ์ผ๋ก ๋งค์ฐ ์ค์ํ statement (undecidable)
๐ท ์์
{ a^n 0 b^n } โช { a^n 1 b^2n }
๐ ํด์ ๋ ์ธ์ด์ ํฉ์งํฉ
โ ์ค๋ช ๐ ์ด ์ธ์ด๋:
- ์์ a ๋ง์ด ๋์ค๊ณ
- ์ค๊ฐ์ 0 ๋๋ 1
- ๋ค ๊ตฌ์กฐ๊ฐ ๋ฌ๋ผ์ง
๐ ๋ฌธ์ :
- ์ด๊ธฐ์๋ 0์ธ์ง 1์ธ์ง ๋ชจ๋ฆ โ ๋ง์ด ๋ด์ผ ํ๋จ ๊ฐ๋ฅ
- โ 1-token lookahead๋ก ๋ถ๊ฐ๋ฅ
๐ท ๋ฌธ์ฅ
Must look past an arbitrary number of aโs
๐ ํด์ a๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ด๊ฐ์ผ ํ๋จ ๊ฐ๋ฅ
๐ท ๋ฌธ์ฅ
However: most programming languages can be expressed with an LL(1) grammar
๐ ํด์ ํ์ง๋ง ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ LL(1)์ผ๋ก ํํ ๊ฐ๋ฅํ๋ค
๐ฅ ํต์ฌ
๐ ์ด๋ก ์ ์ผ๋ก๋ ์ ๋๋ ๊ฒฝ์ฐ ์กด์ฌ ๐ ํ์ง๋ง ์ค์ (์ธ์ด ์ค๊ณ)์ ๋๋ถ๋ถ LL(1) ๊ฐ๋ฅ
๐ 12ํ์ด์ง
๐ท ์ ๋ชฉ
FIRST
๐ ํด์ FIRST ์งํฉ
๐ท ๋ฌธ์ฅ
For a string ฮฑ, FIRST(ฮฑ) is
๐ ํด์ ๋ฌธ์์ด ฮฑ์ ๋ํด FIRST(ฮฑ)๋
๐ท ๋ฌธ์ฅ
the set of terminal symbols that start sentences derived from ฮฑ
๐ ํด์ ฮฑ๋ก๋ถํฐ ์ ๋๋ ๋ฌธ์์ด์ ์์์ ์ฌ ์ ์๋ terminal ์งํฉ
๐ท ์์
{ c โ Vt | ฮฑ โ* cฮฒ }
๐ ํด์ ฮฑ๋ก๋ถํฐ ์ ๋ํ์ ๋ ๋งจ ์์ ์ฌ ์ ์๋ terminal c
๐ท ๋ฌธ์ฅ
If ฮฑ โ ฮต then ฮต โ FIRST(ฮฑ)*
๐ ํด์ ฮฑ๊ฐ ฮต๋ก ์ ๋๋ ์ ์์ผ๋ฉด ฮต๋ ํฌํจ
โ ์ค๋ช ๐ FIRST๋ ๊ฒฐ๊ตญ: โ์ด ๋ฌธ์ฅ์ด ์์ํ ์ ์๋ ํ ํฐ๋คโ
๐ท ๋ฌธ์ฅ
FIRST(ฮฑ) contains the set of tokens valid in the initial position in ฮฑ
๐ ํด์ FIRST๋ ฮฑ์ ์์ ์์น์ ์ฌ ์ ์๋ ํ ํฐ ์งํฉ
๐ท ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ฅ 1
If X โ Vt then FIRST(X) = {X}
๐ ํด์ X๊ฐ terminal์ด๋ฉด FIRST๋ ์๊ธฐ ์์
๋ฌธ์ฅ 2
If X ::= ฮต then add ฮต
๐ ํด์ X๊ฐ ฮต์ด๋ฉด ฮต ์ถ๊ฐ
๋ฌธ์ฅ 3
X ::= Y1 Y2 โฆ Yk
๐ ํด์ X๊ฐ ์ฌ๋ฌ ๊ธฐํธ๋ก ๊ตฌ์ฑ๋ ๋
(a)
Put FIRST(Y1) - {ฮต} in FIRST(X)
๐ ํด์ Y1์ FIRST์์ ฮต ์ ์ธํ๊ณ ์ถ๊ฐ
(b)
๐ ํด์ ์์ ์ ๋ค์ด ฮต์ด๋ฉด ๋ค์ ๊ฒ๋ ์ถ๊ฐ
โ ์ค๋ช
- Y1, Y2 โฆ ๊ฐ ฮต ๊ฐ๋ฅํ๋ฉด
- โ Y2, Y3๋ ๊ณ ๋ ค
(c)
if all Yi derive ฮต โ add ฮต
๐ ํด์ ๋ชจ๋ ฮต ๊ฐ๋ฅํ๋ฉด ฮต ์ถ๊ฐ
๐ท ๋ฌธ์ฅ
Repeat until no more additions
๐ ํด์ ๋ ์ด์ ๋ณํ ์์ ๋๊น์ง ๋ฐ๋ณต
๐ฅ ํต์ฌ
FIRST ๊ณ์ฐ: ๐ ์ผ์ชฝ๋ถํฐ ๋ณด๋ฉด์ ํ์ฅ
๐ 13ํ์ด์ง
๐ท ์ ๋ชฉ
FIRST-Set Example 1
๐ท ๋ฌธ์ฅ
T ::= F T'
T' ::= "*" F T'
T' ::= ฮต
F ::= "(" T ")"
F ::= "ID"
๐ท ๊ฒฐ๊ณผ
FIRST(F) = { "(", "ID" }
๐ ํด์ F๋ โ(โ ๋๋ ID๋ก ์์
FIRST(T') = { "*", ฮต }
๐ ํด์ Tโ๋ โ*โ ๋๋ ฮต
FIRST(T) = { "(", "ID" }
๐ ํด์ T๋ ๊ฒฐ๊ตญ F๋ก ์์ โ ๋์ผ
โ ์ค๋ช ๐ T โ F Tโ โ ์์์ ํญ์ F โ ๋ฐ๋ผ์ FIRST(T) = FIRST(F)
๐ 14ํ์ด์ง
๐ท ์ ๋ชฉ
FIRST-Set Example 2
๐ท ๋ฌธ์ฅ
T ::= S F T'
T' ::= "*" S F T'
T' ::= ฮต
F ::= "ID"
F ::= "(" E ")"
S ::= "-"
S ::= ฮต
๐ท ๊ฒฐ๊ณผ
FIRST(S) = { "-", ฮต }
๐ ํด์ S๋ โ-โ ๋๋ ฮต
FIRST(T') = { "*", ฮต }
FIRST(F) = { "ID", "(" }
๐ท ํต์ฌ ๊ฒฐ๊ณผ
FIRST(T) = { "-", "ID", "(" }
โ ์ค๋ช (ํต์ฌ) ๐ T ::= S F Tโ โ S๊ฐ ฮต ๊ฐ๋ฅ โ ๊ทธ๋์ F๋ ๊ณ ๋ ค๋จ
๐ท ๋ฌธ์ฅ
Because S โ ฮต, FIRST(T) contains FIRST(F)
๐ ํด์ S๊ฐ ฮต์ด๋ฏ๋ก F๋ ํฌํจ๋จ
๐ฅ ํต์ฌ
๐ ฮต ์์ผ๋ฉด ๋ค์ ๊ธฐํธ๊น์ง ๋ณธ๋ค
๐ 15ํ์ด์ง
๐ท ์ ๋ชฉ
FOLLOW
๐ ํด์ FOLLOW ์งํฉ
๐ท ๋ฌธ์ฅ
For a non-terminal A, FOLLOW(A) is
๐ ํด์ ๋น๋จ๋ง A์ ๋ํด FOLLOW(A)๋
๐ท ๋ฌธ์ฅ
the set of terminals that can appear immediately to the right of A
๐ ํด์ A ๋ฐ๋ก ๋ค์ ์ฌ ์ ์๋ terminal ์งํฉ
โ ์ค๋ช ๐ FOLLOW = โA ๋ค์์ ๋ญ ์ฌ ์ ์๋โ
๐ท ๋ฌธ์ฅ
Note: a terminal symbol has no FOLLOW set
๐ ํด์ terminal์ FOLLOW ์์
๐ท ๋ฌธ์ฅ
Put $ in FOLLOW(S)
๐ ํด์ ์์๊ธฐํธ FOLLOW์๋ $ ์ถ๊ฐ
๐ท ์๊ณ ๋ฆฌ์ฆ
A ::= ฮฑ B ฮฒ
๐ ํด์ B ๋ค์ ฮฒ๊ฐ ์์
(a)
Put FIRST(ฮฒ) - {ฮต} in FOLLOW(B)
๐ ํด์ ฮฒ์ FIRST๋ฅผ B์ FOLLOW์ ์ถ๊ฐ
(b)
if ฮฒ = ฮต or ฮต โ FIRST(ฮฒ)
๐ ํด์ ฮฒ๊ฐ ์๊ฑฐ๋ ฮต ๊ฐ๋ฅํ๋ฉด
put FOLLOW(A) in FOLLOW(B)
๐ ํด์ A์ FOLLOW๋ฅผ B์ ์ถ๊ฐ
๐ท ๋ฌธ์ฅ
Repeat until no more additions
๐ ํด์ ๋ณํ ์์ ๋๊น์ง ๋ฐ๋ณต
๐ฅ ํต์ฌ
FOLLOW ๊ณ์ฐ: ๐ ์ค๋ฅธ์ชฝ ๋ณด๊ณ ๐ ฮต์ด๋ฉด ๋ถ๋ชจ FOLLOW๊น์ง ์ ๋ฌ
๐ฅ 11~15 ์ ์ฒด ํต์ฌ ์์ฝ
FIRST
- ์์ ํ ํฐ ์งํฉ
- ์ผ์ชฝ๋ถํฐ ๊ณ์ฐ
- ฮต ์์ผ๋ฉด ๋ค์๊น์ง ๋ด
FOLLOW
- ๋ค์ ์ฌ ์ ์๋ ํ ํฐ
- ฮฒ ๋ณด๊ณ ๊ฒฐ์
- ฮต์ด๋ฉด ๋ถ๋ชจ FOLLOW ์ ๋ฌ
์ค์ํ ํฌ์ธํธ
| ๊ฐ๋ | ์๋ฏธ |
|---|---|
| FIRST | ์์ ํ ํฐ |
| FOLLOW | ๋ค์ ์ฌ ํ ํฐ |
๐ 16ํ์ด์ง
๐ท ์ ๋ชฉ
FOLLOW Set Example 1
๐ท ๋ฌธ์ฅ (๋ฌธ๋ฒ)
Sentence ::= Subject Verb "."
Subject ::= "the" X Y
X ::= "dog"
Y ::= "owner" | ฮต
Verb ::= "eats"
๐ ํด์ ๋ฌธ์ฅ ๊ตฌ์กฐ:
- Sentence โ Subject Verb โ.โ
- Subject โ โtheโ X Y
- X โ โdogโ
- Y โ โownerโ ๋๋ ฮต
- Verb โ โeatsโ
๐ท ๋ฌธ์ฅ
According to Rule 2(a), FIRST(Y) - ฮต must be added to FOLLOW(X)
๐ ํด์ Rule 2(a)์ ๋ฐ๋ผ FIRST(Y) - ฮต์ FOLLOW(X)์ ์ถ๊ฐ
โ ๊ณ์ฐ
FIRST(Y) = { "owner", ฮต }
๐ ฮต ์ ์ธํ๋ฉด: {"owner"}
๐ ๋ฐ๋ผ์:
FOLLOW(X) โ {"owner"}
๐ท ๋ฌธ์ฅ
Because Y โ ฮต, FOLLOW(Subject) must be added to FOLLOW(X)
๐ ํด์ Y๊ฐ ฮต์ด๋ฏ๋ก FOLLOW(Subject)๋ฅผ FOLLOW(X)์ ์ถ๊ฐ
โ ์ค๋ช ๐ ๊ตฌ์กฐ:
Subject ::= "the" X Y
๐ Y๊ฐ ฮต์ด๋ฉด:
- X ๋ค์ โ Y ์์ โ Subject ๋ค์์ผ๋ก ๋์ด๊ฐ
๐ท ๋ฌธ์ฅ
FOLLOW(X) = {โownerโ, โeatsโ}
๐ ํด์ ์ต์ข FOLLOW(X) = {โownerโ, โeatsโ}
โ ์ โeatsโ ๋์ค๋ ๐ Sentence:
Sentence ::= Subject Verb "."
๐ Subject ๋ค์ โ Verb โ โeatsโ
๐ฅ ํต์ฌ
FOLLOW ๊ณ์ฐ ํต์ฌ:
- ์ค๋ฅธ์ชฝ FIRST ์ถ๊ฐ
- ฮต์ด๋ฉด ๋ถ๋ชจ FOLLOW ์ ๋ฌ
๐ 17ํ์ด์ง
๐ท ์ ๋ชฉ
FOLLOW-Sets: Processing Production A ::= ฮฑBฮฒ
๐ ํด์ FOLLOW ๊ณ์ฐ์์ A ::= ฮฑBฮฒ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
๐ท ๋ฌธ์ฅ
For each production A ::= ฮฑBฮฒ, Rule (2) must be applied
๐ ํด์ ๊ฐ production๋ง๋ค Rule(2)๋ฅผ ์ ์ฉํด์ผ ํ๋ค
๐ท ๋ฌธ์ฅ
ฮฑ is a string
๐ ํด์ ฮฑ๋ ๋ฌธ์์ด
๐ท ๋ฌธ์ฅ
B is a single non-terminal
๐ ํด์ B๋ ํ๋์ ๋น๋จ๋ง
๐ท ๋ฌธ์ฅ
ฮฒ is a string
๐ ํด์ ฮฒ๋ ๋ฌธ์์ด
๐ท ํต์ฌ ๋ฌธ์ฅ
B may match in zero, one or more positions
๐ ํด์ B๋ ์ฌ๋ฌ ์์น์ ๋ฑ์ฅํ ์ ์๋ค
โ ์ค๋ช ๐ ์:
A ::= B B B
โ B๊ฐ 3๋ฒ ๋ฑ์ฅ
โ ๊ฐ๊ฐ ๋ฐ๋ก ๊ณ์ฐํด์ผ ํจ
๐ท ๋ฌธ์ฅ
Rule (2) will have to be applied multiple times
๐ ํด์ Rule(2)๋ ์ฌ๋ฌ ๋ฒ ์ ์ฉ๋๋ค
๐ฅ ํต์ฌ
๐ FOLLOW๋ โํ ๋ฒ ๊ณ์ฐํ๊ณ ๋โ์ด ์๋๋ผ ๐ ๋ชจ๋ ์์น์์ ๋ฐ๋ณต ์ ์ฉ
๐ 18ํ์ด์ง
๐ท ์ ๋ชฉ
Anchoring the ฮฑBฮฒ Pattern
๐ ํด์ ฮฑBฮฒ ํจํด์ ์ด๋์ ์ ์ฉํ๋์ง
๐ท ๋ฌธ์ฅ
Assume production Tโ ::= โ*โ F Tโ
๐ ํด์ Tโ โ โ*โ F Tโ
โ ๊ทธ๋ฆผ ์ค๋ช (์ค์) ์ฌ๋ผ์ด๋ ๊ทธ๋ฆผ: ๐ ฮฑ B ฮฒ ์์น๊ฐ 3๊ฐ ์กด์ฌ
๐ท Position 1
B = Tโ
๐ FOLLOW(Tโ) ๊ณ์ฐ
๐ท Position 2
B = F
๐ FOLLOW(F) ๊ณ์ฐ
๐ท Position 3
B = โ*โ
๐ terminal โ FOLLOW ์์
โ ํต์ฌ ์ค๋ช ๐ ํ๋์ production์์๋: ์ฌ๋ฌ B ์์น๋ง๋ค ๋ฐ๋ก ๊ณ์ฐ
๐ฅ ํต์ฌ
๐ FOLLOW ๊ณ์ฐ์: ๋ชจ๋ ์์น์์ ฮฑBฮฒ ํํ๋ฅผ ์ฐพ์์ผ ํ๋ค
๐ 19ํ์ด์ง
๐ท ์ ๋ชฉ
FOLLOW-Set Example 2
๐ท ๋ฌธ๋ฒ
T ::= F T'
T' ::= "*" F T'
T' ::= ฮต
F ::= "(" T ")"
F ::= "ID"
๐ท ์ด๊ธฐ ์ํ
FOLLOW(T) = {$}
FOLLOW(T') = {}
FOLLOW(F) = {}
๐ท Iteration 1
๐ ๊ณ์ฐ ์งํ
๊ฒฐ๊ณผ:
T: {$, ")"}
T': {$, ")"}
F: {"*", $, ")"}
๐ท Iteration 2
T: {$, ")"}
T': {$}
F: {"*", $}
๐ท Iteration 3 (์ต์ข )
T: {$, ")"}
T': {$, ")"}
F: {"*", $, ")"}
๐ท ๋ฌธ์ฅ
The order is arbitrary
๐ ํด์ ๊ณ์ฐ ์์๋ ์ค์ํ์ง ์๋ค
๐ท ๋ฌธ์ฅ
A different order may require different iterations
๐ ํด์ ์์์ ๋ฐ๋ผ ๋ฐ๋ณต ํ์๋ ๋ฌ๋ผ์ง ์ ์๋ค
๐ท ๋ฌธ์ฅ
Processing terminates when no more change
๐ ํด์ ๋ ์ด์ ๋ณํ ์์ผ๋ฉด ์ข ๋ฃ
๐ฅ ํต์ฌ
๐ FOLLOW๋: ๊ณ ์ ์ ๋ฐ๋ณต (fixpoint iteration)
๐ 20ํ์ด์ง
๐ท ์ ๋ชฉ
LL(1) Grammars
๐ท ๋ฌธ์ฅ
Given FIRST and FOLLOW sets, we can define LL(1)
๐ ํด์ FIRST์ FOLLOW๋ก LL(1) ์ ์ ๊ฐ๋ฅ
๐ท ์ ์
A โ ฮฑ | ฮฒ
๐ท ์กฐ๊ฑด 1
FIRST(ฮฑ) โฉ FIRST(ฮฒ) = โ
๐ ํด์ FIRST๋ผ๋ฆฌ ๊ฒน์น๋ฉด ์ ๋จ
๐ท ์กฐ๊ฑด 2
ฮฑ โ* ฮต์ด๋ฉด FIRST(ฮฒ) โฉ FOLLOW(A) = โ
๐ ํด์ ฮฑ๊ฐ ฮต์ด๋ฉด ฮฒ์ FIRST์ FOLLOW(A)๋ ์ ๊ฒน์ณ์ผ ํจ
๐ท ์กฐ๊ฑด 3
ฮฒ โ* ฮต์ด๋ฉด FIRST(ฮฑ) โฉ FOLLOW(A) = โ
๐ ํด์ ฮฒ๊ฐ ฮต์ด๋ฉด ฮฑ์ FOLLOW๋ ์ ๊ฒน์ณ์ผ ํจ
โ ์ค๋ช (์ง์ง ์ค์) ๐ ์ด์ :
- ฮต๊ฐ ๋์ค๋ฉด
- โ ๋ค์ ํ ํฐ์ผ๋ก ํ๋จํด์ผ ํจ
๐ฅ ์ต์ข ํต์ฌ
LL(1) ์กฐ๊ฑด 3๊ฐ:
- FIRST vs FIRST disjoint
- ฮต ์์ผ๋ฉด FIRST vs FOLLOW ์ฒดํฌ
- ๋ฐ๋์ชฝ๋ ๋์ผ
๐ฅ 16~20ํ์ด์ง ์ ์ฒด ํต์ฌ ์์ฝ
FOLLOW ๊ณ์ฐ ํต์ฌ
- FIRST(ฮฒ) ์ถ๊ฐ
- ฮต์ด๋ฉด FOLLOW ์ ๋ฌ
- ๋ชจ๋ ์์น ๋ฐ๋ณต
LL(1) ์ ์ ์์ฑ ๐ ๊ฒฐ๊ตญ: ์ถฉ๋ ์์ด 1๊ฐ ํ ํฐ์ผ๋ก ์ ํ ๊ฐ๋ฅํด์ผ ํจ
์ํ ํต์ฌ ํฌ์ธํธ
- FIRST ๊ณ์ฐ ๊ท์น
- FOLLOW ๊ณ์ฐ ๊ท์น
- LL(1) ์กฐ๊ฑด 3๊ฐ
๐ 21ํ์ด์ง
๐ท ์ ๋ชฉ
An Example from our MiniC CFG: for-loops
๐ ํด์ MiniC ๋ฌธ๋ฒ์์ for๋ฌธ ์์
๐ท ๋ฌธ์ฅ
for_stmt ::= "for" "(" a_expr ";" ... ")" stmt
๐ ํด์ for๋ฌธ ๊ตฌ์กฐ:
- โforโ ( a_expr ; โฆ ) stmt
๐ท ๋ฌธ์ฅ
a_expr ::= "ID" "=" expr | ฮต
๐ ํด์ a_expr๋:
- ID = expr
- ๋๋ ์์ (ฮต)
๐ท ๋ฌธ์ฅ
FOLLOW(a_expr) = {โ;โ}
๐ ํด์ a_expr ๋ค์์๋ ๋ฐ๋์ โ;โ๊ฐ ์จ๋ค
๐ท ๋ฌธ์ฅ
FIRST(ฮฑ) = {โIDโ}
๐ ํด์ ฮฑ (= ID = expr)๋ ID๋ก ์์
๐ท ๋ฌธ์ฅ
disjoint!
๐ ํด์ ๊ฒน์น์ง ์๋๋ค
โ ์ค๋ช ๐ a_expr ๋ ๊ฒฝ์ฐ:
- โIDโ โ=โ expr โ FIRST = {ID}
- ฮต โ FOLLOW(a_expr) = {โ;โ}
๐ฅ ํต์ฌ ํ๋จ
๐ LL(1) ์กฐ๊ฑด ์ฒดํฌ:
FIRST(ID) โฉ FOLLOW(a_expr) = โ
๐ ID vs โ;โ โ ๊ฒน์น์ง ์์
๐ท ๋ฌธ์ฅ
In conclusion, the a_expr production does not prevent the CFG from being LL(1)
๐ ํด์ ๊ฒฐ๋ก : ์ด ๋ฌธ๋ฒ์ LL(1) ์กฐ๊ฑด์ ๊นจ์ง ์๋๋ค
๐ฅ ํต์ฌ
๐ ฮต ์๋ ๊ฒฝ์ฐ๋ ๋ฐ๋์: FIRST vs FOLLOW ์ถฉ๋ ์ฒดํฌ
๐ 22ํ์ด์ง
๐ท ์ ๋ชฉ
Non-LL(1) Grammar Examples
๐ ํด์ LL(1)์ด ์๋ ๋ฌธ๋ฒ ์์
๐ท LL(1) ์กฐ๊ฑด ๋ค์ ์ ์
๐ ์์์ ๋ฐฐ์ด ์กฐ๊ฑด ๊ทธ๋๋ก ๋ฐ๋ณต
๐ท ์์ 1
S โ S a | a
๐ ํด์ S โ Sa ๋๋ a
โ ๋ฌธ์ ๐ left recursion ์กด์ฌ โ LL(1) ์๋
๐ท ์์ 2
S โ a S | a
โ ๋ฌธ์
FIRST(aS) = {a}
FIRST(a) = {a}
๐ ๊ฒน์นจ โ LL(1) ์๋
๐ท ์์ 3
S โ a R | ฮต
R โ S | ฮต
โ ๋ฌธ์ ๐ ฮต ๋๋ฌธ์ FOLLOW๊น์ง ๊ณ ๋ คํด์ผ ํจ
๐ท ๋ฌธ์ฅ
FIRST(S) โฉ FOLLOW(R) โ โ
๐ ํด์ FIRST(S)์ FOLLOW(R)๊ฐ ๊ฒน์น๋ค
โ ์ค๋ช ๐ ฮต ๋๋ฌธ์: ์ด๋ค production ์ธ์ง ๋ชจํธํด์ง
๐ท ์์ 4
S โ a R a
R โ S | ฮต
โ ๋ฌธ์ ๐ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์์ โ FIRST/FOLLOW ์ถฉ๋ ๋ฐ์
๐ฅ ํต์ฌ
LL(1) ๊นจ์ง๋ 3๊ฐ์ง:
- left recursion
- FIRST ์ถฉ๋
- FIRST-FOLLOW ์ถฉ๋
๐ 23ํ์ด์ง
๐ท ์ ๋ชฉ
Outlook
๐ ํด์ ์ ๋ฆฌ ๋ฐ ๋ค์ ๋ด์ฉ
๐ท ๋ฌธ์ฅ
Syntax and Semantics โ
๐ ํด์ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ โ (์๋ฃ)
๐ท ๋ฌธ์ฅ
CFGs, BNF, EBNF โ
๐ ํด์ ๋ฌธ๋ฒ ์ ์ โ
๐ท ๋ฌธ์ฅ
Grammar transformations โ
๐ ํด์ ๋ฌธ๋ฒ ๋ณํ โ
๐ท ๋ฌธ์ฅ
Top-down parsing (LL) โ
๐ ํด์ ํ๋ค์ด ํ์ฑ โ
๐ท ๋ฌธ์ฅ
Recursive descent parser construction โ
๐ ํด์ ์ฌ๊ท ํ๊ฐ ํ์ ๊ตฌํ โ
๐ท ๋ฌธ์ฅ
LL Grammars โ
๐ ํด์ LL ๋ฌธ๋ฒ โ
๐ท ๋ฌธ์ฅ
AST Construction
๐ ํด์ AST ์์ฑ (๋ค์ ์ฃผ์ )
๐ท ๋ฌธ์ฅ
Parse trees vs ASTs
๐ ํด์ ํ์คํธ๋ฆฌ vs AST
๐ท ๋ฌธ์ฅ
Chomskyโs Hierarchy
๐ ํด์ ์ด์คํค ๊ณ์ธต
โ ์ค๋ช ๐ ์ด๋ฒ ๊ฐ์: LL(1)๊น์ง ์์ ํ ๋๋จ ๐ ๋ค์: AST + ๋ฌธ๋ฒ ์ด๋ก
๐ฅ ์ ์ฒด ๊ฐ์ (1~23) ์ต์ข ํต์ฌ ์ ๋ฆฌ
๐ฅ 1. LL(1)์ ๋ณธ์ง
๐ 1๊ฐ ํ ํฐ์ผ๋ก ๊ท์น ์ ํ ๊ฐ๋ฅ
๐ฅ 2. LL(1) ๊นจ์ง๋ ์ด์
- left recursion
- common prefix
- ambiguity
- FIRST ์ถฉ๋
- FIRST-FOLLOW ์ถฉ๋
๐ฅ 3. ํด๊ฒฐ ๋ฐฉ๋ฒ
- left recursion ์ ๊ฑฐ โ ๋ฐ๋ณต๋ฌธ
- left factoring โ prefix ์ ๊ฑฐ
๐ฅ 4. FIRST
๐ ์์ ๊ฐ๋ฅํ ํ ํฐ
๐ฅ 5. FOLLOW
๐ ๋ค์ ์ฌ ์ ์๋ ํ ํฐ
๐ฅ 6. LL(1) ์กฐ๊ฑด (์ํ ํต์ฌ)
- FIRST(ฮฑ) โฉ FIRST(ฮฒ) = โ
- ฮต ์์ผ๋ฉด FIRST vs FOLLOW ์ฒดํฌ
๐ฅ 7. ์ค์ ํ๋จ ํ๋ฆ (์ด๊ฑฐ ์ธ์๋ผ)
๋ฌธ๋ฒ ๋ณด๋ฉด:
- FIRST ๊ณ์ฐ
- FOLLOW ๊ณ์ฐ
- ์ถฉ๋ ํ์ธ
๐ฅ ์ง์ง ์ํ ํฌ์ธํธ
- FIRST ๊ณ์ฐ ๋ฌธ์
- FOLLOW ๊ณ์ฐ ๋ฌธ์
- LL(1) ํ๋ณ ๋ฌธ์
- left recursion ์ ๊ฑฐ
- left factoring
Leave a comment