ํฌ์ŠคํŠธ

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

@ ๊ตฌ๋ฌธ๋ก ๊ณผ ์˜๋ฏธ๋ก 

๐Ÿ’ซ Syntax, Semantics


Syntax ๊ตฌ๋ฌธ๋ก  (ํ˜•ํƒœ, ๋ชจ์–‘, ๋ฌธ๋ฒ•)
โ†’ The Form of expressions, statements, and program units

Semantic ์˜๋ฏธ๋ก 
โ†’ The Meaning of expressions, statements, and program units

i.e. while (bool) statement
โ†’ ์œ„ ๋ช…๋ น์–ด์˜ ๋ฌธ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ์˜๋ฏธ

๐Ÿ’ซ ์–ธ์–ด ๊ธฐ์ˆ ์˜ ๋ฌธ์ œ์  - Programming Language Description


ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๊ฐ„๋ช…ํ•˜๊ฒŒ/์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜์ ์ด์ง€๋งŒ, ์–ด๋ ต๋‹ค.

์™œ Why, ์–ธ์–ด ๊ธฐ์ˆ  ๋…์ž๊ฐ€ ๋‹ค์–‘ํ•จ

  • ์ดˆ๊ธฐ ํ‰๊ฐ€์ž : ์–ธ์–ด ๊ธฐ์ˆ ์˜ ๋ช…๋ฃŒ์„ฑ ์ค‘์š”
  • ๊ตฌํ˜„์ž : ์–ธ์–ด ๊ธฐ์ˆ ์˜ ์™„์ „์„ฑ๊ณผ ์ •ํ™•์„ฑ ์ค‘์š”
  • ์‚ฌ์šฉ์ž : ์–ธ์–ด ์ฐธ๊ณ  ๋ฉ”๋‰ด์–ผ์˜ ์ œ๊ณต

๐Ÿซง Syntax์™€ Semantics๋Š” ์„œ๋กœ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ

์–ธ์–ด ์„ค๊ณ„๊ฐ€ ์ž˜๋˜์—ˆ๋‹ค๋ฉด,
๋ฌธ์žฅ์˜ ๋ฌธ๋ฒ•(Syntax)์—์„œ ์˜๋ฏธ(Semantics)๊ฐ€ ๊ณง๋ฐ”๋กœ ๋ณด์—ฌ์•ผ

๐Ÿซง Syntax๋ฅผย ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์ด Semantics๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ๋‹ค

@ ์ •์„ : ๋ช…ํ™•ํ•˜๊ณ  ๊ณตํ†ต์ ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ๊ธฐ์ˆ  ์–‘์‹(๋ฐฉ๋ฒ•)

์–ธ์–ด์˜ Syntax : ์ •์„์ด ์žˆ์Œ
์–ธ์–ด์˜ย Semantics : ์ •์„์ด ์—†์Œ

๐Ÿ’ซ Syntax ์ •์˜์˜ ๋ฌธ์ œ์  (ํ•ด๊ฒฐ ๊ณผ์ œ)


@ ์ปดํŒŒ์ผ๋Ÿฌ ๋งŒ๋“ค ๋•Œ, Lex (Lexeme ๊ตฌ๋ถ„ํ•ด์ฃผ๋Š”) & Yacc (Parser)

๐Ÿซง Lexeme, Token

  • Lexeme - ์–ดํœ˜ ํ•ญ๋ชฉ
    • (ํ˜•์‹์  ๋ฌธ๋ฒ•์œผ๋กœ) ์ฝ”๋“œ ์ตœ์†Œ ๊ตฌ๋ถ„ ๋‹จ์œ„ (Syntax ๊ธฐ์ค€)
    • ์–ธ์–ด์˜ ํ˜•์‹์ (Formal) ๊ธฐ์ˆ (Description)์—์„œ Lexeme์€ ํฌํ•จ๋˜์ง€ ์•Š์Œ
      • โ†’ ์–ธ์–ด์˜ Syntax (ํ˜น์€ Grammar)์˜ ๊ธฐ์ˆ ์— ํฌํ•จ๋˜์ง€ ์•Š์Œ
  • Token
    • ์˜๋ฏธ์ ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์ตœ์†Œ ๋‹จ์œ„
    • ์–ดํœ˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํ•œ ๋ถ€๋ฅ˜
      • i.e. C, 6๊ฐœ์˜ ํ† ํฐ (Identifier, Keyword, Constant, String literal, Operator, Separator)

