¢Ê 14ÀÏ: ¹®¹ý


¢¹ A13. ¹®¹ý (Grammar)
  ¾Æ·¡´Â ÀÌ ºÎ·ÏÀÇ ¾ÕºÎºÐ¿¡ ³ª¿Ô´ø ¹®¹ýÀ» ¿ä¾àÇÑ °ÍÀÔ´Ï´Ù. ³»¿ëÀº ¾Õ¿¡¼­ ´Ù·é °Í°ú µ¿ÀÏÇÏÁö¸¸, ¼ø¼­´Â ¹Ù²î¾ú½À´Ï´Ù.
  ÀÌ ¹®¹ý¿¡¼­´Â, Á¾·áÀÚ ±âÈ£ (terminal symbol) ÀÎ integer-constant (Á¤¼ö»ó¼ö), character-constant (¹®ÀÚ»ó¼ö), floating-constant (ºÎµ¿»ó¼ö), identifier (¸íĪ), string (¹®ÀÚ¿­), enumeration-constant (¿­°Å»ó¼ö) ¸¦ Á¤ÀÇÇÏÁö ¾Ê¾Ò½À´Ï´Ù; ŸÀÌÇÁü (typewriter style) ´Ü¾î¿Í ±âÈ£´Â ¹®¹ýÀûÀ¸·Î ÁÖ¾îÁø Á¾·áÀÚ (terminal) ÀÔ´Ï´Ù. ÀÌ ¹®¹ýÀº ÀÚµ¿ ÆÄ¼­-»ý¼º±â (automatic parser-generator) °¡ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Â ÀÔ·ÂÇüÅ·Πº¯È¯ÀÌ °¡´ÉÇÕ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ÆÄ¼­-»ý¼º±â (parser-generator) ¶õ, ¹®¹ý±¸Á¶¸¦ ¹Þ¾Æµé¿© ±× ¾ð¾îÀÇ ÆÄ¼­ (parser) ÇÁ·Î±×·¥À» »ý¼ºÇØ ÁÖ´Â °ÍÀÔ´Ï´Ù. ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ Á¤±³ÇÏ°Ô ÀÌ·ÐÈ­Çϸé, ÀÌ·¯ÇÑ ÀÛ¾÷À» ÀÚµ¿È­ÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ëÇ¥ÀûÀÎ °ÍÀ¸·Î´Â YACC °¡ ÀÖ½À´Ï´Ù.

  ÆÄ¼­ (parser) ¶õ, ÄÄÆÄÀÏ·¯³ª ÀÎÅÍÇÁ¸®ÅÍ¿¡¼­ ¿ø½Ã ÇÁ·Î±×·¥À» Àоîµé¿©, ±× ¹®ÀåÀÇ ±¸Á¶¸¦ ¾Ë¾Æ³»´Â ±¸¹®ºÐ¼® (parsing) À» ÇàÇÏ´Â ÇÁ·Î±×·¥À» ¸»ÇÕ´Ï´Ù.

  ±¸¹®ºÐ¼® (parsing) À̶õ, ÄÄÆÄÀÏ·¯³ª ÀÎÅÍÇÁ¸®ÅͰ¡ ÇÁ·Î±×·¥À» ÀÌÇØÇØ ±â°è¾î·Î ¹ø¿ªÇÏ´Â °úÁ¤ÁßÀÇ ÇѴܰè·Î, °¢ ¹®ÀåÀÇ ¹®¹ýÀû ±¸¼º¡¤±¸¹®À» ºÐ¼®ÇÏ´Â °úÁ¤ÀÔ´Ï´Ù. Á¤È®ÇÏ°Ô À̾߱âÇϸé, ¿ø½Ã ÇÁ·Î±×·¥ÀÇ ÅäÅ«¿­ (token sequence) À» ¹Þ¾Æµé¿© ¹®¹ý¿¡ ¸Â°Ô ÆÄ½º Æ®¸® (parse tree) ·Î ±¸¼ºÇÏ´Â °ÍÀ» ¸»ÇÕ´Ï´Ù. ±¸¹®ºÐ¼®ÀÇ Á¾·ù¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ½À´Ï´Ù:

ÇÏÇâ½Ä ÆÄ½Ì (top-down parsing)
»óÇâ½Ä ÆÄ½Ì (bottom-up parsing)
Àç±Í Çϰ­½Ä ÆÄ½Ì (recursive descendent parsing)
¿¹ÃøÇü ÆÄ½Ì (predictive parsing)
ÇÈÃÄ ÆÄ½Ì (picture parsing)
¿¬»êÀÚ ¿ì¼±¼øÀ§ ÆÄ½Ì (operator precedence parsing)
LR ÆÄ½Ì (LR parsing)

¹®¹ýÀ¸·Î Á¦½ÃµÈ °Í¿¡ ´ëü°¡´ÉÇÔ (alternative) À» ÀǹÌÇÏ´Â ¹®¹ýÀû Ç¥½Ã (syntactic marking) ¸¦ »ç¿ëÇØÁÖ°í, "one of" ±¸Á¶¸¦ È®ÀåÇϰí, (ÆÄ¼­-»ý¼º±âÀÇ ±ÔÄ¢¿¡ µû¶ó) opt ±âÈ£°¡ ºÙÀº °ÍÀ» ÇѹøÀº ±âÈ£¿Í ÇÔ²², ÇѹøÀº ±âÈ£¾øÀÌ º¹»çÇØ ½áÁÙ Çʿ䰡 ÀÖ½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ¿¹¸¦ µé¾î ¼³¸íÇϸé, ´ÙÀ½°ú °°ÀÌ ¹Ù²ãÁà¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. (¾Æ·¡¿¡¼­ ±âÈ£ | ´Â 'or' À» ÀǹÌÇÕ´Ï´Ù)

(¿ø·¡) struct-or-union:   one of
        struct         union
(¼öÁ¤ÈÄ)   struct-or-union:
        struct    |    union
 
(¿ø·¡) declarator:
        pointer opt   direct-declarator
(¼öÁ¤ÈÄ) declarator:
        pointer   direct-declarator
        direct-declarator
 

¶ÇÇÑ, typedef-name: identifier ·Î Á¦½ÃµÈ °ÍÀ» ¾ø¾Ö°í, typedef-name À» Á¾·áÀÚ ±âÈ£ (terminal symbol) ·Î ¸¸µé¸é, ÀÌ ¹®¹ýÀº YACC ÆÄ¼­-»ý¼º±â (YACC parser-generator) °¡ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ°Ô µË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  YACC ´Â, "Yet Another Compiler-Compiler" ÀÇ ¾àÀÚ·Î, À¯´Ð½º ¿î¿µÃ¼Á¦¿¡¼­ µ¹¾Æ°¡´Â ÆÄ¼­-»ý¼º±âÀÇ À̸§ÀÔ´Ï´Ù. ¿øÇÏ´Â ±¸¹® (syntax) À» ¹éÄ¿½º Á¤±ÔÇü (BNF) À¸·Î ÀÔ·ÂÇϸé, ±×¿¡ ÇØ´çÇÏ´Â ÆÄ¼­ (parser) ¸¦ C ¾ð¾î·Î ¸¸µé¾î ÁÝ´Ï´Ù.

  ¹éÄ¿½º Á¤±ÔÇü (Backus Normal Form ȤÀº Backus-Nour Form) Àº, ¹éÄ¿½º (P.Backus) ¿Í ³ª¿ì¾î (P.Nour) °¡ Áß½ÉÀÌ µÈ À§¿øÈ¸¿¡¼­ ALGOL 60 ¾ð¾îÀÇ ¹®¹ý±¸Á¶¸¦ Á¤¸®Çϱâ À§ÇØ ¸¸µç Çü½ÄÀÔ´Ï´Ù. 1963³â ÃâÆÇµÈ ALGOL 60 º¸°í¼­¿¡ óÀ½À¸·Î »ç¿ëµÇ¾úÀ¸¸ç, ºñÁ¾·áÀÚ ±âÈ£·ÎºÎÅÍ Á¾·áÀÚ ±âÈ£¿Í ºñÁ¾·áÀÚ ±âÈ£·Î ÀÌ·ç¾îÁø ±âÈ£¿­ (symbol sequence) À» µµÃâÇÏ´Â »ý¼º±ÔÄ¢ (production) À¸·Î ¾ð¾îÀÇ ¹®¹ýÀ» Á¤¸®Çϵµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. ÀÌ´Â ¾ð¾îÀÇ ¹®¹ý ±¸Á¶¸¸À» ¼³¸íÇØ ÁÖ´Â °ÍÀ̸ç, °¢°¢ÀÇ Àǹ̸¦ ¾Ë·ÁÁÖÁö´Â ¾Ê½À´Ï´Ù.

