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๊ฐœ:

  1. LL(1) = 1-token lookahead
  2. FIRST ์ง‘ํ•ฉ ์ค‘์š”
  3. ๊ฒน์น˜๋ฉด ํŒŒ์‹ฑ ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ“‹ 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๊ฐœ:

  1. FIRST๋ผ๋ฆฌ ์•ˆ ๊ฒน์นจ
  2. 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๊ฐœ:

  1. FIRST vs FIRST disjoint
  2. ฮต ์žˆ์œผ๋ฉด FIRST vs FOLLOW ์ฒดํฌ
  3. ๋ฐ˜๋Œ€์ชฝ๋„ ๋™์ผ

๐Ÿ”ฅ 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๊ฐ€์ง€:

  1. left recursion
  2. FIRST ์ถฉ๋Œ
  3. 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) ์กฐ๊ฑด (์‹œํ—˜ ํ•ต์‹ฌ)

  1. FIRST(ฮฑ) โˆฉ FIRST(ฮฒ) = โˆ…
  2. ฮต ์žˆ์œผ๋ฉด FIRST vs FOLLOW ์ฒดํฌ

๐Ÿ”ฅ 7. ์‹ค์ „ ํŒ๋‹จ ํ๋ฆ„ (์ด๊ฑฐ ์™ธ์›Œ๋ผ)

๋ฌธ๋ฒ• ๋ณด๋ฉด:

  1. FIRST ๊ณ„์‚ฐ
  2. FOLLOW ๊ณ„์‚ฐ
  3. ์ถฉ๋Œ ํ™•์ธ

๐Ÿ”ฅ ์ง„์งœ ์‹œํ—˜ ํฌ์ธํŠธ

  • FIRST ๊ณ„์‚ฐ ๋ฌธ์ œ
  • FOLLOW ๊ณ„์‚ฐ ๋ฌธ์ œ
  • LL(1) ํŒ๋ณ„ ๋ฌธ์ œ
  • left recursion ์ œ๊ฑฐ
  • left factoring

Categories:

Updated:

Leave a comment