์–ดํœ˜ ํ•ญ๋ชฉ โ†’ ๊ทธ๋ฃน๋“ค โ†’ ๋Œ€ํ‘œ(๋ถ„๋ฅ˜) by ํ† ํฐ

i.e. x + y = 10 Lexeme - Token
x, y - Identifier
+ - Addition Operator
= - Equal Sign
10 - Int Literal

@ Parse ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ, ์•ˆ ๋งŒ๋“ค์–ด์ง€๋ฉด ๋ฌธ๋ฒ• ์˜ค๋ฅ˜

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ •์˜ ๋ฐฉ๋ฒ• โ†’ ์–ธ์–ด ์ธ์‹๊ธฐ, ์–ธ์–ด ์ƒ์„ฑ๊ธฐ

์–ธ์–ด ์ธ์‹๊ธฐ โ†’ ์ •์˜๋œ ๋ฌธ๋ฒ•์œผ๋กœ๋ถ€ํ„ฐ ์–ธ์–ด L์„ ์ •์˜ํ•˜๊ณ  โ†’ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด L์— ํฌํ•จ๋˜๋Š”์ง€ ํŒ๋‹จ โ†’ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์–ดํœ˜ ๋ถ„์„๊ธฐ(Lexical Analyzer)์™€ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ(parser)์—์„œ ์‚ฌ์šฉ

์–ธ์–ด ์ƒ์„ฑ๊ธฐ
โ†’ ์ •์˜๋œ ๋ฌธ๋ฒ•์œผ๋กœ๋ถ€ํ„ฐ ์–ธ์–ด L์„ ์ƒ์„ฑํ•˜๋Š” ์žฅ์น˜

๐Ÿ’ซ ๊ตฌ๋ฌธ ๊ธฐ์ˆ ์˜ ํ˜•์‹์  ๋ฐฉ๋ฒ•


@ Syntax Description, Formal

Grammar : ๊ตฌ๋ฌธ ๊ธฐ์ˆ ์˜ ํ˜•์‹์  ์–ธ์–ด ์ƒ์„ฑ ๋งค์ปค๋‹ˆ์ฆ˜

Chomsky Hierarchy
Type-0, Unrestricted Grammar
Type-1, Context Sensitive Grammar
Type-2, Context Free Grammar
Type-3, Regular Grammar

๐Ÿซง ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋ฌธ๋งฅ ์ž์œ  ๋ฌธ๋ฒ• Context-Free

  • ํ† ํฐ๋“ค์˜ ํ˜•ํƒœ๋Š” ์ •๊ทœ๋ฌธ๋ฒ•์œผ๋กœ ๊ธฐ์ˆ  ๊ฐ€๋Šฅ Regular Grammar
    • by Lex(Lexeme Analyzer Program)
  • Syntax๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ๋งŒ ์ œ์™ธํ•˜๋ฉด Context-Free ๋ฌธ๋ฒ•์œผ๋กœ ๊ธฐ์ˆ  ๊ฐ€๋Šฅ

@ Meta Language - ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ์–ธ์–ด

  • BNF, Backus-Nour Form ํ˜•์‹
    • ๋ฉ”ํƒ€ ์–ธ์–ด, ๊ตฌ๋ฌธ ๊ตฌ์กฐ ์ถ”์ƒํ™”
    • Context-Free ๋ฌธ๋ฒ•๊ณผ ๊ฑฐ์˜ ๋™์ผ
    • Bakus : John Bakus, ALGOL 58 ๊ธฐ์ˆ 
    • Nour : Peter Naur, ALGOL 60 ๊ธฐ์ˆ  ์œ„ํ•ด ์ˆ˜์ •

@ LHS - Left Hand Side
@ RHS - Right Hand Side

i.e. <assign> โ†’ <var> = <expression>

  • Rule ๊ทœ์น™, Production ์ƒ์„ฑ
    • LHS โ†’ RHS, ์—ฐ๊ฒฐ(์œ ๋„) ํ•˜๋Š” ๊ฒƒ
    • LHS : ์ •์˜ํ•˜๋ ค๋Š” ์ถ”์ƒํ™”
    • RHS : ์ •์˜ - Token, ์–ดํœ˜ํ•ญ๋ชฉ, ๋‹ค๋ฅธ ์ถ”์ƒํ™”

@ Terminal ๋๋‚œ, ๋ณ€ํ•˜์ง€ ์•Š๋Š”

Nonterminal Symbol : ์ถ”์ƒํ™”๋œ ๋Œ€์ƒ, ์—ฌ๋Ÿฌ ์ •์˜ ๊ฐ€๋Šฅ
Terminal Symbol : ๊ทœ์น™์— ํฌํ•จ๋œ ์–ดํœ˜ ํ•ญ๋ชฉ๊ณผ ํ† ํฐ