ÀÌ ¹®¹ý¿¡´Â, if-else ¸ðÈ£ÇÔ¿¡ ÀÇÇØ ¹ß»ýÇÏ´Â Ãæµ¹ (conflict) ÀÌ Çϳª Á¸ÀçÇÕ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ¿©±â¼­ ¸»ÇÏ´Â Ãæµ¹ (conflict) À̶õ, ¼±Åà °¡´É¼ºÀÌ (ÇѰ³¸¸ Á¸ÀçÇØ¾ß Çϴµ¥) ¿©·¯°³ Á¸ÀçÇÏ´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. Áï, À̰÷¿¡¼­ Á¦½ÃµÈ if ¹®ÀÇ ¹®¹ýÀ» »ìÆìº¸¸é ´ÙÀ½°ú °°½À´Ï´Ù. (¿ø·¡ ÀÖ´Â switch ¹®Àº »ý·«Çß½À´Ï´Ù)

selection-statment:
          if ( expression ) statement
          if ( expression ) else statement

À§¿Í °°ÀÌ ¹®¹ýÀÌ ÁÖ¾îÁø »óÅ¿¡¼­, ´ÙÀ½°ú °°Àº ¹®ÀåÀº

if (expr_1) if (expr_2) stmt_1 else stmt_2

°¢°¢ ¾Æ·¡¿Í °°ÀÌ µÎ°¡Áö ÀÇ¹Ì·Î ÇØ¼®µÉ ¼ö ÀÖ½À´Ï´Ù.

if (expr_1) {
      if (expr_2)                  
            stmt_1
      else
            stmt_2
}
if (expr_1) {
      if (expr_2)
            stmt_1
}
else
      stmt_2

ÀÌ·¯ÇÑ Ãæµ¹À» ÇØ°áÇÏ·Á¸é, µÎ°³ÀÇ ºñÁ¾·áÀÚ ±âÈ£ (non-terminal symbol) ¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.

  ¾Æ·¡´Â ¹®¹ý ¿ä¾àÀÔ´Ï´Ù. ÇÑÁÙ¿¡ ³ª¿Í¾ß ÇÏ´Â °ÍÀÌ ºÎµæÀÌÇÑ »çÁ¤À¸·Î µÎÁÙ·Î ³ª´©¾îÁø °æ¿ì, ¶óÀÎ ¿¬°áÀÇ Àǹ̸¦ °®´Â \ ¹®ÀÚ¸¦ »ç¿ëÇØ¼­ Ç¥½ÃÇß½À´Ï´Ù.

translation-unit:
        external-declaration
        translation-unit  external-declaration

external-declaration:
        function-definition
        declaration

function-definition:
        declaration-specifiersopt  declarator  \
                                    declaration-listopt  compound-statement

declaration:
        declaration-specifiers  init-declarator-listopt  ;

declaration-list:
        declaration
        declaration-list  declaration

declaration-specifiers:
        storage-class-specifier  declaration-specifiersopt
        type-specifier  declaration-specifiersopt
        type-qualifier  declaration-specifiersopt

storage-class-specifier:   one of
        auto  register  static  extern  typedef

type-specifier:   one of
        void  char  short  int  long  float  double
        signed  unsigned   struct-or-union-specifier
        enum-specifier   typedef-name


