ํฌ์ŠคํŠธ

๐ŸŒš ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด - ์–ดํœ˜ ๋ถ„์„, ๊ตฌ๋ฌธ ๋ถ„์„

๐Ÿ’ซ ์–ธ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์ ‘๊ทผ


  • Compilation
    • ๊ณ ๊ธ‰ ์–ธ์–ด โ†’ ๊ธฐ๊ณ„ ์ฝ”๋“œ ๋ฒˆ์—ญ, by Compiler
    • C, C++, Cobol
  • Pure Interpretation
    • ๊ณ ๊ธ‰ ์–ธ์–ด โ†’ ํ•ด์„ ํ›„ ์‹คํ–‰, by SW Interpreter ํ•ด์„๊ธฐ
    • HTML์— ํฌํ•จ๋œ JS
  • Hybrid Implementation
    • ๊ณ ๊ธ‰ ์–ธ์–ด โ†’ ์ค‘๊ฐ„ ์ฝ”๋“œ โ†’ ํ•ด์„ ํ›„ ์‹คํ–‰
    • Java, Python, .Net
    • Just In Time - JIS ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ

๋ชจ๋‘ ์–ดํœ˜ ๋ถ„์„๊ธฐ, ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ ์‚ฌ์šฉ

Parser - ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋Š” ํ˜•์‹์  ๊ธฐ์ˆ ์— ๊ธฐ๋ฐ˜
BNF ์‚ฌ์šฉ โ†’ ๋ฌธ๋งฅ ์ž์œ  ๋ฌธ๋ฒ•

๋Œ€๋ถ€๋ถ„ ์ปดํŒŒ์ผ๋Ÿฌ, ์–ดํœ˜/๊ตฌ๋ฌธ ๋ถ„์„์„ ๋”ฐ๋กœ ์‹คํ–‰
์–ดํœ˜ ๋ถ„์„ : Lexeme, Token ๋ถ„๋ฆฌ - ์ž‘์€ ๊ทœ๋ชจ์˜ ์–ธ์–ด ๊ตฌ์กฐ ์ฒ˜๋ฆฌ
๊ตฌ๋ฌธ ๋ถ„์„ : ์‹, ๋ฌธ์žฅ, ํ”„๋กœ๊ทธ๋žจ ๋‹จ์œ„ - ํฐ ๊ทœ๋ชจ์˜ ์–ธ์–ด ๊ตฌ์กฐ ์ฒ˜๋ฆฌ

  • ์™œ Why, ์–ดํœ˜/๊ตฌ๋ฌธ ๋ถ„์„ ๋”ฐ๋กœ?
    • ๋‹จ์ˆœ์„ฑ
      • ๋ถ„๋ฆฌ โ†’ ๋ณต์žก์„ฑ ์™„ํ™”
      • ์–ดํœ˜๊ฐ€ ๊ตฌ๋ฌธ๋ณด๋‹ค ๋‹จ์ˆœ
    • ํšจ์œจ์„ฑ
      • ์–ดํœ˜ ๋ถ„์„ ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ, ๋”ฐ๋กœ ์ตœ์ ํ™”
    • ์ด์‹์„ฑ
      • ์–ดํœ˜ ๋ถ„์„๊ธฐ : ํ”Œ๋žซํผ ์ข…์†, ํŒŒ์ผ Read ๊ณผ์ •์—์„œ ์ž…๋ ฅ ๋ฒ„ํผ ์‚ฌ์šฉ
      • ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ : ํ”Œ๋žซํผ ๋…๋ฆฝ์ผ ์ˆ˜ ์žˆ์Œ

๐Ÿซง Compilation ๊ณผ์ •

  1. C Source File (Temp.c)
    • By C Preprocessor โ†“
  2. ์ „์ฒ˜๋ฆฌ๋œ C Source File (Temp.l)
    • By C Compiler โ†“
  3. Assembly Code File (Temp.S)
    • By Assembler โ†“
  4. Object Code File (Temp.o)
    • By Linker โ†“
  5. Executable Code File (Temp)