i.e.
<if_stmt> โ†’
if (<logic_expr>) <stmt> | if (<logic_expr>) <stmt> else <stmt>

๊ฐ€๋ณ€ ๊ธธ์ด์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ (BNF์—์„œ๋Š”) Recursive ์žฌ๊ท€ ์‚ฌ์šฉ
i.e. <ident_list> โ†’ identifier | identifier,

๐Ÿ’ซ ๋ฌธ๋ฒ•๊ณผ ์œ ๋„


@ U ์ค‘๊ฐ„๊ณ ์‚ฌ ์ถœ์ œ : ๋ฌธ๋ฒ•์ด ๋ชจํ˜ธํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€, ์ฃผ์–ด์ง„ ๋ฌธ๋ฒ•๊ณผ ๋ฌธ์žฅ์„ ๊ฐ€์ง€๊ณ  ์„ค๋ช…ํ•˜์‹œ์˜ค.

๋ฌธ๋ฒ• : ์–ธ์–ด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์„ฑ ์žฅ์น˜

  • ์œ ๋„(๋Œ€์ฒด) Derivation
    • ๋ฌธ์žฅ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ จ์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ
  • ์‹œ์ž‘๊ธฐํ˜ธ Start Symbol
    • ์ตœ์ดˆ์˜ ์‹œ์ž‘์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ • ๋…ผํ„ฐ๋ฏธ๋„
    • ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ„, ์ผ๋ฐ˜์ ์œผ๋กœ <program>

์‹œ์ž‘ ๊ธฐํ˜ธ๋ถ€ํ„ฐ ์ •์˜๋œ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์žฅ ์œ ๋„
Loop Until ์–ด๋– ํ•œ ๋…ผํ„ฐ๋ฏธ๋„๋„ ํฌํ•จํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€

i.e.

์ฃผ์–ด์ง„ ๋ฐฐ์ •๋ฌธ : begin A = B + C; B = C end

<program> โ†’ begin <stmt_list> end
<stmt_list> โ†’ <stmt> | <stmt> ; <stmt_list>
<stmt> โ†’ <var> = <expression>
<var> โ†’ A | B | C
<expression> โ†’ <var> + <var>, <var> | <var> | <var>

์ฃผ์–ด์ง„ ๋ฐฐ์ •๋ฌธ : begin A = B * A + C end

<assign> โ†’ <id> = <expr>
<id> โ†’ A | B | C
<expr> โ†’ <id> + <expr> | <id> * <expr> | (<expr>) | <id>

์ตœ์ขŒ๋‹จ ์œ ๋„ - Leftmost Derivation
โ†’ ์™ผ์ชฝ ๋…ผํ„ฐ๋ฏธ๋„๋ถ€ํ„ฐ ์œ ๋„(๋Œ€์ฒด)

Parse Tree
โ†’ Subtree๋Š” ๋ฌธ์žฅ์— ํฌํ•จ๋œ ์ถ”์ƒํ™”์˜ ์‚ฌ๋ก€

๋ฌธ๋ฒ•์˜ ๋ชจํ˜ธ์„ฑ
โ†’ ๋ฌธ์žฅ์˜ Parse Tree ์ˆ˜ > 1 (์–ด๋–ค ์œ ๋„๋“  ๊ฐ„์—)

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋กœ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
๋ฌธ์žฅ์ด ์—ฌ๋Ÿฌ ํŒŒ์Šค ํŠธ๋ฆฌ๋กœ ๊ตฌ์ถ•๋˜๋ฉด ์˜๋ฏธ๋ฅผ ๊ฒฐ์ • ๋ถˆ๊ฐ€๋Šฅ

  • ํ•ด๊ฒฐ์ฑ…
    • ํŒŒ์„œ ์„ค๊ณ„์ž๊ฐ€ ๋น„๋ฌธ๋ฒ•์  ์˜ฌ๋ฐ”๋ฅธ ํŒŒ์Šค ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑ
    • ์žฌ์ž‘์„ฑ
    • ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ : ๋‚ฎ์€ ๊ณณ์— ์œ„์น˜ํ•œ ํ•ญ๋ชฉ๋“ค๋กœ ๋จผ์ € ๊ณ„์‚ฐ
    • ์—ฐ์‚ฐ์˜ ๊ฒฐํ•ฉ ๊ทœ์น™ :
      • ๋™์ผ ์šฐ์„  ์ˆœ์œ„ ์—ฐ์‚ฐ์ž๋“ค ์ค‘ ์–ด๋–ค ์—ฐ์‚ฐ์ž๊ฐ€ ๋จผ์ € ๊ณ„์‚ฐ๋˜๋Š”์ง€
      • i.e. A + B - C, ์ขŒ๊ฒฐํ•ฉ ์šฐ์„  โ†’ +