type-qualifier:   one of
        const  volatile

struct-or-union-specifier:
        struct-or-union  identifieropt  {  struct-declaration-list  }
        struct-or-union  identifier

struct-or-union:   one of
        struct  union

struct-declaration-list:
        struct-declaration
        struct-declaration-list  struct-declaration

init-declarator-list:
        init-declarator
        init-declarator-list  ,  init-declarator

init-declarator:
        declarator
        declarator  =  initializer

struct-declaration:
        specifier-qualifier-list  struct-declarator-list  ;

specifier-qualifier-list:
        type-specifier  specifier-qualifier-listopt
        type-qualifier  specifier-qualifier-listopt

struct-declarator-list:
        struct-declarator
        struct-declarator-list  ,  struct-declarator

struct-declarator:
        declarator
        declaratoropt  :  constant-expression

enum-specifier:
        enum  identifieropt  {  enumerator-list  }
        enum  identifier

enumerator-list:
        enumerator
        enumerator-list  ,  enumerator

enumerator:
        identifier
        identifier  =  constant-expression

declarator:
        pointeropt  direct-declarator

direct-declarator:
        identifier
        ( declarator )
        direct-declarator  [  constant-expressionopt  ]
        direct-declarator  (  parameter-type-list  )
        direct-declarator  (  identifier-listopt  )

pointer:
        *  type-qualifier-listopt
        *  type-qualifier-listopt  pointer

type-qualifier-list:
        type-qualifier
        type-qualifier-list  type-qualifier

parameter-type-list:
        parameter-list
        parameter-list  , ...

parameter-list:
        parameter-declaration
        parameter-list  ,  parameter-declaration

parameter-declaration:
        declaration-specifier  declarator
        declaration-specifier  abstract-declaratoropt

identifier-list:
        identifier
        identifier-list  ,  identifier

initializer:
        assignment-expression
        {  initializer-list  }
        {  initializer-list  , }

initializer-list:
        initializer
        initializer-list  ,  initializer

type-name:
        specifier-qualifier-list  abstract-declaratoropt

abstract-declarator:
        pointer
        pointeropt  direct-abstract-declarator

direct-abstract-declarator:
        ( abstract-declarator )
        direct-abstract-declaratoropt  [  constant-expressionopt  ]
        direct-abstract-declaratoropt  (  parameter-type-listopt  )

typedef-name:
        identifier

statement:
        labeled-statement
        expression-statement
        compound-statement
        selection-statement
        iteration-statement
        jump-statement

labeled-statement:
        identifier  :  statement
        case  constant-expression  :  statement
        default  :  statement

expression-statement:
        expressionopt  ;

compound-statement:
        {  declaration-listopt  statement-listopt  }

statement-list:
        statement
        statement-list  statement

selection-statement:
        if  ( expression )  statement
        if  ( expression )  statement  else  statement
        switch  ( expression )  statement

iteration-statement:
        while  ( expression )  statement
        do  statement  while  ( expression )  ;
        for  ( expressionopt  ;  expressionopt  ;  exrepssionopt )  statement

jump-statement:
        goto  identifier  ;
        continue  ;
        break  ;
        return expressionopt  ;

expression:
        assignment-expression
        expression  ,  assignment-expression

assignment-expression:
        conditional-expression
        unary-expression  assignment-operator  assignment-expression

assignment-operator:   one of
        =  *=  /=  %=  +=  -=  <<=  >>=  &=  ^=  |=

conditional-expression:
        logical-OR-expression
        logical-OR-expression  ?  expression  :  conditional-expression

constant-expression:
        conditional-expression

logical-OR-expression:
        logical-AND-expression
        logical-OR-expression  ||  logical-AND-expression

logical-AND-expression:
        inclusive-OR-expression
        logical-AND-expression  &&  inclusive-OR-expression

inclusive-OR-expression:
        exclusive-OR-expression
        inclusive-OR-expression  |  exclusive-OR-expression

exclusive-OR-expression:
        AND-expression
        exclusive-OR-expression  ^  AND-expression