๐Ÿซง Compile ๊ณผ์ • (์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€ ๊ณผ์ •), Lex, Yacc

  1. Source Program
  2. Lexical Analyzer
    • ์ฝ”๋“œ ํ•ด์„, Token ๋ถ„ํ•ด
    • Scanner, Tokenizer
    • Source Code โ†’ Tokens, By Lex
  3. Syntax Analyzer
    • Tokens โ†’ Syntax Tree, By Yacc
    • Rule ํ•ญ๋ชฉ(Like BNF)์œผ๋กœ ๋ถ€ํ„ฐ Parser ์ƒ์„ฑ
    • Parser
      • ๊ตฌ๋ฌธ ๋ถ„์„
      • ๊ตฌ๋ฌธ ๊ตฌ์„ฑ ์„ฑ๋ถ„์˜ ์œ„๊ณ„ ๊ด€๊ณ„ ๋ถ„์„ โ†’ ๋ฌธ์žฅ ๊ตฌ์กฐ ๊ฒฐ์ •
  4. Semantic Analyzer
  5. Intermediate Code Generator
  6. Code Optimizer
  7. Code Generator
    • Syntax Tree โ†’ Generated Code

๋ชจ๋“  ๊ณผ์ •์— Symbol-Table Manager๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋„์›€
Error ๋ฐœ์ƒ ์‹œ Error Handler๊ฐ€ ์ฒ˜๋ฆฌ

Lexical Analyzer
์œ ํ•œ ์˜คํ† ๋งˆํƒ€๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋ ต๊ณ  ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— Lex ์ด์šฉ

์‹ค์Šต
Linux (VM), Lex, Yacc, Lex File Format, Python Tokenize Module ~

๐Ÿ’ซ ์–ดํœ˜ ๋ถ„์„


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : ์ฃผ์–ด์ง„ ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ , โ€˜inout state ~โ€™ ์„ ์™„์„ฑํ•˜๊ณ , LLํŒŒ์„œ๋ณด๋‹ค LRํŒŒ์„œ๊ฐ€ ์ข‹์€ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • ์–ดํœ˜ ๋ถ„์„
    • ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด(ํ”„๋กœ๊ทธ๋žจ)์—์„œ ํŠน์ •์˜ ๋ฌธ์ž ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š” ํ–‰์œ„
      • ์–ดํœ˜ ๋ถ„์„๊ธฐ๋Š” ํŒจํ„ด ๋งค์นญ๊ธฐ๋ผ๊ณ  ๋ถˆ๋ฆผ
    • ์–ดํœ˜ ๋ถ„์„์€ ๊ตฌ๋ฌธ ๋ถ„์„์— ์„ ํ–‰ํ•จ
      • ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ดํœ˜ ๋ถ„์„๊ธฐ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ์˜ ์ผ๋ถ€

์–ดํœ˜ (Lexme) : ๋ฌธ์ž๋“ค์„ ๋ชจ์•„์„œ ๊ตฌ์„ฑํ•œ ๋…ผ๋ฆฌ์  ๊ทธ๋ฃน
ํ† ํฐ (Token) : ์–ดํœ˜๋“ค ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•œ ๋ถ€๋ฅ˜(Category)
ํ† ํฐํ™” (Tokenize) : ์–ดํœ˜๋ฅผ ํ† ํฐ์œผ๋กœ ๋ถ„๋ฅ˜

์ดˆ๊ธฐ ์–ดํœ˜ ๋ถ„์„๊ธฐ,
์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ Read โ†’ ํ† ํฐํ™” โ†’ ๊ฒฐ๊ณผ (Lexeme, Token) ํŒŒ์ผ Create

