¢Ê 14ÀÏ: ¹®¹ý
¢¹ A13. ¹®¹ý (Grammar)
¾Æ·¡´Â ÀÌ ºÎ·ÏÀÇ ¾ÕºÎºÐ¿¡ ³ª¿Ô´ø ¹®¹ýÀ» ¿ä¾àÇÑ °ÍÀÔ´Ï´Ù. ³»¿ëÀº ¾Õ¿¡¼
´Ù·é °Í°ú µ¿ÀÏÇÏÁö¸¸, ¼ø¼´Â ¹Ù²î¾ú½À´Ï´Ù.
ÀÌ ¹®¹ý¿¡¼´Â, Á¾·áÀÚ ±âÈ£ (terminal symbol)
ÀÎ integer-constant (Á¤¼ö»ó¼ö), character-constant (¹®ÀÚ»ó¼ö),
floating-constant (ºÎµ¿»ó¼ö), identifier (¸íĪ), string (¹®ÀÚ¿),
enumeration-constant (¿°Å»ó¼ö) ¸¦ Á¤ÀÇÇÏÁö ¾Ê¾Ò½À´Ï´Ù;
ŸÀÌÇÁü (typewriter style) ´Ü¾î¿Í ±âÈ£´Â
¹®¹ýÀûÀ¸·Î ÁÖ¾îÁø Á¾·áÀÚ (terminal) ÀÔ´Ï´Ù. ÀÌ ¹®¹ýÀº ÀÚµ¿ ÆÄ¼-»ý¼º±â
(automatic parser-generator) °¡ ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Â ÀÔ·ÂÇüÅ·Πº¯È¯ÀÌ °¡´ÉÇÕ´Ï´Ù.
¹®¹ýÀ¸·Î Á¦½ÃµÈ °Í¿¡ ´ëü°¡´ÉÇÔ (alternative) À» ÀǹÌÇÏ´Â ¹®¹ýÀû Ç¥½Ã
(syntactic marking) ¸¦ »ç¿ëÇØÁÖ°í, "one of" ±¸Á¶¸¦ È®ÀåÇϰí, (ÆÄ¼-»ý¼º±âÀÇ ±ÔÄ¢¿¡
µû¶ó) opt ±âÈ£°¡ ºÙÀº °ÍÀ» ÇѹøÀº ±âÈ£¿Í ÇÔ²², ÇѹøÀº ±âÈ£¾øÀÌ º¹»çÇØ
½áÁÙ Çʿ䰡 ÀÖ½À´Ï´Ù.
¶ÇÇÑ, 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
|
|