AND-expression:
        equality-expression
        AND-expression  &  equality-expression

equality-expression:
        relational-expression
        equality-expression  ==  relational-expression
        equality-expression  !=  relational-expression

relational-expression:
        shift-expression
        relational-expression  <  shift-expression
        relational-expression  >  shift-expression
        relational-expression  <=  shift-expression
        relational-expression  >=  shift-expression

shift-expression:
        additive-expression
        shift-expression  <<  additive-expression
        shift-expression  >>  additive-expression

additive-expression:
        multiplicative-expression
        additive-expression  +  multiplicative-expression
        additive-expression  -  multiplicative-expression

multiplicative-expression:
        cast-expression
        multiplicative-expression  *  cast-expression
        multiplicative-expression  /  cast-expression
        multiplicative-expression  %  cast-expression

cast-expression:
        unary-expression
        ( type-name )  cast-expression

unary-expression:
        postfix-expression
        ++  unary-expression
        --  unary-expression
        unary-operator  cast-expression
        sizeof  unary-expression
        sizeof  ( type-name )

unary-operator:   one of
        &  *  +  -  ~  !

postfix-expression:
        primary-expression
        postfix-expression  [  expression  ]
        postfix-expression  (  argument-expression-listopt  )
        postfix-expression  .  identifier
        postfix-expression  ->  identifier
        postfix-expression  ++
        postfix-expression  --

primary-expression:
        identifier
        constant
        string
        ( expression )

argument-expression-list:
        assignment-expression
        argument-expression-list  ,  assignment-expression

constant:
        integer-constant
        character-constant
        floating-constant
        enumeration-constant

  ¾Æ·¡¿¡ ÁÖ¾îÁø Àü󸮱â (preprocessor) ¿¡ ´ëÇÑ ¹®¹ýÀº Á¦¾î¶óÀÎ (control line) ÀÇ ±¸Á¶¸¦ ¿ä¾àÇÑ °ÍÀ̸ç, ±¸¹®ºÐ¼® (parsing) ¿¡ »ç¿ëÇϱ⿡´Â ÀûÇÕÇÏÁö ¾Ê½À´Ï´Ù. ¿©±â¿¡´Â, ÅØ½ºÆ® (text) ¶ó´Â ±âÈ£ (symbol) °¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç, ÀÌ ÅØ½ºÆ® (text) ´Â ÀÏ¹Ý ÇÁ·Î±×·¥ ÅØ½ºÆ® (ordinary program text), ºñÁ¶°ÇºÎ ÄÄÆÄÀÏ Á¦¾î¶óÀÎ (non-conditional preprocessor control line), ¿ÏÀüÇÑ Á¶°ÇºÎ ÄÄÆÄÀÏ ±¸Á¶ (complete preprocessor conditional construction) ¸¦ ÀǹÌÇÕ´Ï´Ù. ¿©±â¼­µµ ¿ª½Ã ºÎµæÀÌÇÑ »çÁ¤À¸·Î µÎÁÙ·Î ³ª´²Áø °æ¿ì¿¡´Â \ ¸¦ »ç¿ëÇØ Ç¥½ÃÇÏ¿´½À´Ï´Ù.

control-line:
        #  define  identifier  token-sequence
        #  define  identifier( identifieropt  , ...  \
                                          , identifieropt )  token-sequence
        #  undef  identifier
        #  include  <filename>
        #  include  "identifier"
        #  include  token-sequence
        #  line  constant  "filename"
        #  line  constant
        #  error  token-sequenceopt
        #  pragma  token-sequenceopt
        #
        preprocessor-conditional

preprocessor-conditional:
        if-line  text  elif-parts  else-partopt  #  endif

if-line:
        #  if  constant-expression
        #  ifdef  identifier
        #  ifndef  identifier

elif-parts:
        elif-line  text
        elif-partsopt

elif-line:
        #  elif  constant-expression

else-part:
        else-line  text

else-line:
        #  else



ÀÌÀü [¡ã ¸ÇÀ§·Î]
[¢Ê ¸ñÂ÷·Î]