์˜ค๋Š˜๋‚  ์–ดํœ˜ ๋ถ„์„๊ธฐ,
๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ์˜ ๋ถ€ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์จ,
๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๊ฐ€ ์–ดํœ˜ ๋ถ„์„๊ธฐ ํ˜ธ์ถœ โ†’ ํ† ํฐํ™” ๊ฒฐ๊ณผ ๋ฐ›์Œ
โ†’ ํ•œ ๋ฒˆ ํ˜ธ์ถœ์— ํ•˜๋‚˜์˜ ํ† ํฐํ™” ๊ฒฐ๊ณผ ๋ฐ›์Œ

  • ์–ดํœ˜ ๋ถ„์„๊ธฐ ์—ญํ• 
    • ์ฃผ์„ ์ œ๊ฑฐ
    • ์‹ฌ๋ณผ ํ…Œ์ด๋ธ” ๊ตฌ์ถ•
    • ์–ดํœ˜ ์—๋Ÿฌ ํƒ์ง€ ๋ฐ ํ†ต๋ณด
      • i.e. ๋ถ€๋™ ์†Œ์ˆ˜์  ์ž˜๋ชป ์‚ฌ์šฉ ๋“ฑ
  • ์–ดํœ˜ ๋ถ„์„๊ธฐ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•
    • ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•˜์—ฌ ์–ธ์–ด์˜ ํ† ํฐ ํŒจํ„ด์— ๋Œ€ํ•œ ํ˜•์‹์  ๊ธฐ์ˆ ์„ ์ž‘์„ฑ
      • Lex
    • ์–ธ์–ด์˜ ํ† ํฐ ํŒจํ„ด์„ ์ •์˜ํ•˜๋Š” ์ƒํƒœ ์ „์ด๋„ (State transition diagram)์„ ์„ค๊ณ„ํ•˜๊ณ  ์ด๋ฅผ ์ง์ ‘ ๊ตฌํ˜„
    • ์–ธ์–ด์˜ ํ† ํฐ ํŒจํ„ด์„ ์ •์˜ํ•˜๋Š” ์ƒํƒœ ์ „์ด๋„๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ด ์ƒํƒœ๋„์— ๋Œ€ํ•œ ํ…Œ์ด๋ธ”-๊ตฌ๋™ (Table-driven) ๊ตฌํ˜„์„ ์ง์ ‘ ๊ตฌ์„ฑ
  • ์ƒํƒœ ์ „์ด๋„ (์ƒํƒœ๋„, state diagram)
    • ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„(directed graph)
    • ๋…ธ๋“œ๋Š” ์ƒํƒœ ์ด๋ฆ„์„ ๊ทธ ๋ ˆ์ด๋ธ”๋กœ ๊ฐ€์ง€๊ณ , ์•„ํฌ๋Š” ์ƒํƒœ๋“ค ๊ฐ„์˜ ์ „์ด๋ฅผ ์•ผ๊ธฐํ•˜๋Š” ์ž…๋ ฅ ๋ฌธ์ž๋“ค์„ ๋ ˆ์ด๋ธ”๋กœ ๊ฐ€์ง
    • ์œ ํ•œ ์˜คํ† ๋งˆํƒ€(finite automata)๋ผ ๋ถˆ๋ฆฌ๋Š” ์ˆ˜ํ•™์  ๊ธฐ๊ณ„์˜ ํ•œ ์œ ํ˜•
      • ์ •๊ทœ ์–ธ์–ด๋ฅผ ์ธ์‹ํ•˜๊ฒŒ ์„ค๊ณ„
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ† ํฐ๋“ค์€ ์ •๊ทœ ์–ธ์–ด์ด๊ณ , ์–ดํœ˜ ๋ถ„์„๊ธฐ๋Š” ์œ ํ•œ ์˜คํ† ๋งˆํƒ€

  • ์–ดํœ˜ ๋ถ„์„์— ํ•„์š”ํ•œ ์ƒํƒœ ์ „์ด๋„๋Š” ๋งค์šฐ ๋ณต์žกํ•จ

  • ์–ดํœ˜๋ถ„์„๊ธฐ๋Š” ์‹ฌ๋ณผํ…Œ์ด๋ธ”์„ ๊ตฌ์ถ•
    • ์‹ฌ๋ณผํ…Œ์ด๋ธ”: ์ด๋ฆ„(Identifier)๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• 

๐Ÿ’ซ Parse


Parsing
์ฃผ์–ด์ง„ ๊ตฌ๋ฌธ์„ ๋ถ„์„ ํ•˜๋Š” ๊ณผ์ • - Syntax Analysis