์ขŒ๊ฒฐํ•ฉ ๊ทœ์น™
์ขŒ์ˆœํ™˜์  ํ‘œํ˜„์€ ์ขŒ๊ฒฐํ•ฉ ๊ทœ์น™์„ ๊ธฐ์ˆ ํ•œ๋‹ค
LHS๊ฐ€ RHS ์‹œ์ž‘ ์œ„์น˜์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ
์ค‘์š”ํ•œ ๊ตฌ๋ฌธ๋ถ„์„ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ ์ขŒ์ˆœํ™˜ ์ œ๊ฑฐํ•˜๋˜์ง€, ๋น„๋ฌธ๋ฒ•์  ์š”์†Œ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง€์›

์šฐ๊ฒฐํ•ฉ ๊ทœ์น™ ์šฐ์ˆœํ™˜์  ํ‘œํ˜„์€ ์šฐ๊ฒฐํ•ฉ ๊ทœ์น™์„ ๊ธฐ์ˆ ํ•œ๋‹ค
LHS๊ฐ€ RHS์˜ ์˜ค๋ฅธ์ชฝ ๋์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ

<factor>โ†’ <exp> ** <factor> | <exp>
<exp> โ†’ (<expr>) | id

  • is then else๋ฅผ ์œ„ํ•œ ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•
    • Dangling Else

i.e. Ada BNF ๊ทœ์น™
<if_stmt> โ†’
if (<logic_expr>) <stmt> | if (<logic_expr>) <stmt> else <stmt>

โ†’ <stmt> โ†’ <if_stmt> ์‹œ ๋ชจํ˜ธ์„ฑ ๋ฐœ์ƒ
if (<logic_expr>) if (<logic_expr>) <stmt> else <stmt>

So, ๋งŽ์€ ์–ธ์–ด์—์„œ, else ๋ฌธ์€ ์ด์ „์— ๋งค์นญ๋˜์ง€ ์•Š์€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด if/then์— ๋งค์นญ
โ†’ ๋ฌธ๋ฒ•์œผ๋กœ๋Š” matched, unmatched๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑ

  • ํ™•์žฅ BNF (EBNF)
    • ์„œ์ˆ  ๋Šฅ๋ ฅ ๊ทธ๋Œ€๋กœ,๊ฐ€๋…์„ฑ๊ณผ ์ž‘์„ฑ๋ ฅ โ†‘
    • ~๊ฐ€ ์ƒ๊ฒผ๋‹ค

ํ™”์‚ดํ‘œ ๋Œ€์‹ ์— ์ฝœ๋ก ์ด ์‚ฌ์šฉ๋˜๊ณ , RHS๋Š” ๋‹ค์Œ ์ค„์— ํ‘œํ˜„ ์ˆ˜์ง๋ฐ”(|)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ RHS๋ฅผย ๊ตฌ๋ณ„ํ•˜๋Š” ๋Œ€์‹ ์—, ๊ฐ RHS๋ฅผ ๋‹จ์ˆœํžˆ ๋ณ„๊ฐœ์˜ ์ค„๋กœ ํ‘œํ˜„ ๋Œ€๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ ํƒ ์‚ฌํ•ญ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€์‹ ์— ์•„๋žซ์ฒจ์žย opt๊ฐ€ ์‚ฌ์šฉ ์†Œ๊ด„ํ˜ธ ์•ˆ์— ํฌํ•จ๋œ ์š”์†Œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ์—์„œ ์„ ํƒ ์‚ฌํ•ญ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด | ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ์— ๋‹จ์–ด โ€œone ofโ€๊ฐ€ ์‚ฌ์šฉ

  • ๋ฌธ๋ฒ•๊ณผ ์ธ์‹๊ธฐ
    • ๋ฌธ๋งฅ ์ž์œ  ๋ฌธ๋ฒ•์ด ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, ํ•ด๋‹น ์–ธ์–ด๋ฅผ ์ธ์‹ํ•˜๋Š” ์ธ์‹๊ธฐ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
      • Yacc : ๊ตฌ๋ฌธ ๋ถ„์„ ์ƒ์„ฑ๊ธฐ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.