Lexical Analysis Part 3
COMP321 Compiler โ Lexical Analysis Part 3
Kyungpook National University | Hwisoo So | Spring 2026
๐ 1ํ์ด์ง โ ์ ๋ชฉ
Lexical Analysis โ Part 3
์ดํ ๋ถ์ โ 3๋ฒ์งธ ํํธ
์ปดํ์ผ๋ฌ์ Lexical Analysis(์ค์บ๋ ๋จ๊ณ)๋ฅผ ๋ค๋ฃจ๋ ๊ฐ์์ ์ธ ๋ฒ์งธ ํํธ๋ค.
์ฆ, ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ์ฐ์ฅ์ + ๋ ์ฌํ๋ ๋ด์ฉ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- Hwisoo So โ ์ํ์ (๊ฐ์์ ์ด๋ฆ) โ ์ด ๊ฐ์๋ฅผ ์งํํ๋ ๊ต์๋ ์ด๋ฆ์ด๋ค.
- Kyungpook National University โ ๊ฒฝ๋ถ๋ํ๊ต โ ๊ฐ์๊ฐ ์งํ๋๋ ์์ ๋ํ
- COMP321 Compiler Spring 2026 โ ์ปดํ์ผ๋ฌ ๊ณผ๋ชฉ (COMP321), 2026๋ ๋ดํ๊ธฐ โ ์ด ๊ฐ์๊ฐ ์ด๋ค ๊ณผ๋ชฉ์ด๊ณ ์ธ์ ์งํ๋๋์ง ๋ช ์
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- ์ค์: Lexical Analysis โ Part 3 (์ ๋ชฉ)
- ์๋: ๊ต์ ์ด๋ฆ + ํ๊ต ๋ก๊ณ
์ด ํ์ด์ง๋ ์์ ํ ํ์ง(slide cover)๋ค. ๋ด์ฉ ์์, ๋จ์ํ ๊ฐ์ ์์ ์๋ฆผ ์ญํ .
๐ 2ํ์ด์ง โ Outline (๊ฐ์ ๊ฐ์)
The role of a scanner โ
์ค์บ๋์ ์ญํ โ
์ด๋ฏธ ๋ฐฐ์ด ๋ด์ฉ์ด๋ผ๋ ์๋ฏธ โ scanner = ๋ฌธ์์ด โ ํ ํฐ์ผ๋ก ์ชผ๊ฐ๋ ์ญํ
Scanner concepts โ
์ค์บ๋ ๊ฐ๋ โ
Tokens, Lexemes, Patterns โ ํต์ฌ 3๊ฐ ๊ฐ๋
- Lexeme: ์ค์ ๋ฌธ์์ด (์: โifโ, โabcโ)
- Token: ๋ถ๋ฅ (์: IF, ID ๋ฑ)
- Pattern: ๊ท์น (์ ๊ท์)
Regular Expression & Automata (to be continuedโฆ)
์ ๊ทํํ์๊ณผ ์คํ ๋งํ (๊ณ์ ์งํ ์์ )
์ด ํํธ๊ฐ ์ง๊ธ ๊ฐ์์ ํต์ฌ ์ฃผ์
| ํญ๋ชฉ | ์ํ |
|---|---|
| Definitions of REs, DFAs and NFAs | โ ์๋ฃ โ ์ด๋ฏธ ๋ฐฐ์ด ๋ด์ฉ |
| REs โ NFA | โ ์๋ฃ โ Thompson construction ์ฌ์ฉ |
| (Thompsonโs construction, Algorithmโฆ) | ์ฑ ๊ธฐ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฒํธ๊น์ง ๋ช ์ โ ์ํ ๋ฒ์ ๋๋ ๊ฐํจ |
| NFA โ DFA (subset constructionโฆ) | ํต์ฌ ์๊ณ ๋ฆฌ์ฆ โ ์ดํ ์ฌ๋ผ์ด๋์์ ์์ธํ ๋์ด |
| DFA โ minimal-state DFA | ์ํ ์ต์ํ โ ์ฑ๋ฅ ์ต์ ํ ๋จ๊ณ |
| Scanner generators | ์ด๋ฒ ๊ฐ์์์ ์๋ก ๋์ฌ ํต์ฌ |
| Extra materials | ์ถ๊ฐ ์๋ฃ |
Todayโs agenda โ ์ค๋์ ๊ฐ์ ๊ณํ
์ด ํ์ด์ง๋ ์ ์ฒด ๊ฐ์ ํ๋ฆ ์ ๋ฆฌ โ ์ง๊ธ๋ถํฐ scanner generator ์ค์ฌ์ผ๋ก ๊ฐ๋ค
๐ 3ํ์ด์ง โ Scanner Generators
Scanner Generators
์ค์บ๋ ์์ฑ๊ธฐ
ํต์ฌ ๋ฉ์์ง: โ์ค์บ๋๋ ์ง์ ์งค ์๋ ์์ง๋ง ์๋ ์์ฑ๋ ๊ฐ๋ฅํ๋คโ
Scanners generated in C (C๋ก ์์ฑ๋๋ ์ค์บ๋)
- lex (UNIX) โ ๊ฐ์ฅ ์ ํต์ ์ธ lexer ์์ฑ๊ธฐ
- flex (GNUโs fast lex, UNIX) โ lex์ ์ ๊ทธ๋ ์ด๋ ๋ฒ์
- Mks lex (MS-DOS, Windows, OS/2) โ ์๋์ฐ ๊ณ์ด
Scanners generated in Java (Java๋ก ์์ฑ๋๋ ์ค์บ๋)
- Jlex (Princeton University) โ ํ๋ฆฐ์คํด ๋ํ
- JFlex
- JavaCC (SUN Microsystems โ now, Oracle)
์์ผ๋ก๋ JLex ๊ธฐ์ค์ผ๋ก ์ค๋ช ์งํ
๐ 4ํ์ด์ง โ The Scanner Spec in JLex
The Scanner Spec in JLex
JLex์์์ ์ค์บ๋ ๋ช ์ธ
JLex ํ์ผ์ ์ธ ๋ถ๋ถ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค:
[์ ์ ์ฝ๋]
%%
[์ ์ธ]
%%
[์ ๊ท์ ๊ท์น]
| ๊ตฌ๊ฐ | ์๋ฏธ |
|---|---|
| user code | ์ฌ์ฉ์ ์ฝ๋ โ ์ฌ๊ธฐ์ ์์ฑํ ์ฝ๋๋ ๊ทธ๋๋ก ์์ฑ๋ scanner ์ฝ๋์ ๋ค์ด๊ฐ |
| %% | ๊ตฌ๋ถ์ |
| JLEX directives (declarations) | JLex ์ง์๋ฌธ (์ ์ธ) โ ๋ณ์, ์ ์ ๋ฑ ์์ฑ |
| %% | ๊ตฌ๋ถ์ |
| regular expression rules | ์ ๊ทํํ์ ๊ท์น โ ํต์ฌ ๋ถ๋ถ, ํ ํฐ ์ ์ํ๋ ๊ณณ |
์ด ๊ตฌ์กฐ๋ ์ํ์ ์์ฃผ ๋์ด
๐ 5ํ์ด์ง โ How a Scanner Generator Works
How a Scanner Generator Works
์ค์บ๋ ์์ฑ๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋๊ฐ
๋ด๋ถ ๋์ ํ๋ฆ (๋งค์ฐ ์ค์)
RE โ NFA โ DFA โ ์ต์ DFA
- ์ฌ๋์ด ์ ๊ท์ ์์ฑ
- ์ปดํจํฐ๊ฐ ์๋์ผ๋ก NFA ์์ฑ
- DFA๋ก ๋ณํ
- ์ํ ์ต์ํ
- ์ต์ข scanner ์ฝ๋ ์์ฑ
์ด๊ฒ ์ปดํ์ผ๋ฌ ์ด๋ก ํต์ฌ ํ๋ฆ์ด๋ค.
๋ ๊ฐ์ง ๊ตฌํ ๋ฐฉ์
| ๋ฐฉ์ | ์ค๋ช |
|---|---|
| Table-driven code (JLex) | ํ ์ด๋ธ ๊ธฐ๋ฐ ์ฝ๋ โ ์ ๋ ฅ์ ๋ํด DFA๋ฅผ ์๋ฎฌ๋ ์ด์ , ์ํ ์ ์ด๋ฅผ ํ ์ด๋ธ๋ก ๊ด๋ฆฌ |
| Hard-wired code (Direct-coded) | ํ๋์ฝ๋ฉ ๋ฐฉ์ โ ์ฐ๋ฆฌ๊ฐ ์ง์ if๋ฌธ์ผ๋ก ๋ง๋ scanner, like our hand-crafted scanner for Assignment #1 |
- Assignment #1 = Scanner + Parser โ ๊ณผ์ 1์ ์ค์บ๋ + ํ์์๋ค
์ด ํ์ด์ง ํต์ฌ ์์ฝ
์ค์บ๋ ๋ง๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ: ์๋ ์์ฑ(JLex) vs ์ง์ ๊ตฌํ(Assignment)
๋ด๋ถ ์๋ฆฌ๋ ๋์ผ: RE โ NFA โ DFA โ ์ต์ DFA
๐ 6ํ์ด์ง โ Table-driven vs. Directed-coded Scanners
Table-driven vs. Directed-coded Scanners
ํ ์ด๋ธ ๊ธฐ๋ฐ vs ์ง์ ์ฝ๋ ๊ธฐ๋ฐ ์ค์บ๋
Direct-coded ๋ฐฉ์ ์์ (์ฝ๋)
switch (currentChar) {
case '+': return token representation for '+';
case '<':
takeIt();
if (currentChar == '=')
return token representation for '<=';
else
return token representation for '<';
}
case '+': โ+โ์ด๋ฉด + ํ ํฐ ๋ฐํ โ ์ง์ ๊ตฌํ ๋ฐฉ์, ๋ฌธ์ ํ๋ ๋ณด๊ณ ๋ฐ๋ก ํ ํฐ ๊ฒฐ์ case '<': โ<โ๋ฅผ ์ฝ๊ณ ๋ค์ ๋ฌธ์๊ฐ โ=โ์ด๋ฉด โ<=โ ์๋๋ฉด โ<โ
Direct-coded ๋ฐฉ์์ ๋ํ ์์: < ์ฝ์ โ ๋ค์ ๋ฌธ์ ํ์ธ(lookahead) โ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฒ๋ฆฌ
์ฆ, ์ฝ๋ ํ๋ฆ ์์ฒด๊ฐ ์ํ ๋จธ์ ์ญํ ์ ํจ
์ผ์ชฝ ํ โ Table encoding RE (DFA transition table)
- ์ํ: s0, s1, s2, se
- ์ ๋ ฅ: 0~9, ๊ธฐํ ๋ฌธ์
- ฮด(state, input) = next state
์: s0์์ ์ซ์ โ s1 / s1์์ ์ซ์ โ s2 / ์์ ํ ์๋ ์์ฑ๋ ํํ
์ค๋ฅธ์ชฝ ์ฝ๋ โ Skeleton recognizer (Table-driven scanner ํต์ฌ ๊ตฌ์กฐ)
Char โ next character
State โ s0
while (Char โ EOF)
State โ ฮด(State, Char)
Char โ next character
if (State is a final state)
then report success
else report failure
- ๋ฌธ์ ํ๋ ์ฝ๊ณ ์ํ ๊ฐฑ์ โ EOF๊น์ง ๋ฐ๋ณต โ ๋ง์ง๋ง ์ํ๊ฐ final์ด๋ฉด ์ฑ๊ณต
- ์ํ ์ ์ด๋ ํจ์ ฮด๋ก ์ฒ๋ฆฌ, ์ค์ ๊ตฌํ์ โํ ์ด๋ธ lookupโ
๐ฅ ํต์ฌ ๋น๊ต
| ๋ฐฉ์ | ํน์ง |
|---|---|
| Table-driven | ํ ์ด๋ธ ๊ธฐ๋ฐ DFA |
| Direct-coded | if/switch ๊ธฐ๋ฐ |
๐ 7ํ์ด์ง โ Ease of Implementation & Performance
Ease of Implementation & Performance
๊ตฌํ ๋์ด๋์ ์ฑ๋ฅ
Table-driven scanner
โํ ์ด๋ธ ๊ธฐ๋ฐ ์ค์บ๋๋ ์คํ ๋งํ๋ฅผ ํฐ ํ ์ด๋ธ๋ก ํํํ๋คโ
- Costly lookup โ ์ํ + ์ ๋ ฅ โ ํ ์ด๋ธ index ๊ณ์ฐ ํ์, cache ํจ์จ ์ ์ข์
- Easy, automated way to implement โ JLex ๊ฐ์ ๋๊ตฌ๊ฐ ์ด ๋ฐฉ์
- Hard to implement manually โ ์ง์ ๊ตฌํ์ ์ด๋ ต๋ค
Direct-coded scanner
โ์ง์ ๊ตฌํ ์ค์บ๋๋ ํ๋ก๊ทธ๋จ ํ๋ฆ ์์ฒด๋ก ์คํ ๋งํ๋ฅผ ํํํ๋คโ
- if๋ฌธ / switch๋ฌธ ์์ฒด๊ฐ ์ํ ๋จธ์
- Automated and manual implementations feasible โ ์๋ ์์ฑ๋ ๊ฐ๋ฅํ๊ณ ์ง์ ๊ตฌํ๋ ๊ฐ๋ฅ
- No table and thus no table lookup needed โ ํ ์ด๋ธ์ด ์์ด์ lookup ํ์ ์์
- More complex control flow โ ์ ์ด ํ๋ฆ์ด ๋ ๋ณต์กํจ
- Ok for architectures with good branch prediction โ x86 ๊ฐ์ CPU์์๋ ๊ด์ฐฎ๋ค
- Tends to be faster than table-driven scanner โ ์ผ๋ฐ์ ์ผ๋ก ๋ ๋น ๋ฆ
๐ฅ ํต์ฌ ์ ๋ฆฌ
| ๋ฐฉ์ | ํน์ง |
|---|---|
| Table-driven | ๊ตฌํ ์ฌ์, ๋๋ฆผ |
| Direct-coded | ๊ตฌํ ์ด๋ ค์, ๋น ๋ฆ |
๐ 8ํ์ด์ง โ JLex Example Spec
JLex Example Spec
JLex ์์ ๋ช ์ธ
%%
LETTER=[a-zA-Z_]
DIGIT=[0-9]
"if" { return new Token(Token.IF, "if", src_pos); }
"<" { ... }
"<=" { ... }
{LETTER}({LETTER}|{DIGIT})* { return new Token(Token.ID, "spelling", src_pos); }
- LETTER=[a-zA-Z_] โ ์ํ๋ฒณ + ์ธ๋๋ฐ
- DIGIT=[0-9] โ ์ซ์
- โifโ { return new Token(Token.IF, โฆ) } โ keyword ์ฒ๋ฆฌ, โifโ๊ฐ ๋์ค๋ฉด IF ํ ํฐ ๋ฐํ
- โ<โ โ LESS ํ ํฐ
- โ<=โ โ LESS_EQ ํ ํฐ
-
**{LETTER}({LETTER} {DIGIT})*** โ ๋ฌธ์๋ก ์์ํ๊ณ ์ดํ ๋ฌธ์/์ซ์ ๋ฐ๋ณต โ identifier ์ ์ - return new Token(Token.ID, โฆ) โ ID ํ ํฐ ๋ฐํ
๋ ๊ฐ์ง ํต์ฌ ๊ท์น (Two rules)
-
์ฒซ ๋ฒ์งธ ํจํด ์ฐ์ (์ฐ์ ์์ = ์์ ์๋ ๊ท์น)
์ฌ๋ฌ ํจํด์ด ๋งค์นญ๋๋ฉด ์ฒซ ๋ฒ์งธ ์ฌ์ฉ โ ์:if๋ identifier๊ฐ ์๋๋ผ keyword(IF)๋ก ์ฒ๋ฆฌ -
Longest match (๊ฐ์ฅ ๊ธด ๋ฌธ์์ด ๋งค์นญ)
<=vs<โ<=์ ํ๋จ
๐ 9ํ์ด์ง โ NFA for JLex Example Spec
NFA for JLex Example Spec
JLex ์์ ์ NFA
โThe NFAs for the different REs are combined as aboveโ
๊ฐ ์ ๊ท์์ NFA๋ฅผ ํฉ์น๋ค
๊ตฌ์กฐ:
s0
โโ ฮต โ if ํจํด NFA
โโ ฮต โ < ํจํด NFA
โโ ฮต โ <= ํจํด NFA
โโ ฮต โ id ํจํด NFA
ฮต-transition์ผ๋ก ์ฐ๊ฒฐ โ ํ๋์ ํฐ NFA๋ก ํฉ์นจ โ ์ดํ DFA๋ก ๋ณํ๋จ
โInstead of an NFA, a DFA can also be usedโ โ NFA ๋์ DFA๋ ๊ฐ๋ฅ
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- ์์ ์ํ s0์์ ์ฌ๋ฌ ฮต transition์ผ๋ก ๊ฐ ํจํด๋ณ NFA๋ก ๋ถ๊ธฐ
๐ 10ํ์ด์ง โ NFA for JLex Example Spec (detail)
NFA for JLex Example Spec (detail)
JLex ์์ NFA ์์ธ
| ํจํด | ์ํ ์ ์ด | ์ค๋ช |
|---|---|---|
| if | s1 โ s2 โ s3 | i โ f โ โifโ ์ธ์ |
| < | s4 โ s5 | โ<โ |
| <= | s6 โ s7 โ s8 | โ<=โ |
| identifier | s9 โ s10 (loop) | LETTER โ (LETTER or DIGIT ๋ฐ๋ณต) |
๐ฅ ํต์ฌ ๊ตฌ์กฐ
- ํ๋์ ์์ ์ํ s0์์ ฮต๋ก ๊ฐ ํจํด ์์
- ๊ฐ ํจํด NFA ๋ฐ๋ก ์กด์ฌ
- ์ต์ข ์ ์ผ๋ก: ๋ชจ๋ ํ ํฐ์ ํ๋์ NFA๋ก ํฉ์น ๊ฒ
๐ฅ 6~10ํ์ด์ง ํต์ฌ ์์ฝ
์ด ํํธ ํต์ฌ 3๊ฐ:
- ์ค์บ๋ ๊ตฌํ ๋ฐฉ์ 2๊ฐ์ง: Table-driven / Direct-coded
- JLex ๊ท์น: ์์ ์๋ ๊ท์น ์ฐ์ / longest match
- NFA ๊ตฌ์ฑ: ๊ฐ ํจํด NFA ์์ฑ โ ฮต๋ก ํฉ์ณ์ ํ๋์ NFA
๐ 11ํ์ด์ง โ Limitations of Regular Languages
Limitations of Regular Languages
์ ๊ท์ธ์ด์ ํ๊ณ
์ด ํ์ด์ง๋ถํฐ๋ ์์ฃผ ์ค์ํ๋ค. ์ง๊ธ๊น์ง๋ ์ ๊ทํํ์(RE)๊ณผ ์คํ ๋งํ๊ฐ scanner๋ฅผ ๋ง๋๋ ๋ฐ ์ผ๋ง๋ ์ ์ฉํ์ง๋ฅผ ๋ดค๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์๋ ๋ฐ๋๋ก, โ์ ๊ทํํ์์ด ๊ทธ๋ ๊ฒ ์ข๋ค๋ฉด, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ ์ฒด๋ฅผ ๋ค ์ ๊ทํํ์์ผ๋ก ํํํ๋ฉด ๋์ง ์๋?โ๋ผ๋ ์ง๋ฌธ์ ๋ตํ๋ ค๊ณ ํ๋ค.
์ด ์ฌ๋ผ์ด๋์ ํต์ฌ ํ๋ฆ:
- RE๋ ๊ฐ๋ ฅํ๋ค
- ํ์ง๋ง ๋ชจ๋ ๊ฑธ ํํํ ์๋ ์๋ค
- ๊ทธ๋์ ์ปดํ์ผ๋ฌ์๋ scanner ๋ง๊ณ parser๊ฐ ๋ฐ๋ก ํ์ํ๋ค
Advantages of Regular Expressions
์ ๊ทํํ์์ ์ฅ์
Simple & powerful notation for specifying patterns
ํจํด์ ๋ช ์ํ๊ธฐ ์ํ ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ํ๊ธฐ๋ฒ์ด๋ค.
์ ๊ทํํ์์ ์งง์ ๋ฌธ๋ฒ์ผ๋ก ๋ง์ ๋ฌธ์์ด ์งํฉ์ ํํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด:
[0-9]+โ ์ซ์๊ฐ ํ๋ ์ด์[a-zA-Z_][a-zA-Z0-9_]*โ identifier ํํ
์ฆ, RE์ ์ฅ์ ์ โ๋ฌธ์์ด ํจํด์ ๊ธฐ์ ํ๋ ๋ฐ ๋งค์ฐ ์์ถ์ ์ด๊ณ ๋ช ํํ๋คโ๋ ๊ฒ์ด๋ค.
Automatic construction of fast recognizers (scanners)
๋น ๋ฅธ ์ธ์๊ธฐ(์ค์บ๋)๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
RE๋ฅผ ์จ ๋์ผ๋ฉด ๊ฑฐ๊ธฐ์ ๋๋๋ ๊ฒ ์๋๋ผ:
RE โ NFA โ DFA โ ์ต์ DFA โ scanner code ์์ฑ
์ด๋ฐ ๊ณผ์ ์ ํตํด ์ค์ ๋ก ์คํ ๊ฐ๋ฅํ ์ค์บ๋๋ฅผ ๋ง๋ค ์ ์๋ค. ์ฆ, ์ ๊ทํํ์์ ์ด๋ก ์ฉ ๊ธฐํธ๊ฐ ์๋๋ผ ์๋ํ ๋๊ตฌ(JLex, flex ๋ฑ)์ ๋ฐ๋ก ์ฐ๊ฒฐ๋๋ ์ค์ฉ์ ์ธ ํํ ๋ฐฉ์์ด๋ค.
Many patterns can be specified with REs
๋ง์ ํจํด๋ค์ ์ ๊ทํํ์์ผ๋ก ๋ช ์ํ ์ ์๋ค.
scanner ๋จ๊ณ์์ ๋ค๋ฃฐ ๋๋ถ๋ถ์ ํ ํฐ๋ค์ RE๋ก ์ถฉ๋ถํ ํํ ๊ฐ๋ฅํ๋ค:
- ํค์๋: if, while, return
- identifier
- ์ ์ literal, ์ค์ literal
- ์ฐ์ฐ์: +, -, <=
- ๊ตฌ๋์ : ;, (, )
Example โ an expression grammar
์์ โ ์(expression) ๋ฌธ๋ฒ
๊ต์๋์ด ์ผ๋ถ๋ฌ expression์ ์๋ก ๋ ๋ค. ์๋ํ๋ฉด expression์ ๋ฑ RE๋ก๋ ๋ถ์กฑํ๊ณ CFG๊ฐ ํ์ํ ๋ํ ์ฌ๋ก์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Term: [a-zA-Z] ([a-zA-Z] | [0-9])*
ํญ(Term): ์ํ๋ฒณ ํ๋๋ก ์์ํ๊ณ , ๊ทธ ๋ค์ ์ํ๋ฒณ์ด๋ ์ซ์๊ฐ 0๊ฐ ์ด์ ์ค๋ ํํ
๊ตฌ์กฐ: ์ฒซ ๊ธ์ = ์ํ๋ฒณ, ์ดํ = ์ํ๋ฒณ ๋๋ ์ซ์ ๋ฐ๋ณต
โ abc, a1, x99 ๊ฐ์ ๋ฌธ์์ด. ์ด๊ฑด ์ ๊ทํํ์์ผ๋ก ์ ์ ์๋๋ ๋ถ๋ถ์ด๋ค.
Op: + | - | * | /
์ฐ์ฐ์: + ๋๋ - ๋๋ * ๋๋ /
์ด๊ฒ๋ ์ญ์ RE๋ก ํํ์ด ์ฝ๋ค.
Expr: ( Term Op )* Term
์: (Term Op)๊ฐ 0๋ฒ ์ด์ ๋ฐ๋ณต๋๊ณ ๋ง์ง๋ง์ Term ํ๋๊ฐ ์ค๋ ํํ
ํ๋ฉด์ ์ผ๋ก๋ ๊ทธ๋ด๋ฏํด ๋ณด์ด์ง๋ง, ๊ดํธ๊ฐ ์ค์ฒฉ๋๋ ์ผ๋ฐ์ ์ธ expression ์ ์ฒด๋ฅผ ํํํ์ง ๋ชปํ๋ค. ์๋ฅผ ๋ค๋ฉด:
(a+b),((a+b)*c),a*(b+c)๊ฐ์ ๊ตฌ์กฐ๋ ๋จ์ํ(Term Op)* Term๋ก๋ ์ ๋๋ค.- ์๋ํ๋ฉด Term ์์ ๋ Expr๊ฐ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฆ, expression์ ์ง์ง ๋ณธ์ง์ ์ฌ๊ท ๊ตฌ์กฐ์ธ๋ฐ, RE๋ ๊ทธ๋ฐ ์ฌ๊ท์ ์ค์ฒฉ์ ์ ๋๋ก ํํํ์ง ๋ชปํ๋ค.
Of course, this would generate a DFAโฆ
โ๊ทธ๋, ์ด๋ฐ ๋จ์ํ๋ ํํ๋ DFA๋ก ๋ง๋ค ์ ์์ง. ๊ทธ๋ฐ๋ฐ ์ง์ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ์ ์ฒด๋ฅผ ๋ค๋ฃฐ ์ ์๋๋? ๊ทธ๊ฑด ์๋๋ค.โ
If REs are so useful โฆ Why not use them for everything?
์ ๊ทํํ์์ด ๊ทธ๋ ๊ฒ ์ ์ฉํ๋ค๋ฉด โ ์ ๋ชจ๋ ๊ฒ์ ์ ๊ทํํ์์ ์ฐ์ง ์๋๊ฐ?
์ด ๋ฌธ์ฅ์ด ์ด ํ์ด์ง์ ํต์ฌ ์ง๋ฌธ์ด๋ค. ์ด์ ๋ถํฐ๋ RE์ ํํ๋ ฅ ํ๊ณ(expressive power)๋ฅผ ์ค๋ช ํ๊ฒ ๋ค๋ ์๊ณ ๋ค.
๐ 12ํ์ด์ง โ Limitations of Regular Languages (cont.)
Limitations of Regular Languages (cont.)
์ ๊ท์ธ์ด์ ํ๊ณ (๊ณ์)
Regular expressions are limited in what can be expressed.
์ ๊ทํํ์์ ํํํ ์ ์๋ ๊ฒ์ ํ๊ณ๊ฐ ์๋ค.
ํต์ฌ: RE๋ก ํํ ๊ฐ๋ฅํ ์ธ์ด / RE๋ก ์ ๋ ํํ ๋ถ๊ฐํ ์ธ์ด โ ์ด๊ฑด โ์ค๋ ฅ ์ฐจ์ดโ๊ฐ ์๋๋ผ โํ์ ์์ฒด์ ํ๊ณโ๋ค.
Example: 0โฟ1โฟ
์ ๊ทํํ์์ผ๋ก ํํ ๋ถ๊ฐ๋ฅํ ๋ํ ์์
์ด ์ธ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค: 01 / 0011 / 000111 / 00001111 โฆ
์กฐ๊ฑด: ์์๋ 0๋ง / ๋ค์๋ 1๋ง / 0์ ๊ฐ์์ 1์ ๊ฐ์๊ฐ ์ ํํ ๊ฐ์์ผ ํจ
๋ฌธ์ ๋ ๋ง์ง๋ง ์กฐ๊ฑด์ด๋ค. RE๋ DFA๋ ๋ฌธ์์ด์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ฉด์ ํ์ฌ ์ํ๋ง ๊ธฐ์ตํ๋ค. 0์ด ๋ช ๊ฐ ๋์๋์ง ๋ฌดํํ ์ ํํ๊ฒ ๊ธฐ์ตํด ๋์๋ค๊ฐ ๋ค์ 1 ๊ฐ์์ ๋ง์ถฐ์ผ ํ๋ฏ๋ก, ์ ํํ ์ํ๋ง ๊ฐ์ง DFA/์ ๊ท์ธ์ด ์ฒด๊ณ๋ก๋ ์ ๋๋ค.
For the same reason, we cannot specify the set of arithmetic expressions for which left and right parentheses match.
๊ฐ์ ์ด์ ๋ก, ์ผ์ชฝ ๊ดํธ์ ์ค๋ฅธ์ชฝ ๊ดํธ๊ฐ ์๋ก ์ ํํ ๋ง๋ ์ฐ์ ์๋ค์ ์งํฉ๋ ์ ๊ทํํ์์ผ๋ก ๋ช ์ํ ์ ์๋ค.
์: (a) ๋ง์ / ((a)) ๋ง์ / (() ์ ๋ง์ / ()) ์ ๋ง์
์ด โ๊ดํธ ์ง ๋ง์ถ๊ธฐโ ๋ฌธ์ ๋ 0โฟ1โฟ์ ๋ณธ์ง์ด ๊ฐ๋ค:
- ์ด๋ฆฐ ๊ดํธ
(๋ฅผ ๋ช ๊ฐ ๋ดค๋์ง ๊ธฐ์ตํด์ผ ํ๊ณ - ๋ซํ ๊ดํธ
)๊ฐ ๋์ฌ ๋ ํ๋์ฉ ๋์์์ผ์ผ ํ๋ฉฐ - ์ค๊ฐ์ ์ค์ฒฉ๋ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค
์ฆ, RE๋ โ์ด ๊ธ์ ๋ค์์ ์ ๊ธ์โ ๊ฐ์ ํ๋ฉด์ ์ธ ํจํด์๋ ๊ฐํ์ง๋ง, โ์์์ ์ด์ด ๋์ ๊ตฌ์กฐ๋ฅผ ๋ค์์ ์ ํํ ๋ซ์์ผ ํ๋คโ ๊ฐ์ ๊ณ์ธต์ ๊ตฌ์กฐ๋ ๋ค๋ฃจ์ง ๋ชปํ๋ค.
์์: (a), ((a)), (((a))), ((((a)))) โ ์ค์ฒฉ ๊น์ด๊ฐ ๋ฌดํํ ์ฆ๊ฐ ๊ฐ๋ฅ
Regular expressions only usable to specify keywords, identifiers, literals, operators and punctuation characters of a programming language.
์ ๊ทํํ์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํค์๋, ์๋ณ์, ๋ฆฌํฐ๋ด, ์ฐ์ฐ์, ๊ตฌ๋์ ๋ฌธ์๋ฅผ ๋ช ์ํ๋ ๋ฐ์๋ง ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฌธ์ฅ์ ์ปดํ์ผ๋ฌ ๊ตฌ์กฐ๋ฅผ ์ ํํ ๋๋ ์ค๋ค:
- RE๊ฐ ๋งก๋ ์ผ = lexical level (ํ ํฐ ํ๋ํ๋์ ๋ชจ์)
For everything else (expressions, statements, nested statements, โฆ) we need a more powerful mechanism
๊ทธ ๋ฐ์ ๋ชจ๋ ๊ฒ๋ค์ ์ํด์๋ ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ด ํ์ํ๋ค.
์ฌ๊ธฐ์ โmore powerful mechanismโ์ด ๋ฐ๋ก CFG์ parser๋ค. ์๋ํ๋ฉด:
- expression ์์ expression ๋ค์ด๊ฐ
- if๋ฌธ ์์ statement ๋ค์ด๊ฐ
- while๋ฌธ ์์ block ๋ค์ด๊ฐ
- block ์์ ๋ if/while ๋ค์ด๊ฐ
๊ทธ๋์ scanner ๋ค์์ parser๊ฐ ๋ฐ๋์ ํ์ํ๋ค.
๐ 13ํ์ด์ง โ Regular Expressions and Context-Free Grammars
Regular Expressions and Context-Free Grammars
์ ๊ทํํ์๊ณผ ๋ฌธ๋งฅ์์ ๋ฌธ๋ฒ
์ฌ๊ธฐ์๋ RE์ CFG๋ฅผ ๋จ์ ๋๊ตฌ ๋น๊ต๊ฐ ์๋๋ผ ํ์์ธ์ด์ ํํ๋ ฅ ๊ด์ ์์ ๊ตฌ๋ถํ๋ค.
โThe โlanguagesโ that can be defined by REs and Context-free grammars (CFGs) have been extensively studied by theoretical computer scientists.โ
์ ๊ทํํ์๊ณผ ๋ฌธ๋งฅ์์ ๋ฌธ๋ฒ์ผ๋ก ์ ์ํ ์ ์๋ โ์ธ์ด๋คโ์ ์ด๋ก ์ปดํจํฐ๊ณผํ์๋ค์ ์ํด ๋งค์ฐ ๊ด๋ฒ์ํ๊ฒ ์ฐ๊ตฌ๋์ด ์๋ค.
์ฌ๊ธฐ์ โlanguageโ๋ ์์ฐ์ด๊ฐ ์๋๋ผ ๋ฌธ์์ด ์งํฉ์ด๋ผ๋ ๋ป์ด๋ค: identifier๋ค์ ์งํฉ / ์ฌ๋ฐ๋ฅธ arithmetic expression๋ค์ ์งํฉ / ๊ดํธ๊ฐ ์ง ๋ง๋ ๋ฌธ์์ด๋ค์ ์งํฉ ๋ฑ.
RE are a โweakerโ formalism than CFGs
์ ๊ทํํ์์ CFG๋ณด๋ค โ๋ ์ฝํโ ํ์ ์ฒด๊ณ์ด๋ค.
์ฌ๊ธฐ์ โweakerโ๋ ์ฑ๋ฅ์ด ๋์๋ค๊ฑฐ๋ ์ธ๋ชจ์๋ค๋ ๋ป์ด ์๋๋ค. ํํํ ์ ์๋ ์ธ์ด์ ๋ฒ์๊ฐ ๋ ์ข๋ค๋ ๋ป์ด๋ค.
RE๋ก ํํ ๊ฐ๋ฅํ ์ธ์ด โ CFG๋ก ํํ ๊ฐ๋ฅํ ์ธ์ด
Any language expressible by a RE can be expressed by a CFG but not the other way around!
์ ๊ทํํ์์ผ๋ก ํํ ๊ฐ๋ฅํ ๋ชจ๋ ์ธ์ด๋ CFG๋ก๋ ํํํ ์ ์์ง๋ง, ๊ทธ ๋ฐ๋๋ ์ฑ๋ฆฝํ์ง ์๋๋ค.
- regular language โ CFG๋ก ํํ ๊ฐ๋ฅ
- ํ์ง๋ง ๋ชจ๋ CFG language๊ฐ regular์ธ ๊ฑด ์๋
- ์: identifier ์งํฉ โ RE ๊ฐ๋ฅ, CFG๋ ๊ฐ๋ฅ / ๊ดํธ ์ง ๋ง๋ ๋ฌธ์์ด โ CFG ๊ฐ๋ฅ, RE ๋ถ๊ฐ
์ฆ CFG๊ฐ strictly more powerful ํ๋ค. ๊ทธ๋์ parser๋ scanner๋ณด๋ค ๋ ๊ฐํ ํ์์ ์ฌ์ฉํ๋ค.
The languages expressible as RE are called regular languages
์ ๊ทํํ์์ผ๋ก ํํ ๊ฐ๋ฅํ ์ธ์ด๋ค์ ์ ๊ท์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- RE๋ก ํํ ๊ฐ๋ฅ = DFA/NFA๋ก ์ธ์ ๊ฐ๋ฅ = regular language
Generally: a language that exhibits โself embeddingโ cannot be expressed by a RE.
์ผ๋ฐ์ ์ผ๋ก โ์๊ธฐ ๋ดํฌ(self embedding)โ๋ฅผ ๋ณด์ด๋ ์ธ์ด๋ ์ ๊ทํํ์์ผ๋ก ํํํ ์ ์๋ค.
self embedding์ด๋ ๊ตฌ์กฐ ์์ ๊ฐ์ ์ข ๋ฅ์ ๊ตฌ์กฐ๊ฐ ๋ค์ ๋ค์ด๊ฐ๋ ๊ฒ์ด๋ค:
- expression ์์ expression
- statement ์์ statement
- parentheses ์์ parentheses
์ฆ, โ๋์ ๊ฐ์ ์ข
๋ฅ์ ๊ตฌ์กฐ๊ฐ ๋ด ์์ ๋ ๋ค์ด์จ๋คโ๋ ์ฌ๊ท์ ์ฑ์ง์ด๋ค.
์: expr โ (expr)
RE๋ ์ด๋ฐ ์๊ธฐ ๋ดํฌ๋ฅผ ํํํ์ง ๋ชปํ๋ค. ๋ฐ๋ฉด ์๊ธฐ ๋ดํฌ๋ ๊น์ด๊ฐ ๋ฌดํํ ์ฆ๊ฐํ ์ ์๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์๊ตฌํ๋ค.
Programming languages exhibit self embedding.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์๊ธฐ ๋ดํฌ๋ฅผ ๋ณด์ธ๋ค.
์ด๊ฑด ๊ณง, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ RE๋ง์ผ๋ก๋ ๋ค๋ฃฐ ์ ์๋ค๋ ๋ง์ด๋ค.
์ฆ, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋ณธ์ง์ ์ผ๋ก parser๊ฐ ํ์ํ๋๋ก ์ค๊ณ๋์ด ์๋ค.
Example: an expression can contain another expression
ํ๋์ ์์ ๋ ๋ค๋ฅธ ์์ ํฌํจํ ์ ์๋ค โ self embedding์ ๋ํ ์ฌ๋ก
์: a+b / (a+b)*c / ((a+b)*(c-d)) โ ์ ์์ ์์ด ๋ ๋ค์ด๊ฐ๋ค. ์ด๊ฒ parser๊ฐ ํ์ํ ์ด์ ๋ค.
expr ::= id | integer | - expr | ( expr ) | expr op expr
| ๊ท์น | ์๋ฏธ | ์์ |
|---|---|---|
expr ::= id |
์์ ์๋ณ์ ํ๋ | x |
expr ::= integer |
์์ ์ ์ ํ๋ | 3 |
expr ::= - expr |
์ ์์ unary minus | -x, -(a+b) |
expr ::= ( expr ) |
๊ดํธ ์์ ์ | (x+1) |
expr ::= expr op expr |
์๊ณผ ์ ์ฌ์ด์ ์ฐ์ฐ์ | a+b, x*y |
ํต์ฌ: expr์ ์ ์ ์์ ๋ expr์ด ๋ฑ์ฅ โ ์ด๊ฒ ์ฌ๊ท๊ณ , ์ด๊ฒ self embedding์ด๋ค.
op ::= + | - | * | /
์ฐ์ฐ์(op)๋ +, -, *, / ์ค ํ๋์ด๋ค. ์ด ๋ถ๋ถ ์์ฒด๋ RE๋ก๋ ๊ฐ๋ฅํ๋ค.
How many expressions can be derived? Infinitely many.
๋ช ๊ฐ์ ์์ด ์ ๋๋ ์ ์๋๊ฐ? ๋ฌดํํ ๋ง๋ค.
์ฌ๊ท ๋๋ฌธ์ ํํ ๊ฐ๋ฅํ ๊ตฌ์กฐ์ ๊น์ด์ ์ ํ์ด ์๋ค๋ ๋ป์ด๋ค. ์ฆ, expression grammar๋ ๊ธธ์ด๋ง ๊ธด ๊ฒ ์๋๋ผ ๊ตฌ์กฐ๊ฐ ๋ฌดํํ ์ค์ฒฉ๋ ์ ์๋ค. ์ด๋ฐ ์ฑ์ง์ด regular language์ ๋ฒ์๋ฅผ ๋๋๋ค.
๐ 14ํ์ด์ง โ Extra Materials: Training for Lexical Analysis
Extra Materials: Training for Lexical Analysis
์ถ๊ฐ ์๋ฃ: Lexical Analysis ์ฐ์ต
์ด ํ์ด์ง๋ ๋ณธ๊ฐ์ ๋ด์ฉ์ด๋ผ๊ธฐ๋ณด๋ค ์ถ๊ฐ ์ฐ์ต ํํธ๊ฐ ์์๋๋ค๋ ํ์ง๋ค.
- ์ 11~13ํ์ด์ง: ์ด๋ก ์ค๋ช
- 15ํ์ด์ง๋ถํฐ: ์ฐ์ต๋ฌธ์
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- ์ค์ ํฐ ์ ๋ชฉ: Extra Materials
- ๊ทธ ์๋: Training for Lexical Analysis
- ํ๋จ: ํ๊ต ๋ก๊ณ
1ํ์ด์ง์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ง ๋ด์ฉ๋ณด๋ค๋ โ์ด์ ์ฐ์ต ์น์ ์์โ์ ์๋ ค์ฃผ๋ ํ์ง ์ญํ ์ด๋ค.
๐ 15ํ์ด์ง โ Writing Regular Expressions
Writing Regular Expressions
์ ๊ทํํ์ ์์ฑํ๊ธฐ
์ด์ ๋ถํฐ๋ ์์์ ๋ฐฐ์ด ๋ด์ฉ์ ์ค์ ๋ก ์จ๋ณด๋ ์ฐ์ต์ด๋ค.
Write a regular expression for each of the following sets of tokens:
๋ค์ ๊ฐ๊ฐ์ ํ ํฐ ์งํฉ์ ๋ํด ์ ๊ทํํ์์ ์์ฑํ์์ค.
์ ๊ท์์ ์ธ ๋ ํ์ธํด์ผ ํ ๊ฒ๋ค:
- ๋ฐ๋์ ํน์ ์ ๋์ด๊ฐ ์์ด์ผ ํ๋์ง
- ๋ฐ๋ณต์ด ๋๋์ง
- underscore๊ฐ ์ด๋์๋ ๊ฐ๋ฅํ์ง
- ๋ง์ง๋ง ๊ธ์ ์ ์ฝ์ด ์๋์ง
1) Ruby binary literals
โ0bโ ๋ค์์ ์ด์ง์๊ฐ ์ค๋ Ruby์ ์ด์ง ๋ฆฌํฐ๋ด
์: 0b001011, 0b01
2) Ruby binary literals (with optional underscore)
๋ ๊ฐ์ ์ด์ง ์ซ์ ์ฌ์ด์ ์ ํ์ ์ผ๋ก underscore _๊ฐ ๋ค์ด๊ฐ ์ ์๋ Ruby ์ด์ง ๋ฆฌํฐ๋ด
์: 0b0_101, 0b11_01 ๊ฐ๋ฅ / 0b_1, 0b1_ ๋ถ๊ฐ
3) Ada identifiers
๋ฌธ์(letter) ํ๋๋ก ์์ํ๊ณ , ๊ทธ ๋ค์ ๋ฌธ์ยท์ซ์ยทunderscore๊ฐ ์์ ๊ฐ์ ์ฌ ์ ์๋ค.
๋จ, underscore๋ก ๋๋๋ฉด ์ ๋๊ณ , underscore๊ฐ ๋ ๋ฒ ์ฐ์ ๋์์๋ ์ ๋๋ค.
4) Floating-point number
ํ๋ ์ด์์ ์ซ์(์ ์๋ถ) ๋ค์ ์์์ .์ด ์ค๊ณ , ๊ทธ ๋ค์ ํ๋ ์ด์์ ์ซ์(์์๋ถ)๊ฐ ์ค๋ ํํ
์: 2.24, 0.1234
5) Floating-point number in scientific notation
์์ ๊ฐ์ ๋ถ๋์์์ ์ ๋ค์, ์ ํ์ ์ผ๋ก e ๋๋ E์ ๋ถํธ ์๋ ์ ์ ์ง์๊ฐ ๋ฐ๋ผ์ฌ ์ ์๋ค.
์: 1.2e-2, 2.3E+34, 2.3E34
๐ 16ํ์ด์ง โ ์ฐ์ต๋ฌธ์ 1๋ฒ: Ruby Binary Literals
1) Ruby binary literals consisting of โ0bโ followed by the binary number.
โ0bโ ๋ค์์ ์ด์ง์๊ฐ ์ค๋ Ruby์ ์ด์ง ๋ฆฌํฐ๋ด
์: 0b001011, 0b01
๋ฌธ์ ์๋ฏธ ์ค๋ช
| ํ์ฉ | ์ด์ |
|---|---|
| 0b0 | ์กฐ๊ฑด ๋ง์กฑ |
| 0b1 | ์กฐ๊ฑด ๋ง์กฑ |
| 0b01 | ์กฐ๊ฑด ๋ง์กฑ |
| 0b101010 | ์กฐ๊ฑด ๋ง์กฑ |
| ๋ถํ | ์ด์ |
|---|---|
| 0b | ๋ค์ ์ด์ง์ ์์ |
| 0b102 | 2๊ฐ ๋ค์ด๊ฐ |
| 0B01 | ๋๋ฌธ์ B |
| 00b01 | ์์ ํ์ ๋ค๋ฆ |
์ ๊ทํํ์
0b[01]+
๋๋ ๋์ผํ ํํ:
0b(0|1)+
์ +๊ฐ ํ์ํ๊ฐ?
[01]*๋ผ๊ณ ์ฐ๋ฉด0b๋ค์ ์๋ฌด๊ฒ๋ ์๋ ๊ฒฝ์ฐ๋ ํ์ฉ๋จ- ์์์ ๋ฌธ์ ๋ฌธ๋งฅ์ binary number๊ฐ ์์ผ ํ๋ฏ๋ก ์ต์ 1์๋ฆฌ ํ์
- ๋ฐ๋ผ์
[01]+์ด ๋ง๋ค
๐ 17ํ์ด์ง โ ์ฐ์ต๋ฌธ์ 2๋ฒ: Ruby Binary Literals (with optional underscore)
2) Ruby binary literals, with an optional underscore (โ_โ) between a pair of binary digits.
๋ ๊ฐ์ ์ด์ง ์ซ์ ์ฌ์ด์ ์ ํ์ ์ผ๋ก underscore๊ฐ ๋ค์ด๊ฐ ์ ์๋ Ruby ์ด์ง ๋ฆฌํฐ๋ด
์: 0b0_101, 0b11_01 ๊ฐ๋ฅ / 0b_1, 0b1_ ๋ถ๊ฐ
๋ฌธ์ ์๋ฏธ ์ค๋ช
ํต์ฌ: _๋ ์๋ฌด ๋ฐ๋ ๋ถ๋ ๊ฒ ์๋๋ผ, ๋ฐ๋์ binary digit์ binary digit ์ฌ์ด์๋ง ์ฌ ์ ์๋ค.
| ํ์ฉ | ์ด์ |
|---|---|
| 0b0_1 | digit _ digit |
| 0b10_10 | digit ์ฌ์ด underscore |
| 0b0_101 | digit ์ฌ์ด underscore |
| ๋ถํ | ์ด์ |
|---|---|
| 0b_1 | ์์ ์งํ underscore (์์ชฝ digit ์์) |
| 0b1_ | ๋์ด underscore (๋ค์ชฝ digit ์์) |
| 0b__1 | underscore ์ฐ์ |
| 0b0__1 | ์ฐ์ underscore |
์๋ชป๋ ์ ๊ทผ (ํจ์ )
0b[01_]+ โ ํ๋ฆผ!
์ด๋ ๊ฒ ์ฐ๋ฉด 0b_1, 0b1_, 0b___ ๊ฐ์ ๊ฒ๋ ํ์ฉํด ๋ฒ๋ฆฐ๋ค. ๋จ์ ํ์ฉ ๋ฌธ์ ์งํฉ ๋์ด๋ง์ผ๋ก๋ ์์น ์ ์ฝ์ ๋ฐ์ ๋ชปํจ.
์ ํํ ์ ๊ทํํ์
0b[01](_?[01])*
๊ตฌ์กฐ ๋ถ์:
- ์ฒซ ๊ธ์๋ ๋ฐ๋์
[01]โ0b_1๋งํ - ๋ฐ๋ณต ๋จ์
(_?[01]): underscore๊ฐ ์ค๋ฉด ๋ฐ๋์ ๋ค์[01]๊ฐ ๋ฐ๋ผ์ด โ0b1_๋งํ - underscore ์ฐ์ ๋ถ๊ฐ (
_?๋ ์ต๋ ํ๋) โ0b0__1๋งํ
๐ 18ํ์ด์ง โ ์ฐ์ต๋ฌธ์ 3๋ฒ: Ada Identifiers
3) Ada identifiers: a letter followed by any number of letters, digits, and underlines.
Ada ์๋ณ์: ๋ฌธ์ ํ๋๋ก ์์ํ๊ณ , ๊ทธ ๋ค์ ๋ฌธ์, ์ซ์, underscore๊ฐ ์์ ๊ฐ์ ์ฌ ์ ์๋ค.
๋จ, underscore๋ก ๋๋๋ฉด ์ ๋๊ณ , underscore๊ฐ ๋ ๋ฒ ์ฐ์ ๋์์๋ ์ ๋๋ค.
๋ฌธ์ ์๋ฏธ ์ค๋ช
๋จ์ํ ์ฐ๋ฉด ํ๋ฆฌ๊ธฐ ์ฌ์ด ํจ์ ๋ฌธ์ ๋ค. ์ฒ์ ๋ณด๋ฉด ์ด๋ ๊ฒ ์ฐ๊ณ ์ถ์ด์ง๋ค:
[a-zA-Z][a-zA-Z0-9_]* โ ํ๋ฆผ!
์ด ์์ abc_, ab__cd ๊ฐ์ ๊ธ์ง๋ ํจํด๋ ํ์ฉํด ๋ฒ๋ฆฐ๋ค.
| ์กฐ๊ฑด | ์์ ๋ถํ | ์ด์ |
|---|---|---|
| underscore๋ก ๋๋๋ฉด ์ ๋จ | abc_, x1_ |
๋ underscore |
| underscore ๋ ๋ฒ ์ฐ์ ๊ธ์ง | ab__cd, x__1 |
์ฐ์ underscore |
| ํ์ฉ | ๋ถํ |
|---|---|
| a, abc, a1, a_b | _abc (์์์ด letter ์๋) |
| a1_b2_c3 | abc_ (๋ underscore) |
| ย | ab__cd (์ฐ์ underscore) |
ํต์ฌ ์ฌ๊ณ ๋ฒ
underscore๋ฅผ โ๋ง์๋๋ก ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ฌธ์โ๋ก ๋ณด๋ฉด ์ ๋๋ค. underscore๋ ์ค์ง ์ ์ ๋ฌธ์ ์ฌ์ด๋ฅผ ์ด์ด์ฃผ๋ ์ฐ๊ฒฐ ๋ฌธ์์ฒ๋ผ ์๊ฐํด์ผ ํ๋ค.
์ฆ ๊ตฌ์กฐ:
- underscore๊ฐ ์ค๋ ค๋ฉด ๋ฐ๋์ ๊ทธ ๋ค์ letter ๋๋ digit๊ฐ ์์ผ ํจ
์ ๊ทํํ์
[a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])*
์ ์ด ์์ด ๋ง๋๊ฐ:
- ์์ ๋ฌธ์
[a-zA-Z]: ๋ฐ๋์ letter๋ก ์์ - ๋ฐ๋ณต ๋จ์
([a-zA-Z0-9]|_[a-zA-Z0-9]):- ๊ทธ๋ฅ letter/digit ํ๋ ์ค๊ฑฐ๋
- underscore + letter/digit ์ค๊ฑฐ๋
- ์ด๋ ๊ฒ ํ๋ฉด:
_ํผ์ ๋์ ๋ชป ์ด /__๋ถ๊ฐ / underscore ๋ค์๋ ๋ฌด์กฐ๊ฑด letter/digit๊ฐ ์ด
๐ 19ํ์ด์ง โ ์ฐ์ต๋ฌธ์ 4๋ฒ: Floating-point Number
4) A floating-point number: one or more digits (whole-number part) followed by a decimal point (โ.โ) and one or more digits (fractional part).
๋ถ๋์์์ ์: ํ๋ ์ด์์ ์ซ์(์ ์๋ถ) ๋ค์ ์์์ .์ด ์ค๊ณ , ๊ทธ ๋ค์ ํ๋ ์ด์์ ์ซ์(์์๋ถ)๊ฐ ์ค๋ ํํ
์: 2.24, 0.1234
ํต์ฌ ์ ์ฝ ์ธ ๊ฐ์ง
- ์ ์๋ถ๊ฐ ์ต์ 1์๋ฆฌ ์์ด์ผ ํจ
- ์์์ ์ด ๋ฐ๋์ ์์ด์ผ ํจ
- ์์๋ถ๋ ์ต์ 1์๋ฆฌ ์์ด์ผ ํจ
์ ๊ทํํ์
[0-9]+\.[0-9]+
| ๋ถ๋ถ | ์ ๊ท์ | ์ด์ |
|---|---|---|
| ์ ์๋ถ | [0-9]+ |
one or more digits |
| ์์์ | \. |
์ค์ ๋ง์นจํ ๋ฌธ์ (.๋ ๋ฉํ๋ฌธ์๋ผ escape ํ์) |
| ์์๋ถ | [0-9]+ |
one or more digits |
์ ์ ์ escapeํด์ผ ํ๋?
์ ๊ทํํ์์์ .์ โ์๋ฌด ๋ฌธ์ ํ๋โ๋ผ๋ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ์ค์ ์์์ ๋ฌธ์ . ์์ฒด๋ฅผ ์๋ฏธํ๋ ค๋ฉด ๋ฐ๋์ \.๋ก ์จ์ผ ํ๋ค.
| ํ์ฉ | ๋ถํ | ์ด์ |
|---|---|---|
| 2.24, 0.1234 | .5 | ์ ์๋ถ ์์ |
| ย | 5. | ์์๋ถ ์์ |
| ย | 12 | ์์์ ์์ |
| ย | 12.a | ์์๋ถ๊ฐ digit ์๋ |
๐ 20ํ์ด์ง โ ์ฐ์ต๋ฌธ์ 5๋ฒ: Floating-point in Scientific Notation
5) Floating-point number in scientific notation: same as above, but optionally followed by โeโ or โEโ, and a signed integer exponent.
๊ณผํ์ ํ๊ธฐ๋ฒ์ ๋ถ๋์์์ ์: ์์ ๊ฐ๋, ์ ํ์ ์ผ๋ก e ๋๋ E์ ๋ถํธ ์๋ ์ ์ ์ง์๊ฐ ๋ฐ๋ผ์ฌ ์ ์๋ค.
์: 1.2e-2, 2.3E+34, 2.3E34
๊ตฌ์กฐ
๊ธฐ๋ณธ ๋ผ๋ (19ํ์ด์ง) + optional exponent suffix:
[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?
| ๋ถ๋ถ | ์ ๊ท์ | ์ด์ |
|---|---|---|
| ๊ธฐ๋ณธ float | [0-9]+\.[0-9]+ |
19ํ์ด์ง์ ๋์ผ |
| exponent ์ ์ฒด | ([eE][+-]?[0-9]+)? |
optional |
| e ๋๋ E | [eE] |
๋ ๋ค ๊ฐ๋ฅ |
| ๋ถํธ (optional) | [+-]? |
์์ด๋ ๋๊ณ ์์ด๋ ๋จ |
| ์ง์ ์ซ์ | [0-9]+ |
์ต์ 1์๋ฆฌ ์ด์ |
examples ํด์
| ์์ | ํด์ |
|---|---|
| 1.2e-2 | ๊ธฐ๋ณธ float 1.2 + ์ง์ e-2 |
| 2.3E+34 | ๊ธฐ๋ณธ float 2.3 + ์ง์ E+34 (์์ ๋ถํธ ๋ช ์) |
| 2.3E34 | ๊ธฐ๋ณธ float 2.3 + ์ง์ E34 (๋ถํธ ์๋ต) |
๋ถํ ์์
| ๋ถํ | ์ด์ |
|---|---|
| 1.2e | ์ง์ ์ซ์ ์์ |
| 1.2e+ | ๋ถํธ๋ง ์๊ณ ์ซ์ ์์ |
| 1.2e+3.4 | exponent๋ ์ ์์ฌ์ผ ํจ |
| .2e3 | ๊ธฐ๋ณธ float ์กฐ๊ฑด ์๋ฐ |
| 2.e3 | ๊ธฐ๋ณธ float ์กฐ๊ฑด ์๋ฐ |
๐ฅ 16~20ํ์ด์ง ํต์ฌ ์ ๋ฆฌ
| ๋ฌธ์ | ์ ๊ทํํ์ |
|---|---|
| 16ํ์ด์ง โ Ruby binary | 0b[01]+ |
| 17ํ์ด์ง โ Ruby binary + underscore | 0b[01](_?[01])* |
| 18ํ์ด์ง โ Ada identifier | [a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])* |
| 19ํ์ด์ง โ Floating-point | [0-9]+\.[0-9]+ |
| 20ํ์ด์ง โ Scientific notation | [0-9]+\.[0-9]+([eE][+-]?[0-9]+)? |
๐ 21ํ์ด์ง โ Subset Construction with Animation
Subset Construction with Animation
๋ถ๋ถ์งํฉ ๊ตฌ์ฑ๋ฒ (์ ๋๋ฉ์ด์ )
Reminder) subset construction: NFA to DFA
๋ณต์ต: subset construction์ NFA๋ฅผ DFA๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ด๋ค
NFA์ ํต์ฌ ํน์ง:
- ๊ฐ์ ์ ๋ ฅ์์ ์ฌ๋ฌ ๊ฒฝ๋ก ๊ฐ๋ฅ
- ์: s1์์ a ์ ๋ ฅ โ s1 ๊ฐ ์๋ ์๊ณ s2 ๊ฐ ์๋ ์์ โ ์ด๊ฑธ โguessโ๋ผ๊ณ ํํ
Instead of guessing in state s1 on symbol a, we can follow both transitions in parallel.
์ํ s1์์ ์ ๋ ฅ a๊ฐ ๋ค์ด์์ ๋ ์ถ์ธกํ๋ ๋์ , ์ฐ๋ฆฌ๋ ๋ ๊ฒฝ๋ก๋ฅผ ๋์์ ๋ฐ๋ผ๊ฐ ์ ์๋ค.
NFA์ ๋น๊ฒฐ์ ์ฑ์ ์ ๊ฑฐํ๋ ํต์ฌ ์์ด๋์ด: โํ๋๋ง ๊ณ ๋ฅด๋ ๊ฒ ์๋๋ผ ๋ ๋ค ๊ฐ๋ค๊ณ ์๊ฐํ๋คโ
We introduce a โvirtual stateโ
์ฐ๋ฆฌ๋ โ๊ฐ์ ์ํโ๋ฅผ ๋์ ํ๋ค
- ์๋ก์ด ๊ฐ๋
:
{s1, s2}โ ์ฌ๋ฌ ์ํ๋ฅผ ๋ฌถ์ ํ๋์ ์ํ - DFA์์๋ ์ํ ํ๋๊ฐ ์ค์ ๋ก๋ NFA ์ํ๋ค์ ์งํฉ์ด ๋๋ค
- ํ๊ธฐ:
{s1, s2}(์งํฉ์ผ๋ก ํํ)
A question: if we are in {s1, s2}, where can we go on b?
์ง๋ฌธ: ์ฐ๋ฆฌ๊ฐ {s1, s2} ์ํ์ ์์ ๋ b๋ฅผ ์ฝ์ผ๋ฉด ์ด๋๋ก ๊ฐ๋๊ฐ?
Answer: wherever s1 or s2 can go
๋ต: s1์ด๋ s2๊ฐ ๊ฐ ์ ์๋ ๋ชจ๋ ์ํ๋ก ๊ฐ๋ค
Move({s1, s2}, b) = Move(s1, b) โช Move(s2, b)
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- ์ํ s1์์ a โ s1 ๋๋ s2
- ์ํ s2์์ b โ s3
- ์ต์ข s4๋ accepting state
- NFA๋ โ๊ฐ๋ฆผ๊ธธ ์กด์ฌโ โ DFA๋ โ๊ฐ๋ฆผ๊ธธ ์ ๊ฑฐ โ ์ํ ๋ฌถ๊ธฐโ
๐ 22ํ์ด์ง โ Example: Simulating an NFA โon the flyโ
Example: Simulating an NFA โon the flyโ
์: NFA๋ฅผ ์ฆ์์์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ
On-the-fly simulation: useful when a regular expression is used only once
NFA๋ฅผ ์ฆ์์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๊ฒ์ ์ ๊ทํํ์์ด ํ ๋ฒ๋ง ์ฌ์ฉ๋ ๋ ์ ์ฉํ๋ค
์ฉ๋ ์์: IDE์ find / grep โ DFA๋ก ๋ณํ ์ ํ๊ณ ๊ทธ๋ฅ NFA๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
In a compiler, โฆ used over and over again โ need a more efficient approach
์ปดํ์ผ๋ฌ์์๋ ์ ๊ทํํ์์ด ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๋ค โ ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค โ DFA ์ฌ์ฉ
scanner๋ ๋ชจ๋ ์ ๋ ฅ์ ๋ํด ๊ณ์ ์ฌ์ฉ๋จ
๐ฅ ํต์ฌ ๋น๊ต
| ๋ฐฉ์ | ํน์ง |
|---|---|
| NFA ์ง์ ์ฌ์ฉ | ๊ฐ๋จ, ๋๋ฆผ |
| DFA ๋ณํ ํ ์ฌ์ฉ | ๋ณต์ก, ๋น ๋ฆ |
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- s0 โ s1 โ s2 โ s3 โ s4 (์ ๋ ฅ: a, b, b)
- ๋ฌธ์์ด โabbโ ์ฒ๋ฆฌ ๊ณผ์ โ NFA๋ ์ฌ๋ฌ ๊ฒฝ๋ก ์๋ ๊ฐ๋ฅ
๐ 23ํ์ด์ง โ Algorithm: NFA โ DFA with Subset Construction
Algorithm: NFA โ DFA with Subset Construction
์๊ณ ๋ฆฌ์ฆ: subset construction์ผ๋ก NFA โ DFA
ํต์ฌ ๊ฐ๋
- Subset construction works on sets of NFA states: DFA ์ํ = NFA ์ํ ์งํฉ
- Each set of NFA states becomes a DFA state: ์:
{s0, s1},{s1, s2},{s1}
๋ ๊ฐ์ง ํต์ฌ ํจ์ (Two key functions)
| ํจ์ | ์๋ฏธ |
|---|---|
| Move(S, a) | ์ํ ์งํฉ S์์ ์ ๋ ฅ a๋ก ๊ฐ ์ ์๋ ์ํ ์งํฉ |
| ฮต-closure(S) | ฮต-transition(์ ๋ ฅ ์์ด ์ด๋)์ผ๋ก ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์ํ ์งํฉ |
์๊ณ ๋ฆฌ์ฆ ํ๋ฆ
- Start state = ฮต-closure({s0}): ์์ ์ํ๋ s0์ ฮต-closure (๊ทธ๋ฅ s0๊ฐ ์๋๋ผ ฮต๋ก ๊ฐ ์ ์๋ ๋ชจ๋ ์ํ ํฌํจ)
- Compute Move(S0, ฮฑ): ๊ฐ ์ ๋ ฅ ฮฑ์ ๋ํด Move ๊ณ์ฐ
- take ฮต-closure: ๊ทธ ๊ฒฐ๊ณผ์ ๋ํด ฮต-closure ์ ์ฉ
- Iterate until no more states: ์ ์ํ๊ฐ ์ ์๊ธธ ๋๊น์ง ๋ฐ๋ณต
๐ 24ํ์ด์ง โ ์๊ณ ๋ฆฌ์ฆ ์์ธ ์ฝ๋
์๊ณ ๋ฆฌ์ฆ ์ฝ๋
Dstates โ {}
add ฮต-closure(s0) as unmarked state to Dstates
while (unmarked state T exists)
mark T
for each ฮฑ โ ฮฃ
U โ ฮต-closure(Move(T, ฮฑ))
if (U โ Dstates) add U
ฮด[T, ฮฑ] โ U
๊ฐ ์ค ํด์
| ์ฝ๋ | ํด์ |
|---|---|
Dstates โ {} |
DFA ์ํ ์งํฉ ์ด๊ธฐํ |
add ฮต-closure(s0) |
์์ ์ํ ์ถ๊ฐ |
while (unmarked T exists) |
์์ง ์ฒ๋ฆฌ ์ ํ ์ํ๊ฐ ์์ผ๋ฉด ๋ฐ๋ณต |
mark T |
ํ์ฌ ์ํ ์ฒ๋ฆฌ ์๋ฃ ํ์ |
for each ฮฑ โ ฮฃ |
๋ชจ๋ ์ ๋ ฅ ๋ฌธ์์ ๋ํด |
U โ ฮต-closure(Move(T, ฮฑ)) |
ํต์ฌ: Move โ ฮต-closure ์์๋ก ๊ณ์ฐ |
if (U โ Dstates) add U |
์ ์ํ๋ฉด ์ถ๊ฐ |
ฮด[T, ฮฑ] โ U |
transition ๊ธฐ๋ก |
์ด๊ฑด ๊ทธ๋ฅ ์ธ์ฐ๋ ๊ฒ ์๋๋ผ ์ํ ํ์ฅ ๊ณผ์ ์ดํดํด์ผ ํจ
๐ 25ํ์ด์ง โ ์๊ณ ๋ฆฌ์ฆ ์์ ์ํ
์ด๊ธฐ ์ํ ์ค์
Dstates = {}
ฮต-closure(s0) = {s0, s1}
์ด๊ธฐ ์ํ๋ {s0, s1} โ ์ s1๊น์ง ํฌํจ๋๋๊ฐ?
ฮต-transition ๋๋ฌธ: s0์์ ์ ๋ ฅ ์์ด s1 ๊ฐ ์ ์์
- ์์ ์ํ๋ ๋จ์ผ ์ํ๊ฐ ์๋๋ผ ์งํฉ ์ํ
add as unmarked stateโ ๋ฏธ์ฒ๋ฆฌ ์ํ๋ก ์ถ๊ฐ
๐ผ ๊ทธ๋ฆผ ์ค๋ช
- s0 โ ฮต โ s1
- DFA ์์ ์ํ: ฮต-closure(s0) โ ์ํ ํฌ์ธํธ
๐ฅ 21~25ํ์ด์ง ์ ์ฒด ํต์ฌ ์์ฝ
-
ํต์ฌ ์์ด๋์ด: NFA๋ ์ฌ๋ฌ ๊ฒฝ๋ก / DFA๋ ํ๋์ ๊ฒฝ๋ก โ ํด๊ฒฐ: ์ฌ๋ฌ ์ํ๋ฅผ ํ๋๋ก ๋ฌถ๋๋ค
-
DFA ์ํ ์ ์: DFA state = NFA ์ํ ์งํฉ
-
ํต์ฌ ํจ์:
| ํจ์ | ์๋ฏธ |
|---|---|
Move(S, a) |
์ํ ์งํฉ S์์ a๋ก ์ด๋ ๊ฐ๋ฅํ ์ํ๋ค |
ฮต-closure(S) |
ฮต ์ ์ด๋ก ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์ํ๋ค |
- ์๊ณ ๋ฆฌ์ฆ ํ๋ฆ:
- ์ด๊ธฐ: S0 = ฮต-closure(s0)
- ๋ฐ๋ณต: U = ฮต-closure(Move(T, ฮฑ))
- ์ ์ํ๋ฉด ์ถ๊ฐ
- ์ค์ํ ํฌ์ธํธ: โguess ํ์ง ์๋๋คโ โ โ๋ชจ๋ ๊ฐ๋ฅ์ฑ์ ๋์์ ํฌํจํ๋คโ
๐ฅ ์ ์ฒด ๊ฐ์ ํต์ฌ ์์ฝ (1~25ํ์ด์ง)
์ ์ฒด ํ๋ฆ
์ ๊ทํํ์ โ NFA โ DFA โ ์ต์ DFA
๊ฐ ๋จ๊ณ ์์ฝ
| ๋จ๊ณ | ๋ฐฉ๋ฒ | ํต์ฌ ๊ฐ๋ |
|---|---|---|
| RE โ NFA | Thompson Construction | ฮต-transition |
| NFA โ DFA | Subset Construction | ฮต-closure, Move |
| DFA โ min DFA | Partition Refinement | distinguishable |
RE์ ํ๊ณ
| RE๋ก ์ ๋๋ ๊ฒ | RE๋ก ์ ๋๋ ๊ฒ |
|---|---|
| keyword | 0โฟ1โฟ |
| identifier | ๊ดํธ ์ง ๋ง์ถ๊ธฐ |
| literal | ์ค์ฒฉ๋ expression/statement ์ ์ฒด |
| operator, punctuation | self embedding ๊ตฌ์กฐ |
์ด๋ก ๊ด๊ณ
- RE < CFG โ ๋ชจ๋ regular language๋ CFG๋ก ํํ ๊ฐ๋ฅ, ํ์ง๋ง ๋ชจ๋ CFL์ด regular์ธ ๊ฑด ์๋
์ ๊ทํํ์ ๋ฌธ์ ์ ๋ต ๋ชจ์
| ๋ฌธ์ | ์ ๊ทํํ์ |
|---|---|
| Ruby binary | 0b[01]+ |
Ruby binary + _ |
0b[01](_?[01])* |
| Ada identifier | [a-zA-Z]([a-zA-Z0-9]|_[a-zA-Z0-9])* |
| Floating-point | [0-9]+\.[0-9]+ |
| Scientific notation | [0-9]+\.[0-9]+([eE][+-]?[0-9]+)? |
Subset Construction ์ํ ํฌ์ธํธ
Move(T, ฮฑ): ์ํ ์งํฉ T์์ ฮฑ๋ก ์ด๋ํ๋ ์ํ๋คฮต-closure(T): ฮต ์ ์ด๋ก ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์ํ๋ค- ๋ฐ๋ณต: ๋ ์ด์ ์ํ ์ถ๊ฐ ์์ ๋๊น์ง (fixed-point)
- DFA ์์ ์ํ: ๋ฐ๋์ ฮต-closure(s0)
COMP321 Compiler โ Lexical Analysis Part 3
Kyungpook National University | Hwisoo So | Spring 2026
๐ 26ํ์ด์ง โ ์์ ์ํ ํ์ธ
ํ์ฌ ์ํ
Dstates = { {s0, s1} }
DFA ์ํ ์งํฉ์๋ ํ์ฌ {s0, s1} ํ๋๋ง ์๋ค.
Dstates contains now one elementโฆ
Dstates์๋ ํ์ฌ ํ๋์ ์ํ {s0, s1}๊ฐ ์๋ค.
์ด ์ํ๋ ์ด๋์ ์๋?
ฮต-closure(s0) = {s0, s1}
์ฆ ์์ ์ํ๋ค.
Note1: unmarked states are printed in red
์์ง ์ฒ๋ฆฌ๋์ง ์์ ์ํ๋ ๋นจ๊ฐ์์ผ๋ก ํ์๋๋ค.
Note2: Dstates means โdeterministic statesโ
Dstates๋ DFA ์ํ๋ค์ ์๋ฏธํ๋ค.
๐ฅ ํต์ฌ
| ํ์ฌ ์ํ | ์ฒ๋ฆฌ ์ฌ๋ถ |
|---|---|
{s0, s1} |
์์ง ์ฒ๋ฆฌ ์ ํจ (unmarked) |
๐ 27ํ์ด์ง โ ์ฒซ ์ํ ์ฒ๋ฆฌ ์์
Now we pick state {s0, s1} and mark it
์ด์ {s0, s1} ์ํ๋ฅผ ์ ํํ๊ณ ์ฒ๋ฆฌ ์๋ฃ๋ก ํ์ํ๋ค.
subset construction ํต์ฌ ํ๋ฆ:
- unmarked ์ํ ์ ํ
- ์ฒ๋ฆฌ
- mark
marked states are printed in green
์ฒ๋ฆฌ๋ ์ํ๋ ์ด๋ก์์ผ๋ก ํ์๋๋ค.
๐ฅ ํต์ฌ
์ํ {s0, s1} โ ์ด์ ์ฒ๋ฆฌ ์์ โ ์ดํ transition ๊ณ์ฐํ ๋์
๐ 28ํ์ด์ง โ ์ ๋ ฅ ์งํฉ ํ์ธ
T = {s0, s1}, ฮฃ = {a, b}
ํ์ฌ ์ํ T๋ {s0, s1}, ์
๋ ฅ ์งํฉ์ {a, b}
DFA๋ ๋ชจ๋ ์ ๋ ฅ์ ๋ํด transition์ด ํ์ํ๋ค. ์ฆ:
- a์ ๋ํด? โ ๊ณ์ฐ ํ์
- b์ ๋ํด? โ ๊ณ์ฐ ํ์
The for loop iterates over all symbols
for๋ฌธ์ ๋ชจ๋ ์ ๋ ฅ ๋ฌธ์์ ๋ํด ๋ฐ๋ณตํ๋ค.
๐ฅ ํต์ฌ โ ์ง๊ธ ํด์ผ ํ ๊ฒ
Move({s0, s1}, a) = ?
Move({s0, s1}, b) = ?
๐ 29ํ์ด์ง โ ฮฑ = a ๊ณ์ฐ
Move(T, a) = {s1, s2}
{s0, s1}์์ a๋ฅผ ์ฝ์ผ๋ฉด {s1, s2}๋ก ๊ฐ๋ค.
์ ์ด๋ ๊ฒ ๋๋๊ฐ? ๊ณ์ฐ ๊ณผ์
| ์ํ | a ์ ๋ ฅ | ๊ฒฐ๊ณผ |
|---|---|---|
| s0์์ a | s0 โ s1 | s1 |
| s1์์ a | s1 โ s1, s1 โ s2 | s1, s2 |
ํฉ์น๋ฉด: {s1, s2}
ฮต-closure({s1, s2}) = {s1, s2}
ฮต-transition์ผ๋ก ๋ ๊ฐ ๊ณณ ์์ โ ๊ทธ๋๋ก {s1, s2}
U = {s1, s2}
๋ค์ ์ํ๋ {s1, s2}
๐ฅ ํต์ฌ
ฮด({s0,s1}, a) = {s1, s2}
๐ 30ํ์ด์ง โ ์ ์ํ ์ถ๊ฐ
State U is not in Dstates โ add it
์ด ์ํ {s1, s2}๋ ์์ง ์์ผ๋ฏ๋ก ์ถ๊ฐํ๋ค.
Dstates ์ ๋ฐ์ดํธ
์ด์ : Dstates = { {s0, s1} }
โ
์ดํ: Dstates = { {s0, s1}, {s1, s2} }
๐ผ ๊ทธ๋ฆผ ์ค๋ช
{s0, s1} โaโ> {s1, s2}
๐ฅ ํต์ฌ
DFA ์ํ ํ์ฅ ์์๋จ
๐ฅ 26~30ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
| 1. ์์ ์ํ | {s0, s1} = ฮต-closure(s0) |
| 2. ์ฒ๋ฆฌ ์์ | T = {s0, s1} mark |
| 3. a์ ๋ํด | Move({s0,s1}, a) = {s1, s2} |
| 4. ฮต-closure | = {s1, s2} |
| 5. ์ํ ์ถ๊ฐ | Dstates = { {s0,s1}, {s1,s2} } |
์ด ๊ตฌ๊ฐ ํต์ฌ ๊ฐ๊ฐ
- NFA๋ โ๊ฐ๋ฆผ๊ธธโ โ DFA๋ โ๋ชจ๋ ๊ฐ๋ฆผ๊ธธ์ ํ ๋ฒ์ ํฌํจโ
- ํ ์ํ = ์ฌ๋ฌ ์ํ์ ๋ฌถ์
๐ฅ ์ํ ํฌ์ธํธ
| ํด์ผ ํ ๊ฒ | ๋ด์ฉ |
|---|---|
| Move ๊ณ์ฐ | ๊ฐ ์ํ์์ ๊ฐ ์ ์๋ ๋ชจ๋ ์ํ ํฉ์งํฉ |
| ฮต-closure ์ ์ฉ | ์ ๋ ฅ ์์ด ๊ฐ ์ ์๋ ์ํ๊น์ง ํฌํจ |
| ์๋ก์ด ์ํ ํ๋ณ | ์์ผ๋ฉด ์ถ๊ฐ |
๐ 31ํ์ด์ง โ ์ ์ด ํจ์ ฮด ๊ตฌ์ฑ ์์
Here we start assembling the transition function ฮด
์ด์ ์ ์ด ํจ์ ฮด๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์์ํ๋ค.
์ง๊ธ๊น์ง ํ ๊ฑด โ์ํ ์ฐพ๊ธฐโ์๊ณ , ์ด์ ๋ถํฐ๋ โ์ ์ดํ ๋ง๋ค๊ธฐโ๋ค.
If we read an a in state T, then DFA moves to {s1, s2}
์ํ T์์ a๋ฅผ ์ฝ์ผ๋ฉด DFA๋ {s1, s2}๋ก ์ด๋ํ๋ค.
์ด๋ฏธ ๊ตฌํ ๊ฒ:
ฮด({s0, s1}, a) = {s1, s2}
ฮด ์ ์ดํ (ํ์ฌ)
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
ย |
๐ฅ ํต์ฌ
DFA transition table ๋ง๋ค๊ธฐ ์์
๐ 32ํ์ด์ง โ b ์ฒ๋ฆฌ ์์
ํ์ฌ ์ํ
Dstates = { {s0, s1}, {s1, s2} }
Second iteration: ฮฑ = b
๋ ๋ฒ์งธ ๋ฐ๋ณต: ์ ๋ ฅ b
- a๋ ๋๋ฌ๊ณ
- ์ด์ b ์ฒ๋ฆฌ ์ฐจ๋ก
๐ฅ ํต์ฌ โ ์ง๊ธ ํด์ผ ํ ๊ฒ
Move({s0,s1}, b) = ?
๐ 33ํ์ด์ง โ ฮฑ = b ๊ณ์ฐ
Move(T, b) = {s1}
{s0, s1}์์ b๋ฅผ ์ฝ์ผ๋ฉด {s1}๋ก ๊ฐ๋ค.
์ ์ด๋ ๊ฒ ๋๋๊ฐ? ๊ณ์ฐ ๊ณผ์
| ์ํ | b ์ ๋ ฅ | ๊ฒฐ๊ณผ |
|---|---|---|
| s0์์ b | ์ด๋ ์์ | โ |
| s1์์ b | s1 โ s1 | s1 |
๊ฒฐ๊ณผ: {s1}
ฮต-closure({s1}) = {s1}
ฮต ์ด๋ ์์ โ ๊ทธ๋๋ก {s1}
๐ฅ ํต์ฌ
ฮด({s0,s1}, b) = {s1}
๐ 34ํ์ด์ง โ ์ ์ํ {s1} ์ถ๊ฐ
State U is not in Dstates โ add it
{s1}๋ ์์ง ์์ผ๋ฏ๋ก ์ถ๊ฐํ๋ค.
Dstates ์ ๋ฐ์ดํธ
์ด์ : Dstates = { {s0,s1}, {s1,s2} }
โ
์ดํ: Dstates = { {s0,s1}, {s1,s2}, {s1} }
๐ฅ ํต์ฌ
์๋ก์ด DFA ์ํ {s1} ๋ฑ์ฅ
๐ 35ํ์ด์ง โ ฮด ํ ์ด๋ธ ์ ๋ฐ์ดํธ
If we read b in state T, DFA moves to {s1}
์ํ T์์ b๋ฅผ ์ฝ์ผ๋ฉด {s1}๋ก ์ด๋ํ๋ค.
ฮด ์ ์ดํ (์ ๋ฐ์ดํธ)
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
์ฒซ ๋ฒ์งธ ์ํ {s0,s1}์ ๋ํ transition ์์ฑ
๐ฅ 31~35ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
์ํ {s0,s1} ์ฒ๋ฆฌ ์๋ฃ
| ์ ๋ ฅ | ๊ฒฐ๊ณผ |
|---|---|
| a | {s1,s2} |
| b | {s1} |
ํ์ฌ DFA ์ํ
{s0,s1} โ (์๋ฃ)
{s1,s2} โ (๋ฏธ์ฒ๋ฆฌ)
{s1} โ (๋ฏธ์ฒ๋ฆฌ)
ํ์ฌ ์ ์ด ๊ตฌ์กฐ
{s0,s1}
โโ a โ {s1,s2}
โโ b โ {s1}
๐ฅ ์ํ ํต์ฌ ํฌ์ธํธ
| ์ค์ ์ ํ | ๋ด์ฉ |
|---|---|
| โ s0์์ b ์ ๊ฐ๋๋ฐ ํฌํจ์ํค๋ ๊ฒฝ์ฐ | s0 โ b ์ด๋ ์์ ํ์ธ ํ์ |
| โ ฮต-closure ๋นผ๋จน๋ ๊ฒฝ์ฐ | Move ํ ๋ฐ๋์ ฮต-closure ์ ์ฉ |
| โ ๊ธฐ์กด ์ํ์ธ๋ฐ ๋ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ | ์ด๋ฏธ ์์ผ๋ฉด ์ ๋ ์ถ๊ฐ ์ ํจ |
๐ 36ํ์ด์ง โ ๋ค์ ์ฒ๋ฆฌ ๋์ ์ ํ
ํ์ฌ ์ํ
Dstates = { {s0,s1}, {s1,s2}, {s1} }
Dstates contains now two unmarked states: {s1,s2} and {s1}
์์ง ์ฒ๋ฆฌ ์ ๋ ์ํ๋ {s1,s2}์ {s1} ๋ ๊ฐ
| ์ํ | ์ฒ๋ฆฌ ์ฌ๋ถ |
|---|---|
{s0,s1} |
โ ์๋ฃ |
{s1,s2} |
โ ๋ฏธ์ฒ๋ฆฌ |
{s1} |
โ ๋ฏธ์ฒ๋ฆฌ |
๋ค์ ์ฒ๋ฆฌ ๋์: T = {s1, s2}
๐ฅ ํต์ฌ
์ด์ {s1,s2} ์ํ๋ฅผ ์ฒ๋ฆฌํด์ผ ํจ
๐ 37ํ์ด์ง โ {s1,s2} ์ฒ๋ฆฌ ์์
T = {s1, s2}
ํ์ฌ ์ฒ๋ฆฌํ ์ํ๋ {s1,s2}
ํด์ผ ํ ๊ฒ
Move({s1,s2}, a) = ?
Move({s1,s2}, b) = ?
๐ฅ ํต์ฌ
์๋ก์ด ์ํ ๋ง๋ค์ด์ง ๊ฐ๋ฅ์ฑ ์์
๐ 38ํ์ด์ง โ ฮฑ = a ๊ณ์ฐ
ฮฑ = a
์ ๋ ฅ a์ ๋ํด ๊ณ์ฐ
๊ณ์ฐ ๊ณผ์
| ์ํ | a ์ ๋ ฅ | ๊ฒฐ๊ณผ |
|---|---|---|
| s1์์ a | s1 โ s1, s1 โ s2 | s1, s2 |
| s2์์ a | ์ด๋ ์์ | โ |
๊ฒฐ๊ณผ: {s1, s2}
ฮต-closure({s1, s2}) = {s1, s2}
์ถ๊ฐ ฮต ์ด๋ ์์ โ ๊ทธ๋๋ก {s1, s2}
๐ฅ ํต์ฌ
ฮด({s1,s2}, a) = {s1,s2}
๐ ์๊ธฐ ์์ ์ผ๋ก ๋์์ด (self-loop)
๐ 39ํ์ด์ง โ ์ค๋ณต ์ํ ํ์ธ
U = {s1,s2} already in Dstates
์ด ์ํ๋ ์ด๋ฏธ ์กด์ฌํจ
- ์๋ก์ด ์ํ๊ฐ ์๋
- Dstates ๋ณํ ์์
๐ฅ ํต์ฌ
๊ธฐ์กด ์ํ๋ฉด ์ถ๊ฐ ์ ํจ โ ์ ์ด ๊ธฐ๋ก๋ง ํจ
๐ 40ํ์ด์ง โ ์ฒ๋ฆฌ ์๋ฃ (a)
Nothing to be done here
์ถ๊ฐ ์์ ์์ โ ์ด๋ฏธ ์๋ ์ํ โ skip
ํ์ฌ๊น์ง transition
{s1,s2} --a--> {s1,s2} (self-loop)
๐ฅ 36~40ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
| 1. ์ฒ๋ฆฌ ๋์ | T = {s1,s2} |
| 2. a ์ ๋ ฅ | Move({s1,s2}, a) = {s1,s2} |
| 3. ฮต-closure ์ ์ฉ | = {s1,s2} |
| 4. ์ํ ์กด์ฌ ์ฌ๋ถ | ์ด๋ฏธ ์์ โ ์ถ๊ฐ X |
| 5. transition ์ถ๊ฐ | ฮด({s1,s2}, a) = {s1,s2} |
ํ์ฌ ๋์ ์ ์ด
{s0,s1}
โโ a โ {s1,s2}
โโ b โ {s1}
{s1,s2}
โโ a โ {s1,s2} (self-loop)
๐ฅ ์ค์ํ ํจํด โ self-loop
{s1,s2} --a--> {s1,s2}
์ด๋ฐ ๊ตฌ์กฐ๋ ์ํ ์์ ํ ๋๋ โ ์ํ์์ ์์ฃผ ๋์ค๋ ๊ตฌ์กฐ
์ด ๊ตฌ๊ฐ ํต์ฌ ํฌ์ธํธ
- ์ํ ์ค๋ณต ์ฒดํฌ: ์ด๋ฏธ ์์ผ๋ฉด ์ ๋ ์ถ๊ฐํ์ง ์์
- self-loop ์ดํด: ์ํ๊ฐ ์๊ธฐ ์์ ์ผ๋ก ๋์์ฌ ์ ์์
- Move ๊ณ์ฐ ์ ํํ: ์งํฉ ์ ๋ชจ๋ ์ํ ๋ค ๊ณ ๋ คํด์ผ ํจ
๐ 41ํ์ด์ง โ ฮด ํ ํ์ (a ๋ถ๋ถ)
ํ์ฌ ฮด ์ ์ดํ
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
ย |
{s1,s2}์์ a์ ๋ํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ดํ์ ๊ณต์ ๋ฐ์ํ ๋จ๊ณ.
์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋๊ฐ?
s1์์ a โ s1, s2
s2์์ a โ ์ด๋ ์์
ํฉ์น๋ฉด: {s1, s2}
์ฆ {s1,s2}์์ a๋ฅผ ์ฝ์ด๋ ๊ทธ๋๋ก {s1,s2}์ ๋จธ๋ฌธ๋ค โ self-loop
๐ฅ ํต์ฌ
{s1,s2} --a--> {s1,s2}
๐ 42ํ์ด์ง โ ฮฑ = b ๊ณ์ฐ ์์
T = {s1, s2} ฮฑ = b
ํ์ฌ ์ํ๋ {s1,s2}, ์ด๋ฒ์๋ ์
๋ ฅ b์ ๋ํด ๊ณ์ฐํ๋ค.
- a๋ ๋๋ฌ๊ณ
- ๋จ์ ์ ๋ ฅ b๋ฅผ ์ฒ๋ฆฌํ๋ ์ฐจ๋ก
ํด์ผ ํ ๊ณ์ฐ
Move({s1,s2}, b) = ?
์ฌ๊ธฐ์ ์ ์ํ๊ฐ ๋์ฌ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๐ฅ ํต์ฌ
์ํ: {s1,s2} / ์
๋ ฅ: b โ ๊ณ์ฐ ์์
๐ 43ํ์ด์ง โ ์ ์ํ {s1,s3} ๋ฑ์ฅ
U = {s1, s3}
๋ค์ ์ํ U๋ {s1, s3}์ด๋ค.
์ ์ด๋ ๊ฒ ๋๋๊ฐ? ๊ณ์ฐ ๊ณผ์
Move({s1,s2}, b):
s1์์ b โ s1 โ s1
s2์์ b โ s2 โ s3
ํฉ์น๋ฉด: {s1, s3}
ฮต-closure({s1,s3}) = {s1,s3}
์ถ๊ฐ ฮต ์ด๋ ์์ โ ๊ทธ๋๋ก {s1, s3}
์ด ์ํ๊ฐ ์ค์ํ ์ด์
| ์ํ | ์๋ฏธ |
|---|---|
| s1 | ๊ณ์ ๋ฐ๋ณต ๊ตฌ์กฐ ์ชฝ ์ํ |
| s3 | accepting state s4 ๋ฐ๋ก ์ง์ ์ํ |
์ฆ {s1,s3}๋ โ์์ง ๋ฐ๋ณต๋ ๊ฐ๋ฅํ๊ณ , ํํธ์ผ๋ก๋ ์์ฉ ์ํ์ ๊ฐ๊น์์ง ์ํโ๋ค.
๐ฅ ํต์ฌ
ฮด({s1,s2}, b) = {s1,s3}
๐ 44ํ์ด์ง โ ์ ์ํ ์ฌ๋ถ ํ์ธ
ํ์ฌ ์ํฉ
U = {s1, s3}
T = {s1,s2}
ฮฑ = b
Dstates = { {s0,s1}, {s1,s2}, {s1} }
ํ์ฌ Dstates์๋ {s1,s3}๊ฐ ๋ค์ด ์์ง ์๋ค.
๊ฒฐ๋ก
{s1,s3} ๋ ์๋ก์ด DFA ์ํ โ ์ถ๊ฐ ํ์
๐ 45ํ์ด์ง โ Dstates ์ ๋ฐ์ดํธ
์ ๋ฐ์ดํธ ๊ฒฐ๊ณผ
Dstates = { {s0,s1}, {s1,s2}, {s1}, {s1,s3} }
DFA ์ํ ์งํฉ์ด ์ด์ ๋ค ๊ฐ๊ฐ ๋๋ค.
ฮด ์ ์ดํ ์ ๋ฐ์ดํธ
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
ฮด({s1,s2}, b) = {s1,s3} ๊ณต์ ๋ฐ์ ์๋ฃ.
์ด ์ํ๊ฐ ์ค์ํ ์ด์
{s1,s3}๋ ์์ผ๋ก ์
๋ ฅ b๋ฅผ ํ๋ ๋ ์ฝ์ผ๋ฉด s4(accepting) ์ชฝ์ผ๋ก ๊ฐ ์ ์๋ค.
์ฆ, ์ด์ DFA๊ฐ accepting NFA state๋ฅผ ํฌํจํ๋ ์ํ๋ก ์ด์ด์ง ์ค๋น๋ฅผ ํ ์
์ด๋ค.
๐ฅ 41~45ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
1. {s1,s2}์์ a |
ฮด({s1,s2}, a) = {s1,s2} โ self-loop |
2. {s1,s2}์์ b |
Move({s1,s2}, b) = {s1,s3} |
| 3. ฮต-closure ์ ์ฉ | = {s1,s3} |
| 4. ์ํ ์ถ๊ฐ | Dstates = { {s0,s1}, {s1,s2}, {s1}, {s1,s3} } |
| 5. ์ ์ดํ ์ ๋ฐ์ดํธ | ฮด({s1,s2}, b) = {s1,s3} |
ํ์ฌ๊น์ง ์ ์ฒด DFA ๊ตฌ์กฐ
{s0,s1}
โโ a โ {s1,s2}
โโ b โ {s1}
{s1,s2}
โโ a โ {s1,s2} (self-loop)
โโ b โ {s1,s3}
๐ฅ ์ํ์์ ์ค์ํ ํฌ์ธํธ
| ํฌ์ธํธ | ์ค๋ช |
|---|---|
| ์ฌ๋ฌ ์ํ์ ์ด๋์ ํฉ์งํฉ | Move({s1,s2}, b) = Move(s1,b) โช Move(s2,b) |
| ๊ธฐ์กด ์ํ์ธ์ง ํญ์ ํ์ธ | ์ด๋ฏธ ์์ผ๋ฉด ์ถ๊ฐ X, ์์ผ๋ฉด ์ถ๊ฐ O |
| accepting ํฌํจ ์ฌ๋ถ ๋์ค์ ์ฒดํฌ | ํ์ฌ {s1,s3}๋ ์์ง s4 ์์, ๊ณง {s1,s4} ๋ฑ์ฅ ์์ |
๐ 46ํ์ด์ง โ ๋ค์ ์ฒ๋ฆฌ ๋์: {s1}
ํ์ฌ ์ํ
Dstates = { {s0,s1}, {s1,s2}, {s1}, {s1,s3} }
| ์ํ | ์ฒ๋ฆฌ ์ฌ๋ถ |
|---|---|
{s0,s1} |
โ ์๋ฃ |
{s1,s2} |
โ ์๋ฃ |
{s1} |
โ ๋ฏธ์ฒ๋ฆฌ |
{s1,s3} |
โ ๋ฏธ์ฒ๋ฆฌ |
{ s1 } is the next unmarked state in Dstates.
{s1}์ด Dstates์์ ๋ค์์ผ๋ก ์ฒ๋ฆฌํ ๋ฏธํ์(unmarked) ์ํ์ด๋ค.
subset construction์ ํ๋ฆ:
- ์์ง ์ฒ๋ฆฌ ์ ํ ์ํ ํ๋ ๊ณ ๋ฆ
- ๊ทธ ์ํ์์ ์ ๋ ฅ ๋ฌธ์ ์ ๋ถ์ ๋ํด Move ๊ณ์ฐ
- ๊ฒฐ๊ณผ ์ํ๋ฅผ ์ถ๊ฐ/๊ธฐ๋ก
- mark ์ฒ๋ฆฌ
๐ฅ ํต์ฌ
๋ค์ ์ฒ๋ฆฌ ๋์: T = {s1}
๐ 47ํ์ด์ง โ {s1}์์ a ๊ณ์ฐ
T = { s1 } ฮฑ = a
ํ์ฌ ์ํ๋ {s1}, ์
๋ ฅ a์ ๋ํด ๊ณ์ฐํ๋ค.
ํด์ผ ํ ๊ณ์ฐ
Move({s1}, a) = ?
์์๊ฐ ํ๋๋ฟ์ด๋ฏ๋ก ์ฌ์ค์ NFA ์ํ s1 ํ๋์์์ ์ด๋๋ง ๋ณด๋ฉด ๋๋ค.
๐ฅ ํต์ฌ
์ง๊ธ๋ถํฐ ๊ณ์ฐํ ๊ฒ: ฮด({s1}, a)
๐ 48ํ์ด์ง โ ๊ณ์ฐ ๊ฒฐ๊ณผ
U = { s1 , s2 }
๋ค์ ์ํ U๋ {s1, s2}์ด๋ค.
์ ์ด๋ ๊ฒ ๋๋๊ฐ? ๊ณ์ฐ ๊ณผ์
Move({s1}, a):
s1์์ a โ s1 โ s1
โ s1 โ s2
๊ฒฐ๊ณผ: {s1, s2}
ฮต-closure({s1,s2}) = {s1,s2}
์ถ๊ฐ ฮต ์ด๋ ์์
์๋ฏธ ์ค๋ช
s1์ ์๋ โa๋ฅผ ์ฝ์ผ๋ฉด ์๊ธฐ ์์ ์ ๋จธ๋ฌผ ์๋ ์๊ณ , ๋ค์ ๋จ๊ณ์ธ s2๋ก๋ ๊ฐ ์ ์๋โ ๋น๊ฒฐ์ ์ํ์๋ค. DFA์์๋ ๊ทธ ๋ ๊ฐ๋ฅ์ฑ์ ํ ๋ฒ์ ๋ด์์ผ ํ๋ฏ๋ก:
{s1} --a--> {s1,s2}
๐ฅ ํต์ฌ
ฮด({s1}, a) = {s1,s2}
๐ 49ํ์ด์ง โ ์ ์ดํ ๋ฐ์ (๊ธฐ์กด ์ํ)
ํ์ฌ ฮด ์ ์ดํ
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
ย |
{s1}์์ a๋ฅผ ์ฝ์ผ๋ฉด {s1,s2}๋ก ๊ฐ๋ค๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ฮด ํ์ ๊ธฐ๋ก ์๋ฃ.
์ค์ํ ํฌ์ธํธ
์ฌ๊ธฐ์ ์ค์ํ ์ ์ {s1,s2}๊ฐ ์ด๋ฏธ Dstates ์์ ์๋ ์ํ๋ผ๋ ์ ์ด๋ค.
- ์๋ก์ด ์ํ ์๋ โ ์ถ๊ฐ๋ ์ ํจ
- ์ ์ดํ๋ง ๊ธฐ๋ก
ํ์๋ค์ด ์์ฃผ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ:
โ โ๊ฒฐ๊ณผ๊ฐ ๋์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ํ ์ถ๊ฐโ โ ํ๋ฆผ
โ ์์ ๋๋ง ์ถ๊ฐ, ์์ผ๋ฉด ์ ์ด๋ง ๊ธฐ๋ก
๐ฅ ํต์ฌ
์ด ํ์ด์ง์ ํต์ฌ:
๊ธฐ์กด ์ํ๋ก ๊ฐ๋ ์ ์ด๋ฅผ ํ์ ๋ฐ์
๐ 50ํ์ด์ง โ {s1}์์ b ๊ณ์ฐ ์์
T = { s1 } ฮฑ = b
ํ์ฌ ์ํ๋ {s1}, ์ด๋ฒ์๋ ์
๋ ฅ b์ ๋ํด ๊ณ์ฐํ๋ค.
ํด์ผ ํ ๊ฒ
Move({s1}, b) = ?
{s1}์ ๋ํ ์ ์ด๋ ๋ ๊ฐ๋ฅผ ๋ค ์ฑ์์ผ ํ๋ค:
- a โ ์ด๋ฏธ ๊ณ์ฐํจ (=
{s1,s2}) - b โ ์ง๊ธ๋ถํฐ ๊ณ์ฐ
๊ทธ๋์ผ DFA์์ {s1} ํ์ด ์์ฑ๋๋ค.
๐ฅ ํต์ฌ
๋ค์ ๊ณ์ฐ: ฮด({s1}, b)
๐ฅ 46~50ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
| 1. ๋ค์ ์ฒ๋ฆฌ ์ํ ์ ํ | T = {s1} |
| 2. a์ ๋ํด ๊ณ์ฐ | Move({s1}, a) = {s1,s2} |
| 3. ฮต-closure ์ ์ฉ | = {s1,s2} |
| 4. ์ ์ดํ ๋ฐ์ | ฮด({s1}, a) = {s1,s2} (๊ธฐ์กด ์ํ โ ์ถ๊ฐ ์์) |
| 5. b ๊ณ์ฐ ์์ | ฮด({s1}, b) ๊ณ์ฐ ์ค๋น |
ํ์ฌ๊น์ง ๋์ ๋ DFA ์ ์ดํ
| DFA ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
์์ง ๊ณ์ฐ ์ค |
{s1,s3} |
์์ง ๋ฏธ์ฒ๋ฆฌ | ์์ง ๋ฏธ์ฒ๋ฆฌ |
๐ฅ ์ด ๊ตฌ๊ฐ์์ ๊ผญ ์ดํดํด์ผ ํ ํฌ์ธํธ
-
์์ ํ๋์ง๋ฆฌ ์งํฉ ์ํ๋ ๊ฒฐ๊ตญ DFA ์ํ๋ค
{s1}๋ ๊ทธ๋ฅ ํ๋์ DFA ์ํ๋ค. -
์งํฉ ์ํ์์ ๊ณ์ฐํ ๋๋ ๊ท์น์ ๊ฐ๋ค
Move โ ฮต-closure โ ๊ธฐ์กด ์ํ์ธ์ง ํ์ธ โ ์ ์ดํ ๊ธฐ๋ก -
๊ธฐ์กด ์ํ๋ฉด ์๋ก ์ถ๊ฐํ์ง ์๋๋ค
{s1,s2}๋ ์ด๋ฏธ ์์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐํ์ง ์๊ณ ์ ์ด๋ง ์ ๋๋ค.COMP321 Compiler โ Lexical Analysis Part 3
Kyungpook National University | Hwisoo So | Spring 2026
๐ 51ํ์ด์ง โ {s1}์์ b ๊ณ์ฐ
T = { s1 } ฮฑ = b
ํ์ฌ ์ํ {s1}์์ ์
๋ ฅ b์ ๋ํด ๊ณ์ฐํ๋ค.
๊ณ์ฐ ๊ณผ์
Move({s1}, b):
s1์์ b โ s1 โ s1
๊ฒฐ๊ณผ: {s1}
ฮต-closure({s1}) = {s1}
์ถ๊ฐ ฮต ์ด๋ ์์ โ ๊ทธ๋๋ก {s1}
๐ฅ ์ต์ข ๊ฒฐ๊ณผ
ฮด({s1}, b) = {s1}
์๋ฏธ โ ์์ ํ ๋ฃจํํ ์ํ
{s1} ์ํ๋:
| ์ ๋ ฅ | ๊ฒฐ๊ณผ |
|---|---|
| a | {s1,s2} |
| b | {s1} โ self-loop |
๐ 52ํ์ด์ง โ {s1} ์ ์ด ์์ฑ
ฮด ์ ์ดํ ๋ฐ์
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
{s1} |
{s1} ์ํ ์ ์ด ์์ฑ
๐ฅ ํต์ฌ
{s1} โ a โ {s1,s2}
{s1} โ b โ {s1} (self-loop)
์ด ์ํ๋ ์์ ํ โ๋ฃจํํ ์ํโ โ b๋ฅผ ๊ณ์ ์ฝ์ด๋ ์๊ธฐ ์์ ์ ๋จธ๋ฌธ๋ค.
๐ 53ํ์ด์ง โ ์์ง ๋ฏธ์ฒ๋ฆฌ ์ํ ๋จ์์์
ํ์ฌ ์ฒ๋ฆฌ ํํฉ
Dstates = {
{s0,s1}, โ ์๋ฃ
{s1,s2}, โ ์๋ฃ
{s1}, โ ์๋ฃ
{s1,s3} โ ๋ฏธ์ฒ๋ฆฌ
}
์์ง ์ฒ๋ฆฌ ์ ๋ ์ํ๊ฐ ๋จ์ ์๋ค โ ์๊ณ ๋ฆฌ์ฆ ๊ณ์ ์งํ
๐ฅ ํต์ฌ
๋ค์ ์ฒ๋ฆฌ ๋์: T = {s1,s3}
๐ 54ํ์ด์ง โ {s1,s3}์์ a ๊ณ์ฐ
T = { s1, s3 } ฮฑ = a
ํ์ฌ ์ํ {s1,s3}์์ ์
๋ ฅ a์ ๋ํด ๊ณ์ฐํ๋ค.
๊ณ์ฐ ๊ณผ์
Move({s1,s3}, a):
s1์์ a โ s1 โ s1
โ s1 โ s2
s3์์ a โ ์ด๋ ์์
๊ฒฐ๊ณผ: {s1, s2}
ฮต-closure({s1,s2}) = {s1,s2}
์ถ๊ฐ ฮต ์ด๋ ์์
๐ฅ ๊ฒฐ๊ณผ
ฮด({s1,s3}, a) = {s1,s2}
์๋ฏธ
{s1,s3}์์ a๋ฅผ ์ฝ์ผ๋ฉด ๋ค์ ๋ฐ๋ณต ์ํ {s1,s2}๋ก ๋์๊ฐ๋ค.
๐ 55ํ์ด์ง โ {s1,s3}์์ b ๊ณ์ฐ (โญ ํต์ฌ)
T = { s1, s3 } ฮฑ = b
ํ์ฌ ์ํ {s1,s3}์์ ์
๋ ฅ b์ ๋ํด ๊ณ์ฐํ๋ค.
๊ณ์ฐ ๊ณผ์
Move({s1,s3}, b):
s1์์ b โ s1 โ s1
s3์์ b โ s3 โ s4 โ accepting state!
๊ฒฐ๊ณผ: {s1, s4}
ฮต-closure({s1,s4}) = {s1,s4}
์ถ๊ฐ ฮต ์ด๋ ์์
๐ฅ ๊ฒฐ๊ณผ
ฮด({s1,s3}, b) = {s1,s4}
โญ ๋งค์ฐ ์ค์ํ ํฌ์ธํธ โ accepting state ๋ฑ์ฅ
| ์ํ | ์๋ฏธ |
|---|---|
| s1 | ์์ง ๋ฐ๋ณต ๊ฐ๋ฅ |
| s4 | accepting state |
์ฆ {s1,s4}๋:
- ์์ง ๋ฐ๋ณต๋ ๊ฐ๋ฅ (s1)
- ๋์์ accept ์ํ ํฌํจ (s4)
โ โ์ด ๋ฌธ์์ด์ accept ๊ฐ๋ฅ ์ํ์ ๋๋ฌํ๋คโ
๐ฅ 51~55ํ์ด์ง ์ ์ฒด ํ๋ฆ ์์ฝ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
1. {s1} ์ฒ๋ฆฌ ์๋ฃ |
a โ {s1,s2} / b โ {s1} (self-loop) |
| 2. ๋ค์ ์ฒ๋ฆฌ | T = {s1,s3} |
| 3. a ์ฒ๋ฆฌ | {s1,s3} โ a โ {s1,s2} |
| 4. b ์ฒ๋ฆฌ | {s1,s3} โ b โ {s1,s4} โ accepting ํฌํจ |
| 5. ์ ์ํ ๋ฑ์ฅ | {s1,s4} |
ํ์ฌ๊น์ง ๋์ ์ ์ดํ
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
{s1} |
{s1,s3} |
{s1,s2} |
{s1,s4} |
์ด ๊ตฌ๊ฐ ํต์ฌ ํฌ์ธํธ
| ๊ฐ๋ | ์ค๋ช |
|---|---|
| accepting state ํ๋จ ๊ธฐ์ค | DFA ์ํ ์์ accepting NFA ์ํ ํฌํจํ๋ฉด accept |
{s1} |
์์ ๋ฐ๋ณต ์ํ (self-loop) |
{s1,s2} |
์ค๊ฐ ๋จ๊ณ ์ํ |
{s1,s3} |
accept ์ง์ ์ํ |
{s1,s4} |
accept ์ํ |
๐ 56ํ์ด์ง โ {s1,s4} ์ ์ด ๊ณ์ฐ
T = { s1, s3 } ฮฑ = b โ {s1,s4} ํ์
{s1, s3}์์ b๋ฅผ ์ฝ์ผ๋ฉด {s1, s4}๋ก ๊ฐ๋ค.
Move({s1,s3}, b):
s1์์ b โ s1
s3์์ b โ s4
๊ฒฐ๊ณผ: {s1, s4}
์ด ์๊ฐ์ด ์์ฃผ ์ค์ํ๋ค. ์๋ํ๋ฉด ์ด์ DFA ์์ accepting state๊ฐ ์๊ธฐ๊ธฐ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ฅ ํต์ฌ
ฮด({s1,s3}, b) = {s1,s4}
๐ 57ํ์ด์ง โ U = {s1, s4} ํ์
U = { s1, s4 }
๋ค์ ์ํ U๋ {s1, s4}์ด๋ค.
{s1,s4}๋ ๊ทธ๋ฅ ์๋ก์ด ์ํ๊ฐ ์๋๋ผ accepting NFA state๋ฅผ ํฌํจํ๋ DFA ์ํ๋ค.
์ฆ DFA ๊ด์ ์์ ์ด ์ํ๋ ๋์ค์ accepting state๊ฐ ๋๋ค.
๐ 58ํ์ด์ง โ {s1,s4} Dstates์ ์ถ๊ฐ
U not yet in Dstates โ add.
{s1,s4}๋ ์์ง Dstates์ ์์ผ๋ฏ๋ก ์ถ๊ฐํ๋ค.
Dstates ์ ๋ฐ์ดํธ
์ด์ :
Dstates = { {s0,s1}, {s1,s2}, {s1}, {s1,s3} }
์ดํ:
Dstates = {
{s0,s1},
{s1,s2},
{s1},
{s1,s3},
{s1,s4} โ ์๋ก ์ถ๊ฐ
}
subset construction์์ ํญ์ ํด์ผ ํ๋ ์ผ:
- Move ๊ณ์ฐ
- ฮต-closure ์ ์ฉ
- ๊ธฐ์กด ์ํ์ธ์ง ํ์ธ
- ์์ผ๋ฉด ์ถ๊ฐ โ ์ง๊ธ ์ฌ๊ธฐ
๐ 59ํ์ด์ง โ ์ ์ดํ ์ ๋ฐ์ดํธ ํ์
ํ์ฌ ฮด ์ ์ดํ
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
{s1} |
{s1,s3} |
{s1,s2} |
{s1,s4} |
{s1,s4} |
ย | ย |
{s1,s3} โbโ> {s1,s4} ๋ฐ์ ์๋ฃ.
์ด์ ๋จ์ ๋ฏธ์ฒ๋ฆฌ ์ํ: {s1,s4} ํ๋๋ฟ โ ์๊ณ ๋ฆฌ์ฆ ๊ฑฐ์ ๋
๐ 60ํ์ด์ง โ ๋ง์ง๋ง ์ํ {s1,s4} ์ฒ๋ฆฌ
T = { s1, s4 } is the last unmarked state.
{s1,s4}๋ ๋ง์ง๋ง ๋ฏธ์ฒ๋ฆฌ ์ํ์ด๋ค.
โReading an a takes us to {s1, s2}. Reading a b takes us to {s1}. Those two transitions are added to ฮด.โ
ฮฑ = a ๊ณ์ฐ
Move({s1,s4}, a):
s1์์ a โ s1, s2
s4์์ a โ ์ด๋ ์์
๊ฒฐ๊ณผ: {s1, s2}
โ ฮด({s1,s4}, a) = {s1,s2}
ฮฑ = b ๊ณ์ฐ
Move({s1,s4}, b):
s1์์ b โ s1
s4์์ b โ ์ด๋ ์์
๊ฒฐ๊ณผ: {s1}
โ ฮด({s1,s4}, b) = {s1}
์๋ฏธ ์ค๋ช
{s1,s4}๋ accept ์ํ๋ฅผ ํฌํจํ์ง๋ง, ์
๋ ฅ์ ๋ ์ฝ์ผ๋ฉด ๋ค์ ๋นaccept ์ํ๋ก ๊ฐ ์๋ ์๋ค. ์ด๊ฒ ์์ฐ์ค๋ฌ์ด ์ด์ :
DFA์ accept ์ฌ๋ถ๋ โํ์ฌ๊น์ง ์ฝ์ ๋ฌธ์์ด์ด accept๋๋๊ฐโ๋ฅผ ๋ปํ์ง,
โ์ฌ๊ธฐ์๋ถํฐ ์์ํ accept ์ํ์ ๊ณ ์ ๋๋คโ๋ ๋ป์ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ accepting state๋ ๋ค๋ฅธ ์ ๋ ฅ์ ๋ฐ์ผ๋ฉด ๋ค๋ฅธ ์ํ๋ก ์ ์ดํ ์ ์๋ค.
๐ 61ํ์ด์ง โ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฃ
No more unmarked states in Dstates. The algorithm stops.
Dstates ์์ ๋ ์ด์ ๋ฏธ์ฒ๋ฆฌ ์ํ๊ฐ ์๋ค. ์๊ณ ๋ฆฌ์ฆ์ด ์ข ๋ฃ๋๋ค.
์ต์ข DFA ์ํ ์งํฉ
{s0,s1}
{s1,s2}
{s1}
{s1,s3}
{s1,s4}
๊ฐ ์ํ์ ๋ํด ์ ๋ ฅ a, b ์ ์ด๊ฐ ๋ชจ๋ ์ฑ์์ก๋ค โ subset construction ์์ ํ ๋
๐ 62ํ์ด์ง โ ์ต์ข DFA ์์ฑ โญ
The DFA for the above transition function ฮด
โAll DFA states that contain an accepting NFA state become accepting states in the DFA!โ
accepting NFA state๋ฅผ ํฌํจํ๋ ๋ชจ๋ DFA ์ํ๋ DFA์์๋ accepting state๊ฐ ๋๋ค.
์ต์ข ์ ์ดํ (์์ฑ๋ณธ)
| ์ํ | a | b |
|---|---|---|
{s0,s1} |
{s1,s2} |
{s1} |
{s1,s2} |
{s1,s2} |
{s1,s3} |
{s1} |
{s1,s2} |
{s1} |
{s1,s3} |
{s1,s2} |
{s1,s4} |
{s1,s4} |
{s1,s2} |
{s1} |
Accepting state ํ์
NFA์ accepting state = s4
๋ฐ๋ผ์ s4๋ฅผ ํฌํจํ๋ DFA ์ํ๋ง accepting:
| DFA ์ํ | accepting ์ฌ๋ถ |
|---|---|
{s0,s1} |
โ |
{s1,s2} |
โ |
{s1} |
โ |
{s1,s3} |
โ |
{s1,s4} |
โ accepting |
๐ผ ์ต์ข DFA ๊ทธ๋ฆผ (์ํ ์ด๋ฆ ๋จ์ํ)
์ฌ๋ผ์ด๋์๋ ์งํฉ ์ด๋ฆ์ ์ค์ฌ์ ๊ทธ๋ฆฐ๋ค:
| ์งํฉ ์ํ | ๋จ์ ์ด๋ฆ |
|---|---|
{s0,s1} |
S0 |
{s1} |
S1 |
{s1,s2} |
S1S2 |
{s1,s3} |
S1S3 |
{s1,s4} |
S1S4 |
์ฃผ์ ํ์ดํ:
S0 --a--> S1S2
S0 --b--> S1
S1S2 --a--> S1S2 (self-loop)
S1S2 --b--> S1S3
S1 --a--> S1S2
S1 --b--> S1 (self-loop)
S1S3 --a--> S1S2
S1S3 --b--> S1S4
S1S4 --a--> S1S2
S1S4 --b--> S1
์ด ๊ทธ๋ฆผ์ ์์์ ์์ญ ํ์ด์ง ๋์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ฅ์ผ๋ก ์์ถํ ์ต์ข DFA ์์ฑ๋ณธ์ด๋ค.
๐ 63ํ์ด์ง โ Extra: Executing JLex
Extra: Executing JLex
์ถ๊ฐ: JLex ์คํํ๊ธฐ
Note: this is not in the range of midterm / final exam. Just for practice.
์ฃผ์: ์ด๊ฒ์ ์ค๊ฐ/๊ธฐ๋ง ์ํ ๋ฒ์๊ฐ ์๋๋ค. ์ฐ์ต์ฉ์ผ ๋ฟ์ด๋ค.
์ด ํ์ด์ง ์ดํ๋ JLex๋ฅผ ์ค์ ๋ก ์คํํด ๋ณด๋ ๋ฐฉ๋ฒ ์๊ฐ ํํธ๋ค.
๐ 64ํ์ด์ง โ JLex ์คํ ํ๊ฒฝ ์ค๋น
Running JLex on a Sample Scanner Spec
์ํ scanner ๋ช ์ธ์ ๋ํด JLex ์คํํ๊ธฐ
์ค๋น ๋จ๊ณ
| ๋จ๊ณ | ๋ด์ฉ |
|---|---|
| 1 | LMS์์ jlex_examples.zip ๋ค์ด๋ก๋ ๋ฐ ์์ถ ํด์ |
| 2 | JLex ๋ค์ด๋ก๋ โ Source Code ๋ฐ๊ธฐ |
| 3 | JLex์ Main.java๋ฅผ jlex_examples์ JLex ํด๋ ์์ ๋ฃ๊ธฐ |
| 4 | User Manual ๋ฌธ์ ์ฐธ๊ณ ๊ฐ๋ฅ |
| 5 | JDK ํ์ |
์์ง scanner๋ฅผ ๋๋ฆฌ๋ ๋จ๊ณ๊ฐ ์๋๋ผ ์ฌ์ ์ธํ ๋จ๊ณ๋ค.
๐ 65ํ์ด์ง โ JLex ์ปดํ์ผ ๋ฐ ์คํ
Running JLex on a Sample Scanner Spec
JLex ์ปดํ์ผ
# JLex ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ ํ
javac Main.java
Scanner.l์์ scanner ์ฝ๋ ์์ฑ
# JLex์ ์์ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ ํ
java JLex.Main Scanner.l
- Scanner.l: JLex์ ๋๊ธฐ๋ scanner ๋ช ์ธ ํ์ผ
- ์ด ๋ช ๋ น์ด ์คํ๋๋ฉด JLex๊ฐ ์ด๋ก ์์๋๋ก ์ฒ๋ฆฌํ๋ค:
user code ์ฒ๋ฆฌ
declarations ์ฒ๋ฆฌ
lexical rules ์ฒ๋ฆฌ
NFA ์์ฑ
DFA transition table ์์ฑ
minimization
lexical analyzer code ์ถ๋ ฅ
์ฆ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ์ด๋ก ์์ ๊ทธ๋๋ก ์ฝ์์ ๋ํ๋๋ค:
spec โ NFA โ DFA โ minimization โ code output
๐ 66ํ์ด์ง โ Scanner ์ปดํ์ผ ๋ฐ ํ ์คํธ
Scanner ์ปดํ์ผ ๋ฐ ์คํ
handler์ ํจ๊ป ์ปดํ์ผ
javac Scanner.l.java Test.java
- Test.java: handler ํ์ผ
- ์ด ๋ช
๋ น์ผ๋ก
input.txt๋ฅผ ์ค์บํ ์ค๋น๊ฐ ๋๋ค.
scanner ์คํ
java Test
์ค์ ์ถ๋ ฅ ์์
Token(IF, "if", 0)
Token(ID, "spelling", 3)
Token(LESS, "<", 6)
Token(LESS_EQ, "<=", 17)
JLex spec์์ ์ ์ํ๋ ๊ท์น๋ค์ด ์ค์ ์ ๋ ฅ ํ์ผ์ ์ ์ฉ๋์ด, ๋ฌธ์์ด์ด ํ ํฐ์ผ๋ก ๋ถ๋ฅ๋ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ค.
์ด ์ฅ๋ฉด์ โ์ ๊ทํํ์ ๋ช ์ธ โ scanner ์์ฑ โ ์ ๋ ฅ ์ค์บ โ token ์ถ๋ ฅโ์ด ์ค์ ๋ก ๋์ํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ต์ข ์ค์ต ์์๋ค.
Scanner2.l๋ ํ์ธํด ๋ณผ ์ ์๋ค.
๐ฅ 56~66ํ์ด์ง ์ ์ฒด ํต์ฌ ์์ฝ
1. Subset Construction ์ต์ข ๋ง๋ฌด๋ฆฌ
๋ง์ง๋ง ๋ฏธ์ฒ๋ฆฌ ์ํ {s1,s4}๊น์ง ์ฒ๋ฆฌํ๋ฉด ๋ ์ด์ ์ ์ํ๊ฐ ์๊ธฐ์ง ์๊ณ ์๊ณ ๋ฆฌ์ฆ์ด ๋๋๋ค. ์ต์ข
DFA ์ ์ดํ์ DFA ๊ทธ๋ฆผ์ด 62ํ์ด์ง์ ์ ๋ฆฌ๋๋ค.
2. Accepting State ํ์ ๊ท์น (โญ ์ํ ํต์ฌ)
DFA ์ํ ์์ accepting NFA state๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๊ทธ DFA ์ํ๋ accepting์ด๋ค.
์ด ์์์๋ {s1,s4}๊ฐ accepting state๋ค.
3. 63ํ์ด์ง ์ดํ๋ ์ค์ต ํํธ
JLex ์ค์น, ์ปดํ์ผ, ์คํ, ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ตฌ๊ฐ์ด๋ฉฐ, ์ฌ๋ผ์ด๋์ ๋ช ์์ ์ผ๋ก ์ํ๋ฒ์๊ฐ ์๋๋ผ๊ณ ์ ํ ์๋ค.
๐ฅ ์ ์ฒด ๊ฐ์ ์ํ ํต์ฌ ์ ๋ฆฌ
๊ณ์ฐํ ์ค ์์์ผ ํ๋ ๊ฒ
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
Move(S, a) |
์ํ ์งํฉ S์์ a๋ก ์ด๋ ๊ฐ๋ฅํ ์ํ๋ค์ ํฉ์งํฉ |
ฮต-closure(S) |
ฮต ์ ์ด๋ก ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์ํ ํฌํจ |
| ์ DFA ์ํ ์์ฑ | ๊ฒฐ๊ณผ ์ํ๊ฐ Dstates์ ์์ผ๋ฉด ์ถ๊ฐ |
| Accepting DFA state ํ์ | ์งํฉ ์์ NFA accepting state ํฌํจ ์ฌ๋ถ ํ์ธ |
์ํ ๋ฒ์ ์ ๋ฆฌ
| ๋ฒ์ | ๋ด์ฉ |
|---|---|
| โ ์ํ ๋ฒ์ | RE โ NFA, NFA โ DFA (subset construction), DFA ์ต์ํ, scanner generator ์ด๋ก |
| โ ์ํ ๋ฒ์ ์๋ | JLex ์คํ ๋ช ๋ น, ํ์ผ ๋ฐฐ์น, ์ฝ์ ์คํ ์ ์ฐจ (63ํ์ด์ง ์ดํ) |
์ค์๋ ์ ๋ฆฌ
| ๋งค์ฐ ์ค์ | ๋ ์ค์ (์ค์ต์ฉ) |
|---|---|
Move, ฮต-closure ๊ณ์ฐ |
JLex ์คํ ๋ช ๋ น์ด |
| DFA ์ํ ํ์ฅ ๊ณผ์ | ํ์ผ ๊ตฌ์กฐ ๋ฐฐ์น |
| accepting state ํ์ | ์ฝ์ ์ถ๋ ฅ ํด์ |
| subset construction ํ๋ฆ ์ ์ฒด | ย |
Leave a comment