Parser
์ฃผ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๋‹ด๋‹น
์ฃผ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ Parse Tree๋ฅผ ๊ตฌ์„ฑ

Parse Tree
๋ฒˆ์—ญ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ

๐Ÿซง ๊ตฌ๋ฌธ ๋ถ„์„์˜ ๋ชฉ์  (Parser ์—ญํ• )

  • ์ž…๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ์ง€๋ฅผ ํŒ๋‹จ
    • ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑ ๋ฐ ๋ณต๊ตฌ
    • ์ตœ๋Œ€ํ•œ ๋งŽ์€ Error ๋ฐœ๊ฒฌ
  • ๊ตฌ๋ฌธ์  ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด์„œ๋Š” ์™„์ „ํ•œ ํŒŒ์Šค ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์ถ•

๐Ÿซง Parser ๋ถ„๋ฅ˜

Top-Down, Bottom-Up Parse

  • Top-Down ํ•˜ํ–ฅ์‹
    • Root Node๋กœ๋ถ€ํ„ฐ Leaf Node๋กœ Parse Tree ์ƒ์„ฑ
    • Leftmost Derivation ์ตœ์ขŒ๋‹จ ์œ ๋„ ๊ฐ™์€ ์ˆœ์„œ
      • ์žฌ๊ท€-ํ•˜ํ–ฅํŒŒ์‹ฑ, LL ํŒŒ์„œ
  • ์žฌ๊ท€-ํ•˜ํ–ฅ ํŒŒ์‹ฑ
    • ์žฌ๊ท€์ ์ธ Subprogram ๋ถ€ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ตฌ์„ฑ
    • ํ•˜์ƒน์‹ ์ˆœ์„œ๋กœ Parse Tree ๊ตฌ์ถ•
    • EBNF ๊ตฌ์ถ•์— ์ ํ•ฉ
    • ๋ฌธ๋ฒ•์˜ ๊ฐ NonTerminal์— ๋Œ€ํ•ด ํ•œ ๊ฐœ์˜ ๋ถ€ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ–๋Š”๋‹ค
      • ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋ถ€ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ•ด๋‹น ๋…ผํ„ฐ๋ฏธ๋„์„ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ๊ฐ€์ง€๋ฉฐ, LeafNode๋“ค์ด ๊ทธ ์ž…๋ ฅ ๋ฌธ์ž์—ด๊ณผ ๋งค์นญ๋˜๋Š” ParseTree๋ฅผ ์ถ”์ 
    • ์ „์—ญ ๋ณ€์ˆ˜ nextToken : ๋‹ค์Œ ๋ฒˆ ํ† ํฐ์„ ์˜๋ฏธ
      • ํŒŒ์‹ฑํ•  ๋•Œ ํ•ญ์ƒ ๋‹ค์Œ ํ† ํฐ์„ ๋ฏธ๋ฆฌ ๋ณธ๋‹ค
  • LL ํŒŒ์„œ
    • L ์™ผ์ชฝ์—์„œ ์‹œ์ž‘ํ•˜๋ฉฐ, L ์ขŒ์ธก ์œ ๋„ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์‹ฑ
    • ์•ฝ์ 
      • Left Recursion ์ขŒ์ˆœํ™˜
        • ์ง์ ‘ ์ขŒ์ˆœํ™˜ : A โ†’ A + B
          • A๊ฐ€ ์ž๊ธฐ ์ž์‹  ํ˜ธ์ถœ, Stack Overflow
        • ๊ฐ„์ ‘ ์ขŒ์ˆœํ™˜ : A โ†’ BaA, B โ†’ Ab
          • ๊ฒฐ๊ตญ A๊ฐ€ ์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐœ์ƒ
        • ์ƒํ–ฅ์‹ ํŒŒ์‹ฑ ์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ์ด๋Ÿฐ ์ผ ์—†์Œ
    • ํ•˜ํ–ฅ์‹ ํŒŒ์„œ๋Š” ์ตœ์ขŒ์ธก ๋…ผํ„ฐ๋ฏธ๋„์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์ฒซ๋ฒˆ์งธ ํ† ํฐ๋งŒ์„ ์‚ฌ์šฉ, ํŒŒ์„œ๊ฐ€ ์ž…๋ ฅ์˜ ๋‹ค์Œ๋ฒˆ์งธ ํ† ํฐ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ RHS๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€๊ฐ€ ํ•˜ํ–ฅ์‹ ํŒŒ์„œ์˜ ๊ตฌ์ถ•์—์„œ ์ค‘์š”
      • Pairwise Disjoint Test ์ง‘ํ•ฉ์Œ ๊ณตํ†ต ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ ๊ฐ€๋Šฅ
  • Pairwise Disjoint Test ์ง‘ํ•ฉ์Œ ๊ณตํ†ต ํ…Œ์ŠคํŠธ
    • ์ฃผ์–ด์ง„ ๋ฌธ๋ฒ•์œผ๋กœ Top-Down Parsing์ด ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ํ…Œ์ŠคํŠธ
    • Top-down parsing์˜ ์ ˆ์ฐจ๋Š” lookahead ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ RHS๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ์ด๋•Œ ์ง‘ํ•ฉ์Œ ๋ถˆ์ผ์น˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ RHS๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†๋‹ค.
  • Bottom-Up ์ƒํ–ฅ์‹
    • Leaf Node๋กœ๋ถ€ํ„ฐ Root Node๋กœ Parse Tree ์ƒ์„ฑ
    • Rightmost Derivation ์ตœ์šฐ๋‹จ ์œ ๋„์˜ ์—ญ์ˆœ
      • ์ด๋™-๊ฐ์ถ• ์•Œ๊ณ ๋ฆฌ๋“ฌ, LR ํŒŒ์„œ
  • ์ƒํ–ฅ์‹ ํŒŒ์„œ์˜ ํŒŒ์‹ฑ ๋ฌธ์ œ
    • ์‹ id+id*id ์— ๋Œ€ํ•œ ์ตœ์šฐ๋‹จ ์œ ๋„
    • ์ƒํ–ฅ์‹ ํŒŒ์‹ฑ์€ ์ตœ์šฐ๋‹จ ์œ ๋„์˜ ์—ญ์ˆœ์œผ๋กœ ์ˆ˜ํ–‰
      • ์ด์ „ ๋‹จ๊ณ„ ๋ฌธ์žฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ƒ์‘ํ•˜๋Š” LHS๋กœ ์žฌ์ž‘์„ฑ๋˜๋Š” RHS
    • ์ƒํ–ฅ์‹ ํŒŒ์„œ์˜ ์—ญํ• 
      • ์ด์ „ ๋ฌธ์žฅ ํ˜•ํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ํŠน์ • ๊ทœ์น™(handle)์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ
  • ์ด๋™-๊ฐ์ถ•(Shift-Reduce) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ชจ๋“  ์ƒํ–ฅ์‹ ํŒŒ์„œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ํ™œ์šฉ๋˜๋ฉฐ ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌ์ถ•
    • ์ƒํ–ฅ์‹ ํŒŒ์„œ์˜ ์ž…๋ ฅ์€ ํ† ํฐ ์ŠคํŠธ๋ฆผ์ด๋ฉฐ ์ถœ๋ ฅ์€ ๋ฐœ๊ฒฌ๋œ ๋ฌธ๋ฒ• ๊ทœ์น™
    • ๋™์ž‘
      • ์ด๋™(Shift) - ๋‹ค์Œ๋ฒˆ์งธย ์ž…๋ ฅ ํ† ํฐ์„ ์Šคํƒ์œผ๋กœ ์ด๋™
      • ๊ฐ์ถ•(Reduce) - ์Šคํƒ์˜ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ RHS๋ฅผย ์ƒ์‘ํ•˜๋Š”ย LHS๋กœ ๋ณ€๊ฒฝ

@ ~ ํ‘ธ์‹œ๋‹ค์šด (์•„๋ž˜์—์„œ ํ™•์ธ)

  • LR ํŒŒ์„œ
    • ์ขŒ์ธก(L)์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์šฐ์ธก(R)์œ ๋„ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์‹ฑ
    • ์žฅ์ 
      • ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ํŒŒ์„œ์ฝ”๋“œ์™€ ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑ
      • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ˆœ์„œ๋กœ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์กฐ๊ธฐ์— ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • LL ํŒŒ์„œ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋ฉด, LR ํŒŒ์„œ๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
        • @ LL ๋‹จ์  (Left Recursion, Stack Overflow) ์—†์Œ
        • @ LL ์ƒ์œ„ ํ˜ธํ™˜์ธ๋ฐ ์ฝ”๋“œ๋„ ์ž‘์Œ
    • ๋‹จ์ 
      • ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”์„ ์ˆ˜์ž‘์—…์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.
        • Yacc, ๋ฌธ๋ฒ•์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ํŒŒ์‹ฑํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
        • @ LL ์ƒ์œ„ ํ˜ธํ™˜์ธ๋ฐ ๋‹จ์ ๋„ ๊ทน๋ณต ๊ฐ€๋Šฅ
  • LR ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”
    • Action๊ณผ Goto๋กœ ๊ตฌ์„ฑ
    • Action
      • ํŒŒ์„œ์˜ ํ–‰๋™์„ ๊ธฐ์ˆ ํ•˜๊ณ  ์žˆ์Œ
      • ํ–‰์€ ์ƒํƒœ๊ธฐํ˜ธ๋ฅผ ์—ด์„ ํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ง
      • ํŒŒ์„œ์˜ ๊ผญ๋Œ€๊ธฐ์— ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ค์Œ๋ฒˆ ์ž…๋ ฅ ํ„ฐ๋ฏธ๋„์„ ๋ณด๊ณ ์„œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ํŒ๋‹จ
        • ์ด๋™(Shift): ๋‹ค์Œ๋ฒˆ์งธ ์ž…๋ ฅ์„ ์Šคํƒ์œผ๋กœ ์ด๋™
        • ๊ฐ์ถ•(Reduce): ์Šคํƒ ๊ผญ๋Œ€๊ธฐ์˜ ์ƒํƒœ๋ฅผ LHS๋กœ ๊ฐ์ถ•
        • Accept: ํŒŒ์‹ฑ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ
        • ์˜ค๋ฅ˜: ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฃจํ‹ด์„ ํ˜ธ์ถœ
    • Goto
      • ํ–‰์€ ์ƒํƒœ๊ธฐํ˜ธ๋ฅผ ์—ด์€ ๋…ผํ„ฐ๋ฏธ๋„ ๊ธฐํ˜ธ๋ฅผ ๊ฐ€์ง
      • ๊ฐ์ถ•์ด ๋˜๊ณ ๋‚œ ํ›„ (ํ•ธ๋“ค์ด ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๊ณ  ์ƒˆ๋กœ์šด ๋…ผํ„ฐ๋ฏธ๋„์ด ์Šคํƒ์— ์ €์žฅ ๋จ์„ ์˜๋ฏธ) ์–ด๋–ค ์ƒํƒœ ๊ธฐํ˜ธ๊ฐ€ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • ํ‘ธ์‹œ๋‹ค์šด(Pushdown) ์˜คํ† ๋งˆํƒ€ (Context-Free ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ์ธ์‹๊ธฐ)
    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ชจ๋“  ํŒŒ์„œ๋Š” ํ‘ธ์‹œ๋‹ค์šด ์˜คํ† ๋งˆํƒ€
    • ์žฌ๊ท€-ํ•˜๊ฐ•, ์ด๋™-๊ฐ์ถ• ํŒŒ์„œ๋„ ํ‘ธ์‹œ๋‹ค์šด ์˜คํ† ๋งˆํƒ€์— ํ•ด๋‹น

๐Ÿซง Parse Algorithm ๋ณต์žก๋„

์ž„์˜์˜ ๋ชจํ˜ธํ•˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ํŒŒ์‹ฑ์€ O(n^3)
๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์—…์  ํŒŒ์„œ์˜ ๋ณต์žก๋„ O(n)์œผ๋กœ ์ค„์ž„


Program๊ณผ Process

Program : Code(Text), Data
Process : Code(Text), Data + Stack, Heap

๋ฉ”๋ชจ๋ฆฌ์— ํ”„๋กœ๊ทธ๋žจ ๊ทธ๋Œ€๋กœ ์˜ฌ๋ผ๊ฐ€๊ณ ,
๋ฉ”๋ชจ๋ฆฌ์— ๋™์ ์œผ๋กœ Stack๊ณผ Heap ํ• ๋‹น

Code(Text) : ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ
Data : External, Static, ์ „์—ญ๋ณ€์ˆ˜
Stack : ๋งค๊ฐœ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์œ„์น˜ (๋Œ์•„๊ฐˆ ๊ณณ), ์ง€์—ญ๋ณ€์ˆ˜
Heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, new ๋“ฑ

4๊ธฐ๊ฐ€ ๊ฐ€์ƒ๊ณต๊ฐ„ (32bit Linux ๊ธฐ์ค€)
1๊ธฐ๊ฐ€ OS/์ปค๋„ ์˜์—ญ + 3๊ธฐ๊ฐ€ ์œ ์ € ์˜์—ญ(ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ณณ)

๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ๊ฐ€ 3๊ธฐ๊ฐ€ ์œ ์ € ์˜์—ญ์— ํ˜ผ์ž ์กด์žฌํ•˜๋Š” ์ค„ ์•Ž
๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋Š” OS/์ปค๋„ ์˜์—ญ์—์„œ ์œ ์ € ์˜์—ญ์— ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์œ„์นญ ํ•˜๋Š” ๊ฒƒ

Data
Symbol Table์—์„œ ๊ตฌ๋ถ„ํ•œ ์ „์—ญ๋ณ€์ˆ˜, Static ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ
๋ณ€์ˆ˜ ์„ ์–ธ โ†’ Symbol Table์—์„œ ๊ตฌ๋ถ„ โ†’ Data ์˜์—ญ์— ์ €์žฅ
์ด ๋•Œ ๋ณ€์ˆ˜ ์ด๋ฆ„ I.E. x ๋Š” ์‚ฌ๋ผ์ง€๊ณ , ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋Œ€์‹ ํ•จ

Stack
โ†’ ์Šคํƒ(์‹œ์Šคํ…œ) ์œ„-์•„๋ž˜, ์Šคํƒ(์ž๋ฃŒ๊ตฌ์กฐ) ์•„๋ž˜-์œ„
โ†’ Main ํ•จ์ˆ˜๋ถ€ํ„ฐ ์Œ“๊ธฐ ์‹œ์ž‘

Stack์— ๋ฐ์ดํ„ฐ ์Œ“๋‹ค๊ฐ€

BRK ๋„˜์–ด๊ฐ€๋ฉด
Segmentation Fault Error


๐Ÿซง ์ปดํŒŒ์ผ๊ณผ ์‹คํ–‰ ๋‹จ๊ณ„

@ ์–ธ์–ด ๋””์ž์ธ ๋‹จ๊ณ„
@ ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌํ˜„ ๋‹จ๊ณ„

  • Editor or IDE (Edit Time) : 1. Write Source Codes
    • Source codes (.c), Headers (.h)
  • Preprocessor (Build) : 2. Preprocess
    • Included files, replaced symbols
  • Compiler (Compile Time)(Build) : 3. Compile
    • Object codes (.obj, .o)
  • Linker (Link Time)(Build) : 4. Link Edit
    • By Static Libraries (.lib, .a) โ†’ Excutable Code (.exe)
  • Loader (Load Time)(Run) : 5. Load
    • By Shared Libraries (.dll, .so)
  • CPU (Run Time)(Run) : Execute
    • By Input โ†’ Output

Linker ์ „ : Static ์ •์ , ํ”„๋กœ๊ทธ๋žจ
Linker ํ›„ : !์ •์ , ํ”„๋กœ์„ธ์„œ

Preprocess
gcc -E -P main.c

Compile
gcc -S main.c
gcc -c main.c

Link
gcc main.o -o main

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.