· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Spirit

Boost ¶óÀ̺귯¸®¿¡¼­ ÆÄ¼­ Á¦³Ê·¹ÀÌÅÍÀÎ ½ºÇǸ´(Sprit)¿¡ ´ëÇÑ ¸Å´º¾óÀ» ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù.



1. ¼Ò°³

½ºÇǸ´Àº object-oriented recursive-descent parser generator frameworkÀ¸·Î template meta-programming ±â¼úÀ» ÀÌ¿ëÇØ¼­ ±¸ÇöµÇ¾ú´Ù. Expression templateÀ» ÅëÇØ¼­ C++¿¡¼­ EBNF(Extended Backus-Normal Form) ¹®¹ýÀ» ³ªÅ¸³¾ ¼ö ÀÖ¾ú´Ù.

½ºÇǸ´Àº C++·Î ¿øÇÏ´Â ±×·¡¸¶¸¦ ¾µ¼ö ÀÖ´Ù. C++ ÅÛÇø®Æ®ÀÇ Ç¥Çö·Â¿¡ ÀÇÇØ¼­ Inline EBNF ±×·¡¸¶´Â ÀÚÀ¯·Ó°Ô C++ ÄÚµå¿Í ¼¯¾î¼­ ¾µ ¼ö ÀÖÀ¸¸ç Áï½Ã ¼öÇàµÈ´Ù. ¹Ý¸é ÀϹÝÀûÀÎ ÆÄ¼­ »ý¼º±â´Â EBNF Äڵ带 C++À̳ª C ÄÚµå·Î º¯È¯ÇÏ´Â Ãß°¡ ÀÛ¾÷ÀÌ ÀÖ¾ú´Ù.

°£´ÜÇÑ EBNF ¿¹Á¦:
    group       ::= '(' expression ')'
    factor      ::= integer | group
    term        ::= factor (('*' factor) | ('/' factor))*
    expression  ::= term (('+' term) | ('-' term))*

À§ÀÇ °ÍÀ» ½ºÇǸ´¿¡¼­ Ç¥ÇöÇÑ °Í:
    group       = '(' >> expression >> ')';
    factor      = integer | group;
    term        = factor >> *(('*' >> factor) | ('/' >> factor));
    expression  = term >> *(('+' >> term) | ('-' >> term));

Expression templateÀÇ ´É·ÂÀ¸·Î ÀÎÇØ¼­ À§ÀÇ ÄÚµå´Â C++¿¡¼­ ÄÄÆÄµÈ´Ù. ÇÁ·Î´ö¼Ç ·ê expressionÀº ¿ì¸®°¡ ¼±¾ðÇÑ ±×·¡¸¶¸¦ ÆÄ½ÌÇÏ´Â ¸â¹ö ÇÔ¼ö¸¦ °®´Â °´Ã¼ÀÌ´Ù. ''expression'Àº °è»ê±âÀÌ´Ù. °£´ÜÈ÷ Çϱâ À§Çؼ­ factor¿¡ ÀÖ´Â integer¿¡ ´ëÇÑ ·êÀº »ý·«Çß´Ù. ¿ì¸®°¡ Á¤ÀÇÇÑ ±×·¡¸¶ÀÇ ÇÁ·Î´ö¼Ç ·ê expressionÀº (º¸Åë start symbol·Î ºÒ¸°´Ù.) ¾Æ·¡¿Í °°Àº ÀÔ·ÂÀ» ÀνÄÇÒ ¼ö ÀÖ´Ù.
    12345
    -12345
    +12345
    1 + 2
    1 * 2
    1/2 + 3/4
    1 + 2 + 3 + 4
    1 * 2 * 3 * 4
    (1 + 2) * (3 + 4)
    (-1 + 2) * (3 + -4)
    1 + ((6 * 200) - 20) / 6
    (1 + (2 + (3 + (4 + 5))))

¿ì¸®´Â ¿ø·¡ÀÇ EBNF¿¡¼­ ¸î°¡Áö¿¡ ´ëÇØ¼­ º¯°æÀ» Çß´Ù. À̰ÍÀº C++¹®¹ý¿¡ ¸ÂÃß±â À§Çؼ­ÀÌ´Ù. °¡Àå ÁÖ¸ñÇÒ °ÍÀº shift ¿¬»êÀÚ(>>)ÀÌ´Ù. C++¿¡´Â 'empty' ¿¬»êÀÚ°¡ ¾ø±â ¶§¹®¿¡ ´ÙÀ½°ú °°ÀÌ ¾²´Â °ÍÀÌ ºÒ°¡´ÉÇÏ´Ù.
   a b
À̰ÍÀº ¼öÇп¡¼­ °ö¼À?Ç¥½ÃÇÏ´Â °Í°ú °°Àº ¹æ½ÄÀε¥ EBNF¿¡¼­´Â ¼ø¼­¸¦ ³ªÅ¸³½´Ù.(b°¡ ¹Ýµå½Ã aµÚ¿¡ ÀÖ¾î¾ß ÇÑ´Ù.) ½ºÇǸ´¿¡¼­´Â °°Àº ¸ñÀûÀ» À§Çؼ­ shift ¿¬»êÀÚ '>>'¸¦ »ç¿ëÇÑ´Ù. 'is followed by'¸¦ ³ªÅ¸³»±â À§Çؼ­ ¿À¸¥ÂÊÀ¸·Î °¡´Â shift ¿¬»êÀÚ '>>'¸¦ ¼±ÅÃÇß´Ù. ±×·¡¼­ ÀÌ·¸°Ô µÈ´Ù.
   a >> b

¼±Åà ¿¬»êÀÚÀÎ '|'°ú °ýÈ£ÀÎ '(' ')'´Â ±×´ë·Î »ç¿ëÇÑ´Ù. ´ëÀÔ ¿¬»êÀÚ '='°¡ EBNFÀÇ ':='¸¦ ´ëüÇÑ´Ù. ±×¸®°í º°Ç¥ ¿¬»êÀÚ '*'´Â EBNF¿¡¼­ postfix¿¬»êÀÚÀ̳ª ½ºÇǸ´¿¡¼­´Â C++¿¡¼­ '*'¿¬»êÀÚ°¡ prefixÀÎ °ü°è·Î prefix·Î »ç¿ëÇÑ´Ù. Áï
   a* //... in EBNF syntax,
°¡
   *a //... in Spirit.
ÀÌ µÈ´Ù. ¸¶Áö¸·À¸·Î °¢°¢ÀÇ ·ê¸¶´Ù ¼¼¹ÌÄÝ·Ð ';'À» »ç¿ëÇØ¼­ ³¡³½´Ù.


2. Quick Start

2.1. ¿Ö Spirit¸¦ »ç¿ëÇØ¾ß Çϳª?

½ºÇǸ´Àº ½Ç¿ëÀûÀÎ ÆÄ½Ì Åø·Î¼­ ¼³°èµÇ¾ú´Ù. EBNFÇü½ÄÀ» ¿Ïº®ÇÏ°Ô ÆÄ½ÌÇÏ´Â ´É·ÂÀ» C++ÄÚµå ³»¿¡¼­ ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿© °³¹ß ½Ã°£À» ´ÜÃà½ÃŲ´Ù. C³ª Pascal°ú °°Àº »õ·Î¿î ·©±ÍÁö¸¦ °³¹ßÇϰíÀÚ ÇÑ´Ù¸é, YACC³ª ANTLR°ú °°Àº Å« stand-alone ÆÄ¼­¸¦ »ç¿ëÇϴ°͵µ ½Ç¿ëÀûÀÌ´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ÀÛÀº ÆÄ¼­¸¦ ¸¸µé°íÀÚ ÇÑ´Ù¸é YACC³ª ANTLRÀ» »ç¿ëÇÏ´Â °ÍÀº ³Ê¹« ¹«°Ì´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÇØ¾ßÇÒ ÆÄ½Ì ÀÛ¾÷ÀÇ ½ºÆåÆ®·³Áß ÇÑÂÊ ³¡Àº scanf¸¦ »ç¿ëÇØ¼­ Á÷°üÀûÀ¸·Î ¼öÇàÇÏ´Â °ÍÀÌ´Ù. Á¤±Ô½Ä 󸮸¦ À§ÇÑ ¶óÀ̺귯¸®(¿¹ : boostÀÇ regex)³ª ½ºÄ³³Ê(¿¹ : boostÀÇ tokenizer)°¡ Á¸ÀçÇÏÁö¸¸, Á¤±³ÇÑ ÆÄ¼­¸¦ ¸¸µå´Âµ¥´Â ºÎÁ·ÇÏ´Ù. ÀÌ·± ÅøÀ» »ç¿ëÇØ¼­ º¹ÀâÇÑ ÆÄ¼­¸¦ ¸¸µé¸é ÀÌÇØÇϰųª °ü¸®Çϱâ Èûµç Äڵ带 ÀÛ¼ºÇÒ ¼ö ¹Û¿¡ ¾ø´Ù.

2.2. ¿¹Á¦ 1

ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ¸¦ ÆÄ½ÌÇϱâ À§ÇÑ ÆÄ¼­¸¦ »ý¼ºÇÏÀÚ
    real_p
À§ÀÇ ÄÚµå´Â ½ºÇǸ´ÀÇ real_parser(built-in parser)¶ó´Â ºÎµ¿¼Ò¼öÁ¡ ÆÄ¼­¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁ³´Ù. ÆÄ¼­ÀÇ ³¡ÀÌ _p¶ó´Â ½ºÇǸ´ ÄÁº¥¼Ç(convention)¿¡ µû¸¥´Ù´Âµ¥ ÁÖÀÇÇÏÀÚ. ½ºÇǸ´Àº ¸¹Àº pre-defined ÆÄ¼­°¡ Á¸ÀçÇϰí ÀÏÁ¤ÇÑ ³×ÀÌ¹Ö ÄÁº¥¼Ç¿¡ ÀÇÇØ¼­ ´ç½ÅÀÌ »ç¿ëÇϴµ¥ ÆíÇÏ°Ô µÇ¾îÀÖ´Ù.

2.3. ¿¹Á¦ 2

ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ 2°³¸¦ ¹Þ¾ÆµéÀÌ´Â ÆÄ¼­¸¦ »ý¼ºÇÏÀÚ
    real_p >> real_p
Ä£¼÷ÇÑ ºÎµ¿¼Ò¼öÁ¡ ÆÄ¼­ÀÎ real_p°¡ 2¹ø »ç¿ëµÈ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ¿©±â¼­ '>>'' ¿¬»êÀÚ°¡ ¹«½¼ ¿ªÇÒÀ» ÇÏ´Â °ÍÀϱî? ¼ýÀÚµéÀº ¹º°¡¿¡ ÀÇÇØ¼­ ºÐ¸®µÇ¾î ÀÖ¾î¾ß Çϴµ¥, ±×°ÍÀÌ ¿¬¼Ó ¿¬»êÀÚ·Î ¼±ÅõǾú´Ù. À§ÀÇ ÇÁ·Î±×·¥Àº 2°³ÀÇ ´Ü¼øÇÑ ÆÄ¼­ºÎÅÍ ÇϳªÀÇ ÇϳªÀÇ ÆÄ¼­¸¦ »ý¼ºÇϴµ¥, 2°³ÀÇ ÆÄ¼­¸¦ ºÙÀÌ´Â ¿ªÇÒÀº ¿¬¼Ó ¿¬»êÀÚ°¡ ÇÑ´Ù. °á°ú´Â 2°³ÀÇ ÀÛÀº ÆÄ¼­¸¦ °áÇÕÇÑ ÇϳªÀÇ ÆÄ¼­ÀÌ´Ù. ¼ýÀÚ »çÀÌ¿¡ ÀÖ´Â °ø¹éÀº ¾î¶»°Ô ÆÄ¼­°¡ ºÒ¸®´À³Ä¿¡ µû¶ó¼­ ÀÚµ¿ÀûÀ¸·Î Á¦°ÅµÈ´Ù.(¾Æ·¡¸¦ º¸¶ó)

ÁÖÀÇ: ÆÄ¼­¸¦ °áÇÕÇÒ¶§ ¹Ýµå½Ã ´õÅ« ÆÄ¼­·Î ³¡³­´Ù. ÆÄ¼­´Â °áÇÕÀ» ½ÃÅ´¿¡ µû¶ó Á¡Á¡´õ Ä¿Áø´Ù. ±×·¸Áö¸¸ ¾ðÁ¦³ª µÎ°³ÀÇ ÆÄ¼­¸¦ °áÇÕÇϸé ÇϳªÀÇ Å« ÆÄ¼­·Î ³¡³­´Ù. À̰ÍÀº Áß¿äÇÑ °³³äÀÌ´Ù.

2.4. ¿¹Á¦ 3

ÀÓÀÇÀÇ °³¼öÀÇ ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ¸¦ ¹Þ¾ÆµéÀÌ´Â ÆÄ¼­¸¦ »ý¼ºÇÏÀÚ.
    *real_p
À̰ÍÀº '*'¸¦ »ç¿ëÇÑ Á¤±Ô½Ä Ç¥Çö°ú ºñ½ÁÇÏÁö¸¸ C++ ÇÁ·Î±×·¡¸Ó°¡ '*' ¿¬»êÀÚ¸¦ ¿À¹ö·Îµå Çß´Ù°í ÇØµµ ¾à°£Àº ÀÌ»óÇÏ´Ù. ÀÌ»óÇÏ°Ô º¸ÀÌ´Â °ÍÀº '*'°¡ ¿µÇâÀ» ÁÖ´Â ''real_p'ÀÇ ¾ÕÂÊ¿¡ À§Ä¡ÇØ Àֱ⠶§¹®ÀÌ´Ù. ÀÌ°Ç C++ ¹®¹ý¿¡ ¸Â°Ô µ¿ÀÛÇÏ°Ô ÇÏ·Á°í Ç߱⠶§¹®ÀÌ´Ù.

ÆÄ¼­¸¦ ¸¸µé¾î ³»´Â Ç¥ÇöÀÇ ´ëºÎºÐÀº '*'¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. C++ÀÇ ¿¬»êÀÚ ¿ì¼±¼øÀ§¿¡ µû¶ó¼­ °ýÈ£¾È¿¡ '*'¸¦ ³Ö¾î¾ß ÇÒÁöµµ ¸ð¸¥´Ù. '*'´Â Kleene Start, Keene Closure µîÀ¸·Î ¾Ë·ÁÁ® ÀÖÁö¸¸ ¾ÕÀ¸·Î´Â ±×³É º°(star)À̶ó°í ÇÑ´Ù.

2.5. ¿¹Á¦ 4

ÀÌ ¿¹Á¦¿¡¼­ ½°Ç¥·Î ºÐ¸®µÈ ¼ýÀÚ ¸®½ºÆ®¸¦ vector¿¡ ³Ö´Â ÆÄ¼­¸¦ ¸¸µé °ÍÀÌ´Ù.

2.5.1. Step 1. ÆÄ¼­ÀÇ »ý¼º

    real_p >> *(ch_p(',') >> real_p)
ch_p(',')¿¡ ÁÖ¸ñÇ϶ó. ÀÌ°Ç ½±Ç¥ ','¸¦ ÀνÄÇϱâ À§ÇÑ literal character ÆÄ¼­ÀÌ´Ù. ¿©±â¼­´Â º°ÀÌ ´õ º¹ÀâÇÑ ¾Æ·¡ÀÇ ½Ä¿¡ ÀÇÇØ¼­ ¸¸µé¾îÁö´Â ÆÄ¼­¿¡ ¿µÇâÀ» ÁØ´Ù.
    (ch_p(',') >> real_p)
À̹ø °Í¿¡´Â °ýÈ£°¡ ÇÊ¿äÇϴٴµ¥ ÁÖÀÇÇ϶ó.

2.5.2. Step 2. ÆÄ¼­ÀÇ »ç¿ë

ÀÌÁ¦ ÆÄ¼­°¡ ¸¸µé¾î Á³´Âµ¥ À̰ÍÀ» ¾î¶»°Ô »ç¿ëÇÒ±î? C++ Àӽà °´Ã¼¿Í ¸¶Âù°¡Áö·Î º¯¼ö¿¡ ´ëÀÔÇÒ ¼öµµ ÀÖ°í Á÷Á¢ ÄÝÇÒ ¼öµµ ÀÖ´Ù.

C++ÀÇ ¼¼ºÎ»çÇ×Àº ´ëÃæ ³Ñ¾î°¡°Ú´Ù.

rÀ» ·êÀ̶ó°í ÇÑ´Ù¸é ´ÙÀ½°ú °°ÀÌ ÆÄ¼­¸¦ ÇϳªÀÇ ·ê·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. (·êÀÌ Á¤È®È÷ ¹«¾úÀÎÁö¿¡ ´ëÇØ¼­ °ÆÁ¤ÇÏÁö¸¶¶ó. ÀÌ°Ç ´ÙÀ½¿¡ ´Ù½Ã ³íÀÇÇϰڴÙ. °£´ÜÈ÷ ¾ê±âÇØ¼­ ·êÀº ÇϳªÀÇ ÆÄ¼­¸¦ °¡Áø º¯¼öÀÌ´Ù.)
    r = real_p >> *(ch_p(',') >> real_p);

½Ã½ÃÇϰԵµ ´ç½ÅÀÌ ¼ö³â µ¿¾È ÇØ¿Ô´ø C++ÀÇ ´ëÀÔ ±¸¹®(expression)°ú ºñ½ÁÇÏ´Ù. ÆÄ¼­¸¦ ·ê¿¡ ÀúÀåÇÏ´Â °Í¿¡ °üÇÑ ¸ÚÁø Á¡Àº ·êÀº ÆÄ¼­À̸ç À̸§(¿©±â¼­´Â r)·Î ÂüÁ¶µÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. À̰ÍÀÌ Àüü ´ëÀÔ ±¸¹®À̶ó´Âµ¥ ÁÖ¸ñÇÏÀÚ.(±×·¡¼­ ';'·Î ³¡³µ´Ù.)

±×·¸´Ù. ¿ì¸®´Â ÆÄ¼­¸¦ Á¤ÀÇÇÏ´Â °ÍÀ» ¿Ï·áÇß´Ù. ´ÙÀ½ °úÁ¤Àº ÆÄ¼­¸¦ ¿ì¸®°¡ ¿øÇÏ´Â ÀÏÀ» Çϵµ·Ï È£ÃâÇÏ´Â °ÍÀÌ´Ù. ¿©±â¿¡´Â ¸î°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. ¿©±â¼­´Â const char *¸¦ ¹Þ´Â parseÇÔ¼ö¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ´Â ´ÙÀ½°ú °°´Ù.
  • NULL terminated const char * (input)
  • ÆÄ¼­ °´Ã¼
  • skip parser¶ó°í ºÒ¸®´Â ´Ù¸¥ ÆÄ¼­

ÀÌ ¿¹Á¦¿¡¼­ space¿Í tab´Â ½ºÅµÇÏ·Á°í ÇÑ´Ù. space_p¶ó´Â ½ºÇǸ´¿¡¼­ predefinedµÈ ÆÄ¼­¸¦ ´Ù¸¥ ÆÄ¼­ Áï skip parser·Î »ç¿ëµÈ´Ù. ÀÌ ÆÄ¼­´Â °ø¹é¹®ÀÚ¸¦ ÀνÄÇÏ´Â ¸Å¿ì ´Ü¼øÇÑ ÆÄ¼­ÀÌ´Ù. Skip parser´Â real_p¿Í ch_p¶ó´Â ÆÄ¼­ »çÀÌ¿¡¼­ ½ºÅµÇؾßÇÒ ¹®ÀÚµéÀ» Ã¥ÀÓÁø´Ù.

±×·³ ÆÄ½ÌÇØº¸ÀÚ.
    r = real_p >> *(ch_p(',') >> real_p);
    parse(str, r, space_p) // Not a full statement yet, patience...
parseÇÔ¼ö´Â parse_info¶ó ºÒ¸®´Â ÇϳªÀÇ °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼­ ¿ì¸®´Â ´ÙÀ½°ú °°Àº°ÍÀ» ¾Ë°íÀÚ ÇÑ´Ù.
  • ÆÄ¼­°¡ strÀ» ¼º°øÀûÀ¸·Î ÀνÄÇߴ°¡?
  • ÆÄ¼­°¡ ¿ÏÀüÈ÷ ÆÄ½ÌÇØ¼­ strÀÇ ³¡±îÁö ´Ù ¼Ò¸ðÇߴ°¡?

À§ÀÇ °ÍÀ» ¸ðµÎ ³ªÅ¸³»±âÀ§Çؼ­ ÇϳªÀÇ ÇÔ¼ö·Î ¸¸µé°Ú´Ù.
    bool
    parse_numbers(char const* str)
    {
        return parse(str, real_p >> *(',' >> real_p), space_p).full;
    }
¿©±â¼­´Â ·êÀ» À̸§À¸·Î ¼±¾ðÇÏÁö ¾Ê°í inlineÀ» ÅëÇØ¼­ ¹Ù·Î »ç¿ëÇß´Ù. parse_numberÇÔ¼ö°¡ Äݵɶ§, ±¸¹®ÀÌ °è»êµÇ°í, unnammed ÆÄ¼­°¡ ¸¸µé¾îÁ®¼­ parseÇÔ¼ö·Î Àü´ÞµÈ´Ù. ÇÔ¼ö¾È¿¡¼­ »ç¿ëµÈ ÆÄ¼­´Â »ç¿ëÀÌ ³¡³­ÈÄ ¼Ò¸êµÈ´Ù.

'''char°ú w_char'''

ÁÖÀDZíÀº µ¶ÀÚ´Â ¾ÕÀÇ ¿¹Á¦¿Í´Â ´Ù¸£°Ô ','ÀÌ ch_p(',') ´ë½Å¿¡ »ç¿ëµÈ °ÍÀ» ¾Ë¾ÒÀ» °ÍÀÌ´Ù.
À̰ÍÀº C++ ¹®¹ý¿¡ ÀÇÇØ¼­ Çã¿ëµÈ´Ù.
>> ¿¬»êÀÚµé Áß¿¡ charÀ̳ª w_charÀ» ¿ÞÂÊÀ̳ª ¿À¸¥ÂÊÁß ÇѰ÷¿¡ ¹Þ¾ÆµéÀ̵µ·Ï overloadÇÑ °ÍÀÌ Á¸ÀçÇÑ´Ù.(¾çÂÊ ¸ðµÎ´Â ¾ÈµÈ´Ù.)
ÇϳªÀÌ»óÀÇ ÀÎÀÚ°¡ »ç¿ëÀÚ Á¤ÀÇ typeÀÏ °æ¿ì ¿¬»êÀÚ overloadingÀÌ ÀϾ´Ù.
ÀÌ °æ¿ì¿¡´Â real_p°¡ >>¿¬»êÀÚÀÇ 2¹øÂ° ÀÎÀÚÀÌ°í ¿¬»êÀÚ >>°¡ »ç¿ëµÇ¾úÀ¸¹Ç·Î ','°¡ ch_p(',')·Î º¯È¯µÈ´Ù.

ch_p¸¦ ÄÝÇÏ´Â °ÍÀ» »ý·«Çϴµ¥¼­ ¹®Á¦°¡ »ý±æ ¼ö ÀÖ´Ù.
'a' >> 'b' ÀÇ °æ¿ìÀε¥, ÀÌ °æ¿ì´Â ½ºÇǸ´ ÆÄ¼­°¡ »ý¼ºµÇÁö ¾Ê´Â´Ù.
ÀÌ °æ¿ì´Â ´Ü¼øÇÑ ¼ýÀÚ °è»ê ½ÄÀ̸ç aÀÇ ASCII°ªÀ» bÀÇ ASCII°ª ¸¸Å­ ¿À¸¥ÂÊÀ¸·Î shiftÇÑ´Ù.
ÇÏÁö¸¸ ch_p('a') >> 'b'³ª 'a' >> ch_p('b')´Â ½ºÇǸ´ ÆÄ¼­ÀÌ´Ù.

parseÇÔ¼öÀÇ ¸®ÅÏ °´Ã¼¿¡¼­ fullÀ̶ó´Â ¸â¹ö¸¦ ºÒ·¶´Ù. fullÀº À§ÀÇ µÎ ¿ä°ÇÀ» ¸ðµÎ ¸¸Á· ½Ãų¶§ true°¡ µÈ´Ù. (Áï ÆÄ¼­´Â ¿ÏÀüÈ÷ ÀÔ·ÂµÈ ½ºÆ®¸µÀ» ÀνÄÇß´Ù.)


2.5.3. Step 3. Semantic Actions

À§¿¡¼­ ¸¸µç ¿ì¸®ÀÇ ÆÄ¼­´Â ´Ü¼øÈ÷ Àνĸ¸ ÇÑ´Ù. ´Ü¼øÈ÷ "ÀÔ·ÂÀÌ ¿ì¸®ÀÇ ±×·¡¸¶¿¡ ÀÏÄ¡Çϴ°¡?"¿¡ ´ëÇÑ ´ë´ä¸¸ ÇÒ »Ó, ¾î¶² µ¥ÀÌÅ͸¦ ±â¾ïÇÏÁö ¸øÇÏ°í »çÀ̵å ÀÌÆåÆ®µµ ¾ø´Ù. ¿ì¸®´Â ÀоîµéÀÎ ÀڷḦ vector¿¡ ³Ö°íÀÚ ÇÑ´Ù´Â °ÍÀ» ¸í½ÉÇÏÀÚ. À̰ÍÀº ƯÁ¤ ÆÄ¼­¿¡ ¿¬°áµÈ action¿¡ ÀÇÇØ¼­ ÀÌ·ç¾îÁø´Ù. ¿¹¸¦ µé¾î¼­, ¿ì¸®°¡ ÀÚ¿¬¼ö¸¦ ÆÄ½ÌÇÒ ¶§¸¶´Ù ÆÄ½ÌµÈ ¼ýÀÚ¸¦ ÀúÀåÇÏ°í ½Í´Ù°í ÇÏÀÚ. ¿ì¸®´Â ÆÄ¼­·ÎºÎÅÍ Á¤º¸¸¦ ¾ò¾î¿À°í ½Í´Ù. Semantic actionÀÌ ±×·± ÀÏÀ» ÇÑ´Ù. Semantic actionÀº ±×·¡¸¶ÀÇ ¾îµð¿¡¶óµµ ºÙÀ» ¼ö ÀÖ´Ù. ÀÌ·± actionÀº C++ ÇÔ¼öÀ̰ųª ÇÔ¼ö°´Ã¼(functor: function object)À̸ç, ÆÄ¼­°¡ ÀÏÁ¤ºÐ·®ÀÇ ÀÔ·ÂÀ» Á¤È®È÷ ÀνÄÇÒ ¶§ ¸¶´Ù ºÒ¸°´Ù. ÆÄ¼­ P, C++ ÇÔ¼ö F°¡ ÀÖÀ» ¶§, ÆÄ¼­°¡ ÀÔ·ÂÀÌ ÀνÄÇÒ ¶§¸¶´Ù F¸¦ ÄÝÇϵµ·Ï F¸¦ ´ÙÀ½°ú °°ÀÌ ºÙÀÏ ¼ö ÀÖ´Ù.
    P[&F]
F°¡ ÇÔ¼ö°´Ã¼¶ó¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
    P[F]
ÇÔ¼ö/ÇÔ¼ö°´Ã¼ÀÇ ÇüÅ´ ºÙ¿©Áø ÆÄ¼­¿¡ ÀÇÇØ¼­ °áÁ¤µÈ´Ù. real_pÀÇ °æ¿ì ´ÜÁö ÇϳªÀÇ ÀÎÀÚ Áï ÆÄ½ÌµÈ ¼ýÀÚ ¸¸µé Àü´ÞÇÑ´Ù. °á±¹ ¿ì¸®°¡ real_p¿¡ F¸¦ ºÙÀ̰íÀÚ ÇÑ´Ù¸é ¿ì¸®´Â F¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇØ¾ß ÇÑ´Ù.
    void F(double n);

¿ì¸®ÀÇ ¿¹Á¦¿¡¼­ ¹Ì¸® Á¤ÀÇµÈ ÇÔ¼ö°´Ã¼¿Í ÇÔ¼ö°´Ã¼ »ý¼º±â(functor generator)¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ½ºÇǸ´Àº push_back_a(c)¶ó´Â ÇÔ¼ö°´Ã¼ »ý¼º±â¸¦ °¡Áö°í ÀÖ´Ù. °£´ÜÈ÷ ¸»Çؼ­ ÀÌ ÇÔ¼ö´Â ÄݵǾúÀ» ¶§ container c¿¡ ÆÄ½ÌµÈ °ªÀ» Ãß°¡ÇϰԵȴÙ.

¿Ï¼ºµÈ ÆÄ¼­ ÄÚµåÀÌ´Ù.
    bool
    parse_numbers(char const* str, vector<double>& v)
    {
        return parse(str,

            //  Begin grammar
            (
                real_p[push_back_a(v)] >> *(',' >> real_p[push_back_a(v)])
            )
            ,
            //  End grammar

            space_p).full;
    }

À§¿¡¼­ ¼³¸íÇÑ ÆÄ¼­¿Í °°Àº ÆÄ¼­¸¦ »ç¿ëÇÑ´Ù. ¿©±â¼­´Â semantic actionÀ» ºÙ¿©¼­ ¼ýÀÚ°¡ ÆÄ½ÌµÉ ¶§¸¶´Ù ±×°ÍÀ» vector v¿¡ ÀúÀåÇϵµ·Ï Çß´Ù. parse_numbersÇÔ¼ö´Â ¼º°øÇßÀ» ¶§ true¸¦ ¸®ÅÏÇÑ´Ù.

Àüü ¼Ò½ºÄÚµå´Â [http]¿©±â¼­ º¼¼ö ÀÖ´Ù.

3. ±âº» °³³ä

Àß ÀÌÇØÇØ¾ß ÇÒ ³× °¡Áö °³³äÀÌ ÀÖ´Ù. 1) ÆÄ¼­(Parser), 2) ¸ÅÄ¡(Match), 3) ½ºÄ³³Ê, 4) Semantic Action ÀÌ·± ±âº» °³³äÀº ´Ù¸¥ °Í°ú ¿¬°üµÇ¾î ÀÖ°í, °¢°¢ÀÇ ±â´ÉÀº ÇÁ·¹ÀÓ¿öÅ© Àüü¿¡ ÇϳªÀÇ Àϰü¼ºÀ» °¡Áö°í ¼¯¿©ÀÖ´Ù.


3.1. ÆÄ¼­

ÇÁ·¹ÀÓ¿öÅ©ÀÇ Áß½ÉÀº ÆÄ¼­ÀÌ´Ù. ÆÄ¼­´Â ½ºÄ³³Ê¿¡ ÀÇÇØ¼­ óÀ½ºÎÅÍ ³¡±îÁö ¼øÂ÷ÀûÀ¸·Î ÀоîÁø ¼±ÇüÀûÀÎ ÀÔ·Â ½ºÆ®¸²À» ÀνÄÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ÆÄ¼­´Â Àß Á¤ÀÇµÈ »ç¾ç Áï ±×·¡¸¶ ·ê¿¡ ÀÔ·ÂÀ» ¸ÅÄ¡ ½ÃŰ·Á°í ½ÃµµÇÑ´Ù. ¼º°øÇÏ°Ô µÇ¸é ÆÄ¼­´Â Á¤ÀÇµÈ semantic actionÀ» ¼öÇàÇÑ´Ù. ±×¸®°í semantic actionÀº ÆÄ¼­¿¡¼­ ³Ñ¾î¿Â µ¥ÀÌÅÍ¿Í ¿¬°áµÈ ÆÄ¼­ÀÇ °èÃþ ÄÁÅØ½ºÆ®(context)¿¡ µû¶ó¼­ ±¸Á¶È­µÈ Á¤º¸¸¦ »Ì¾Æ³½´Ù.

½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©´Â °£´ÜÇÑ °ÍºÎÅÍ º¹ÀâÇÑ °Í±îÁö ´Ù¾çÇÑ °ÍÀ» ÆÄ½ÌÇÒ ¼ö ÀÖ´Â pre-defineµÈ ÆÄ¼­µéÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÈ´Ù. °³³äÀ¸·Î¼­ ÆÄ¼­´Â °ø°³µÈ °³³äÀûÀÎ ÀÎÅÍÆäÀ̽º ¾àÁ¤À» °®´Â´Ù. ¾àÁ¤¿¡ µû¶ó¼­ ´©±¸¶óµµ ÇÁ·¹ÀÓ¿öÅ©ÀÇ pre-define ±¸¼º¿ä¼Ò¿Í °°ÀÌ Àß µ¿ÀÛÇÒ ¼ö ÀÖ´Â ÆÄ¼­¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ÆÄ¼­ÀÇ °³³äÀû ÀÎÅÍÆäÀ̽ºÀÇ »ó¼¼ÇÑ Á¤ÀÇ´Â ³ªÁß¿¡ ¼³ÇϰڴÙ.

ÇÁ·¹ÀÓ¿öÅ©ÀÇ »ç¿ëÀÚµéÀº ÀϹÝÀûÀ¸·Î ±×µéÀÌ ÆÄ¼­¸¦ Á÷Á¢ ÄÚµùÇÒ Çʿ䰡 ¾ø´Ù. ½ºÇǸ´Àº ´ëºÎºÐÀÇ ¹®¹ý°ú ÀÇ¹Ì ºÐ¼®À» ÇÒ ¼ö ÀÖ´Â pre-define ÆÄ¼­µéÀ» ´ë±Ô¸ð·Î °¡Áö°í ÀÖ´Ù. ´ÙÀ½ Àå¿¡¼­ ÀÌ·± ÆÄ¼­µéÀ» °ËÅäÇÒ °ÍÀÌ´Ù. Á¤ÀÇµÈ ±â´ÉÀÌ ¾ø´Â ¸Å¿ì µå¹® °æ¿ì¶ó ÇØµµ »õ·Ó°Ô »ç¿ëÀÚ°¡ ÆÄ¼­¸¦ ÀÛ¼ºÇÏ´Â °Íµµ ¾ÆÁÖ ½±´Ù. ÆÄ¼­¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ½¬¿î °ÍÀº ½ºÇǸ´ÀÇ È®Àå°¡´ÉÇÑ ±¸Á¶(extensibility)¿¡ ±âÀÎÇÑ´Ù.

3.2. ±âº»(Primitive) ÆÄ¼­¿Í Á¶ÇÕ(Composite) ÆÄ¼­


½ºÇǸ´ ÆÄ¼­µéÀº µÎ °¡Áö Ä«Å×°í¸®ÀÎ ±âº»ÆÄ¼­¿Í Á¶Çկļ­·Î ³ª´­ ¼ö ÀÖ´Ù. ÀÌ·± µÎ °¡Áö Ä«Å×°í¸®µéÀº ÆÄ½Ì ¿ë¾î¿¡¼­ terminal°ú non-terminal°ú ºñ½ÁÇÏ´Ù. ±âº»ÆÄ¼­´Â ´õ ÀÌ»ó ºÐÇØÇÒ ¼ö ¾ø´Â ´ÜÀ§ÀÌ´Ù. ¹Ý¸é¿¡ Á¶Çկļ­´Â ±âº»ÆÄ¼­³ª ´Ù¸¥ ÆÄ¼­µéÀÌ ÇÕÃÄÁø ÆÄ¼­ÀÌ´Ù. ´ÙÀ½ ½ºÇǸ´ ±¸¹®À» »ìÆìº¸ÀÚ.
    real_p >> *(',' >> real_p)
real_p´Â ÀÚ¿¬¼ö¸¦ ÆÄ½ÌÇÒ ¼ö ÀÖ´Â ±âº»ÆÄ¼­ÀÌ´Ù. ±¸¹® ¾È¿¡ ÀÖ´Â ','´Â ch_p(',')°ú °°Àº °ÍÀ¸·Î ÇϳªÀÇ Ä³¸¯Å͸¦ ÀνÄÇÒ ¼ö ÀÖ´Â ±âº» ÆÄ¼­ÀÌ´Ù.

À§ÀÇ ±¸¹®Àº ´ÙÀ½°ú °°Àº ÆÄ½ºÆ®¸®¿Í ´ëÀÀµÈ´Ù.


¾Æ·¡ÀÇ ±¸¹®À» º¸ÀÚ.
    ',' >> real_p
ÀÌ ±¸¹®Àº »õ·Î¿î ¿¬¼Ó ÆÄ¼­(sequence parser)¸¦ ±¸¼ºÇÑ´Ù. À§ÀÇ sequence ÆÄ¼­´Â ¿ÞÂÊ Æí(lhs: left hand side)ÀÇ ch_p(',')¿Í ¿À¸¥ÂÊ Æí(rhs: right hand side)ÀÇ real_p¶ó´Â µÎ °³ÀÇ ÆÄ¼­¸¦ Æ÷ÇÔÇÏ´Â Á¶ÇÕ ÆÄ¼­ÀÌ´Ù. ÀÌ Á¶ÇÕ ÆÄ¼­°¡ ºÒ¸®¸é, ¼ø¼­´ë·Î lhs¸¦ ÄÝÇϰí rhs¸¦ ÄÝÇÑ´Ù. ±×¸®°í µÎ °¡Áö ÄÝ ¸ðµÎ ¼º°øÇؾ߸¸ ¼º°øµÈ ¸ÅÄ¡¶ó´Â °ÍÀ» º¸°íÇÑ´Ù.


¿¬¼Ó ÆÄ¼­´Â ¹ÙÀ̳ʸ® Á¶Çկļ­·Î¼­ 2°³ÀÇ ÆÄ¼­·Î Á¶ÇյȴÙ. ´ÜÀÏ Á¶ÇÕ(unary composite) ¶ÇÇÑ Á¸ÀçÇÑ´Ù. ´ÜÀÏ Á¶ÇÕÀº ÇϳªÀÇ ÁÖÁ¦¸¦ À¯ÁöÇÑ´Ù. ¹ÙÀ̳ʸ® Á¶ÇÕ°ú °°ÀÌ ´ÜÀÏ Á¶ÇÕµµ Æ÷ÇÔµÈ ÁÖÁ¦¿¡ µû¶ó¼­ ÇൿÀÌ ¹Ù²ï´Ù. ÇϳªÀÇ ¿¹°¡ ¹Ù·Î º°(Kleen star)ÀÌ´Ù. ÆÄ¼­¿¡ ÀÇÇØ¼­ º°ÀÌ ºÒ¸®¸é º°¿¡ Æ÷ÇÔµÈ ÁÖÁ¦¸¦ 0ȸÀÌ»ó ºÎ¸¥´Ù. 0ȸ ÀÌ»óÀ̶ó´Â °Í ¶§¹®¿¡ º°Àº Ç×»ó ¼º°øÀûÀÎ ¸ÅÄ¡¸¦ ¸®ÅÏÇϸç NULL ½ºÆ®¸µµµ ¸ÅÄ¡ÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ ±¸¹®À» »ìÆìº¸ÀÚ.
    *(',' >> real_p)
À§ ±¸¹®Àº ¿¬¼Ó ÆÄ??kleene_star·Î °¨½Ñ °ÍÀÌ´Ù.


Àüü ±¸¹®Àº real_p ±âº» ÆÄ¼­¿Í sequence ÆÄ¼­¸¦ °¨½Ñ kleene_star ÆÄ¼­·Î ±¸¼ºµÈ´Ù.


°èÃþÀûÀ¸·Î Á¶ÇÕµÇ°í ±¸Á¶È­µÈ ¸î °³ÀÇ °£´ÜÇÑ Å¬·¡½º µéÀÌ ¸Å¿ì °­·ÂÇÑ °´Ã¼ÁöÇâÀû ¸®Ä¿½Ãºê-µð¼¾´øÆ® ÆÄ¼­ ¿£ÁøÀ» ¸¸µé¾î ³½´Ù. ÀÌ·± Ŭ·¡½ºµéÀº ´õ º¹ÀâÇÑ ÆÄ¼­¸¦ ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ÀÎÇÁ¶ó¸¦ Á¦°øÇÑ´Ù. ÃÖÁ¾ÀûÀÎ ÆÄ¼­ Á¶ÇÕÀº ¹«ÇÑ look-ahead¸¦ °®´Â non-deterministic recursive-descent parserÀÌ´Ù.

Top-down descent´Â °èÃþÀ» ¼ø¹æÇÑ´Ù. ¿Ü°¢ÀÇ sequence´Â Á¦ÀÏ ¿ÞÂÊÀº real_p ÆÄ¼­¸¦ ÄÝÇÑ´Ù. ¸¸¾à ¼º°øÇϸé kleene_starÀÌ ´ÙÀ½À¸·Î ÄݵȴÙ. kleene_star´Â ¾ÈÂÊÀÇ sequence¸¦ ¸ÅÄ¡¿¡ ½ÇÆÐÇϰųª ÀÔ·ÂÀÌ ´Ù ¼Ò¸ðµÉ ¶§±îÁö ¹Ýº¹ÀûÀ¸·Î ÄÝÇÑ´Ù. ³»ºÎ¿¡¼­´Â ch_p(',')¿Í real_p°¡ ¼ø¼­´ë·Î ÄݵȴÙ. ÆÄ½ºÄ® ¹®¹ý ´ÙÀ̾î±×·¥À» ¿¬»ó½ÃŰ´Â ¾Æ·¡ÀÇ ´ÙÀ̾î±×·¥Àº ¾î¶² ÀÏÀÌ ÀϾ´ÂÁö¸¦ ³ªÅ¸³½´Ù.


°´Ã¼ Æ÷ÇÔ°ú ¸®Ä¿ÀüÀ¸·Î ¿¬°áµÈ Á¶ÇÕÀÇ À¯¿¬ÇÔÀº ÆÄ½Ì¿¡ ´ëÇÑ ´ÜÀÏ Á¢±Ù¹ýÀ» Á¦½ÃÇÑ´Ù. ¼­ºêŬ·¡½ºµéÀº ¿¬°üÀ» Çü¼ºÇÏ´Â °Í°ú º¹ÀâÇÑ ¾Ë°í¸®Áòµé·ÎºÎÅÍ ÀÚÀ¯·Ó´Ù. º¹ÀâÇÑ ÆÄ¼­´Â ¸î °³ÀÇ ±âº» ÆÄ¼­ Ŭ·¡½ºµé·ÎºÎÅÍ Á¶ÇÕµÇ¾î »ý¼ºµÉ ¼ö ÀÖ´Ù.

ÇÁ·¹ÀÓ¿öÅ©´Â È®ÀåÇÒ ¼ö ÀÖ´Â ±¸Á¶·Î ¼³°èµÇ¾ú´Ù. »õ·Î¿î ±âº» ÆÄ¼­³ª Á¶ÇÕ ÆÄ¼­°¡, ´Ü¼øÇÑ °ÍºÎÅÍ º¹ÀâÇÑ °Í±îÁö ¾ðÁ¦³ª Ãß°¡µÉ ¼ö ÀÖ´Ù. Á¶ÇյǴ °ÍÀº ÄÄÆÄÀÏ Å¸ÀÓ¿¡ Á¤ÀûÀ¸·Î ÀϾ´Ù. À̰ÍÀº C++ expression template¿Í template ¸ÞŸ ÇÁ·Î±×·¡¹ÖÀÇ À¯¿¬¼º ¶§¹®¿¡ °¡´ÉÇÏ´Ù.

°á°ú´Â ±âº» ÆÄ¼­¿Í ÀÛÀº Á¶ÇÕµéÀÌ Á¶ÇÕµÈ Á¶ÇÕ ÆÄ¼­ÀÌ´Ù. ÀÌ·± Æ÷ÇÔ Àü·«Àº ¿Ïº®ÇÑ EBNF±¸¹®À» ¸ðµ¨¸µ ÇÒ ¼ö ÀÖ´Â °èÃþ ±¸Á¶¸¦ ¸¸µé ¼ö ÀÖ´Â ´É·ÂÀ» ÁØ´Ù. ³ªÁß¿¡ ´õ ¸¹Àº ±âº» ÆÄ¼­¿Í Á¶ÇÕ ÆÄ¼­ Á¦ÀÛ¿ë ºí·ÏµéÀ» º¸¿©ÁÖ°Ú´Ù.

3.3. ½ºÄ³³Ê

ÆÄ¼­¿Í °°ÀÌ ½ºÄ³³Ê´Â Ãß»óÀûÀº °³³äÀÌ´Ù. ½ºÄ³³ÊÀÇ ÀÛ¾÷Àº ÆÄ¼­¿¡°Ô Á¦°øµÇ´Â ¼øÂ÷ÀûÀÎ ÀÔ·Â ½ºÆ®¸²À» Á¦°øÇÏ´Â °ÍÀÌ´Ù. ½ºÄ³³Ê´Â first¿Í last¶ó´Â 2°³ÀÇ STL forward iterator·Î ±¸¼ºµÈ´Ù. ¿©±â¼­ first´Â ·¹ÆÛ·±½ºÀ̰í last¸¦ °ªÀÌ´Ù. First iterator´Â ÆÄ¼­¿¡ ÀÇÇØ¼­ À§Ä¡¸¦ º¯È­½Ãų ¼ö ÀÖ´Â ·¹ÆÛ·±½º¸¦ °¡Áö°í ÀÖ´Ù. Á¤Ã¥ÀÇ ÁýÇÕ¿¡ ÀÇÇØ¼­ ½ºÄ³³ÊÀÇ ÇൿÀÌ ÅëÁ¦µÈ´Ù. ÆÄ¼­´Â ½ºÄ³³Ê·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃßÃâÇØ¿Í¼­ ½ºÄ³³ÊÀÇ ¸É¹öÇÔ¼ö¿¡ ÀÇÇØ¼­ iterator¸¦ À§Ä¡½ÃŲ´Ù.

½ºÄ³³Ê Á¤Ã¥µéÀÇ º¹ÀâÇÔÀº ´ëºÎºÐÀÇ °æ¿ì ¸ô¶óµµ µÈ´Ù. ÇÏÁö¸¸ ½ºÄ³³ÊÀÇ ±âº» API¿¡ ´ëÇÑ Áö½ÄÀº ¿ÏÀüÇÑ ½ºÇǸ´ ÆÄ¼­¸¦ ÀÛ¼ºÇϴµ¥ ÇÊ¿äÇÏ´Ù. ½ºÄ³³Ê API´Â ´Ù¸¥ ¼½¼Ç¿¡¼­ °³·«ÀûÀ¸·Î º¸¿©ÁÙ °ÍÀÌ´Ù. Ãß°¡ÀûÀ¸·Î ÆÄ¿ö À¯Àú¸¦ À§Çؼ­ ½ºÄ³³Ê Á¤Ã¥À» ¼³¸íÇÒ °ÍÀÌ´Ù. ½ºÄ³³Ê Á¤Ã¥Àº ½ºÇǸ´À» ¸Å¿ì À¯¿¬Çϰí È®Àå °¡´ÉÇÑ ±¸Á¶·Î ¸¸µç´Ù. ¿¹¸¦ µé¾î ¾î¶² Á¤Ã¥µéÀº µ¥ÀÌÅ͸¦ ÇÊÅ͸µ ÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î »ç¿ëµÇ´Â ½ºÄ³³Ê Á¤Ã¥ÀÇ ¿¹´Â ´ë¼Ò¹®ÀÚ ±¸º° ¾ø´Â ÀÔ·ÂÀ» À§Çؼ­ ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ´Ù¸¥ ½ºÄ³³Ê Á¤Ã¥ ¿¹´Â ÀÔ·ÂÀ¸·ÎºÎÅÍ °ø¹éÀ» Á¦°ÅÇÏ´Â °ÍÀÌ´Ù.

3.4. ¸ÅÄ¡

ÆÄ¼­´Â ½ºÄ³³Ê·ÎºÎÅÍ ¾ò¾î¿À´Â ¸â¹ö ÇÔ¼ö¿Í ¸ÅÄ¡µÇ´Â °´Ã¼¸¦ ¸®ÅÏÇÏ´Â ¸â¹öÇÔ¼ö¸¦ °®´Â´Ù. ¸ÅÄ¡ °´Ã¼¸¦ À§ÇÑ ±âº» ÇÔ¼ö´Â ÆÄ½ÌÀÇ ¼º°øÀ» ÆÄ¼­ÀÇ ÄÝ·¯¿¡°Ô º¸°íÇϱâ À§ÇÑ °ÍÀÌ´Ù. Áï ÆÄ½Ì ÇÔ¼ö°¡ ¼º°øÇϸé true¸¦, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ °è»êÇØ³½´Ù. ¸¸¾à ÆÄ½ÌÀÌ ¼º°øÇÏ¸é ¸ÅÄ¡ °´Ã¼·ÎºÎÅÍ ¸ÅÄ¡µÇ´Â ij¸¯ÅÍÀÇ ±æÀ̸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. (match.length()¸¦ »ç¿ëÇÑ´Ù.) ±æÀÌ´Â ¸ÅÄ¡°¡ ¼º°øÇÑ´Ù¸é À½ÀÌ ¾Æ´Ñ °ªÀ» °®´Â°í ½ÇÆÐÇÒ °æ¿ì´Â ÀϹÝÀûÀ¸·Î -1À» °®´Â´Ù. ±æÀ̰¡ 0ÀÏ °æ¿ìµµ Á¤È®ÇÑ ÀÔ·ÂÀÌ¸ç ¼º°øÀûÀÎ ¸ÅÄ¡¸¦ Ç¥ÇöÇÑ´Ù.

ÆÄ¼­´Â ´ëÀÀµÇ´Â ¼Ó¼º µ¥ÀÌÅ͸¦ °®´Â´Ù. ¿¹¸¦ µé¾î real_p ÆÄ¼­´Â ´ëÀÀµÇ´Â ¼ýÀÚ µ¥ÀÌÅ͸¦ °®´Â´Ù. ÀÌ ¼Ó¼ºÀº ÆÄ½ÌµÈ ¼ýÀÚÀÌ´Ù. ¼Ó¼ºÀº ¸®ÅÏµÈ ¸ÅÄ¡ °´Ã¼·Î Àü´ÞµÈ´Ù. ¸ÅÄ¡ °´Ã¼·ÎºÎÅÍ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ÀÌ µ¥ÀÌÅÍ´Â ¸ÅÄ¡°¡ ¼º°øÇßÀ» ¶§¸¸ À¯¿äÇÏ´Ù.

3.5. Semantic Action

Á¶ÇÕ ÆÄ¼­´Â °èÃþÀ» Çü¼ºÇÑ´Ù. ÆÄ½ÌÀº °¡Àå À§ÂÊÀÇ ºÎ¸ð ÆÄ¼­·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù. ±× ÆÄ¼­´Â ÆÄ½Ì ÀÓ¹«¸¦ ÀÚ½ÅÀÇ ÀÚ½Ä ÆÄ¼­¿¡°Ô À§ÀÓÇÏ°í ¹èºÐÇÑ´Ù. ÀÌ·± °úÁ¤À» ±âº» ÆÄ¼­¿¡ µµ´ÞÇÒ ¶§±îÁö ¸®Ä¿½ÃºêÇÏ°Ô ¹Ýº¹ÇÑ´Ù. Semantic actionÀ» ÀÌ·± °èÃþÀÇ ´Ù¾çÇÑ À§Ä¡¿¡ ºÙÀÌ´Â °ÍÀ» ÅëÇØ ´ÜÁ¶·Î¿î ÀÔ·ÂÀ» ±¸Á¶È­µÈ Ç¥ÇöÀ¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. À̰ÍÀÌ ÆÄ¼­°¡ ÇÏ´Â ÀÏÀÇ ÇÙ½ÉÀÌ´Ù.

À§¿¡¼­ »ç¿ëÇÑ ¿¹¸¦ ´Ù½Ã Çѹø »ìÆìº¸ÀÚ.
    real_p >> *(',' >> real_p)
real_p ÆÄ¼­¸¦ À§ÇÑ ÇÔ¼ö(¶Ç´Â ÇÔ¼ö°´Ã¼)¸¦ °É¾î³õ´Â °ÍÀ» ÅëÇØ¼­ ¿ì¸®´Â ÀÔ·ÂÀ¸·ÎºÎÅÍ ¼ýÀÚ¸¦ »Ì¾Æ¿Ã ¼ö ÀÖ´Ù.
    real_p[&f] >> *(',' >> real_p[&f])


¿©±â¼­ f´Â ÇϳªÀÇ ÀÎÀÚ¸¦ °®´Â ÇÔ¼öÀÌ´Ù. [&f]´Â real_p°¡ À¯È¿ÇÑ ¼ýÀÚ¸¦ ÀνÄÇßÀ» ¶§ f°¡ ÄÝµÇ°Ô ÇÑ´Ù. ¾î¶² ÀÛ¾÷À» ¼öÇàÇÒ Áö´Â ÇÔ¼ö¿¡ ´Þ·Á ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ ¹éÅÍ¿¡ µé¾î°¥ ¼ýÀÚ°¡ µÉ ¼ö ÀÖ´Ù. ¸¸¾à ±×·¡¸¶¿¡¼­ ','À» '+'·Î º¯°æÇؼ­ ¿ì¸®´Â Çհ踦 °è»êÇÏ´Â ´Ü¼ø °è»ê±â·Î Á¤ÀÇÇÑ´Ù¸é, ÇÔ¼ö f´Â ÀÔ·ÂµÈ ¼ýÀÚ¸¦ ´õÇÏ´Â ±â´ÉÀ¸·Î ¸¸µé¾î¾ß ÇÑ´Ù.

4. ±¸Á¶

ÇÁ·¹ÀÓ¿öÅ©´Â Àß ¸ðµâÈ­ µÇ¾îÀÖ°í ·¹À̾îµé·Î ±¸¼ºµÇ¾î ÀÖ´Ù.

iteratoractor

debug

attributedynamicerror_handlingsymbolstreeutility

meta

core
scannerprimitivescompositenon_terminal

½ºÇǸ´Àº 4°³ÀÇ ·¹À̾ µ¶¸³ÀûÀÎ ÃÖ»óÀ§ ·¹À̾ Ãß°¡µÈ ÇüŸ¦ °®´Â´Ù. actor°ú iteratorÀ» °®´Â µ¶¸³ ·¹À̾î´Â ´Ù¸¥ °èÃþ¿¡ Á¾¼ÓµÇÁö ¾Ê´Â´Ù. ÇÁ·¹ÀÓ¿öÅ©ÀÇ ±¸Á¶´Â ¿ÏÀüÈ÷ orthogoanlÇÏ´Ù. ·¹À̾ÀÇ °ü°è´Â ¼øÈ¯Á¾¼ÓÀÌ ¾ø´Ù. ÇÏÀ§ ·¹À̾îµéÀº »óÀ§ ·¹À̾ Á¾¼ÓµÇÁö ¾Ê´Â´Ù. °°Àº ·¹À̾ ÀÖ´Â ¸ðµâµéµµ ¼­·Î¼­·Î¿¡ Á¾¼ÓµÇÁö ¾Ê´Â´Ù.

»ç¿ëÀÚ´Â ÄÄÆÄÀÏ Å¸ÀÓÀ̳ª ·±Å¸ÀÓ ºÎÇϸ¦ ÃÊ·¡ÇÏÁö ¾Ê°í ¿øÇÏ´Â ¸ðµâµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÃÖ¼ÒÇÑÀÇ °æ¿ì´Â core¸¸ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. core´Â ¸Å¿ì À¯¿ëÇÏ´Ù. core´Â ¸Å¿ì ÀÛÀº ±Ô¸ðÀÇ ÆÄ½Ì ÀÛ¾÷¿¡ ÀÌ¿ëÇϱâ ÀûÇÕÇÏ´Ù.

iterator ¸ðµâÀº ½ºÇǸ´°ú´Â µ¶¸³ÀûÀÌ¸ç ½ºÇǸ´ÀÌ ¾Æ´Ñ ¾îÇø®Ä³À̼ǿ¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ¸ðµâÀº standalone iterator µé°ú ½ºÇǸ´°ú ȣȯÀ» À§ÇÑ iterator wrapper·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÌ iteratorµéÀº ½ºÇǸ´ÀÇ ÆÄ½Ì °úÁ¤¿¡¼­ À¯¿ëÇÏ°Ô »ç¿ëµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

actor ¸ðµâ ¿ª½Ã ½ºÇǸ´°ú´Â µ¶¸³ÀûÀÎ ¸ðµâ·Î¼­ ÀϹÝÀûÀÎ semantic ÀÛ¾÷ 󸮸¦ À§Çؼ­ »ç¿ëÇÏ´Â predefined semantic actionµé·Î ÀÌ·ç¾îÁ® ÀÖ´Ù.

debug ¸ðµâÀº ÆÄ¼­ µð¹ö±ëÀ» À§ÇÑ ¶óÀ̺귯¸®ÀÌ´Ù. ÀÌ ¸ðµâÀº ÇÊ¿äÇÒ °æ¿ì core¿¡ Åõ¸íÇÏ°Ô °ü¿©ÇÑ´Ù.

attribute ¸ðµâÀº ¹ßÀüµÈ semantic actionÀ» Á¦°øÇÑ´Ù. ÀÌ ¸ðµâÀº ÆÄ¼­ °èÃþ ±¸Á¶ »çÀÌ¿¡¼­ »ó¼ÓµÇ°Å³ª Á¶ÇÕµÈ ¼Ó¼ºµéÀ» À§ ¾Æ·¡·Î Àü´ÞÇϰí ÃßÃâÇÏ´Â °ÍÀ» µµ¿ÍÁØ´Ù. ¼Ó¼ºÀº ÆÄ½ÌÀ» Á¦¾îÇϴµ¥µµ »ç¿ëµÉ ¼ö ÀÖ´Ù. Parametric ÆÄ¼­´Â ¼öÇà Áß ¼Ó¼ºÀ̳ª µ¥ÀÌÅÍ °ª¿¡ µû¶ó¼­ ÀÚ½ÅÀÇ ÇൿÀ» º¯°æÇÏ´Â ´ÙÀ̳ª¹Í ÆÄ¼­ÀÇ ÇüŸ¦ °®´Â´Ù.

dynamic ¸ðµâÀº ·±Å¸ÀÓ¿¡ ÇൿÀÌ º¯°æµÉ ¼ö ÀÖ´Â ÆÄ¼­¿¡ »ç¿ëµÈ´Ù.

error_handling. ÇÁ·¹ÀÓ¿öÅ©´Â ¿¡·¯ Çڵ鸵 ¾øÀÌ´Â ¿ÏÀüÇÏÁö ¾Ê´Ù. C++ÀÇ ¿¹¿Ü Çڵ鸵 ±¸Á¶´Â ½ºÇǸ´ÀÇ ³ôÀº ¼öÁØÀÇ ¸®Ä¿½Ãºê ÇÔ¼ö¿¡ ÀûÇÕÇÏ´Ù. C++ ExceptionÀÌ ÀÌ ¸ðµâ¿¡¼­ È®ÀåµÇ¾î¼­ ¿¡·¯ 󸮸¦ À§Çؼ­ »ç¿ëµÈ´Ù.

symbol ¸ðµâÀº ½Éº¼ Å×À̺íÀÇ °ü¸®¸¦ À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ ¸ðµâÀº Áö±ÝÀº ¾ÆÁÖ ±âÃÊÀûÀÎ ¼öÁØÀÌ´Ù. ¸ñÇ¥´Â C++ ÇüÅÂÀÇ ´ÙÁß ½ºÄÚÇÁ ¹æ½ÄÀ» ¼ö¿ëÇÒ ¼ö ÀÖ´Â ¼­ºê ÇÁ·¹ÀÓ¿öÅ©(sub-framework)¸¦ ¸¸µå´Â °ÍÀÌ´Ù. C++Àº ½ºÄÚÇÁ¿¡¼­´Â ¾î¶² ´Ù¸¥ ·©±ÍÁö¿¡¼­µµ ÇÊÀûÇÒ ¼ö ¾ø´Â º¹Àâµµ¸¦ °®´Â ÈǸ¢ÇÑ ¸ðµ¨ÀÌ´Ù. Ŭ·¡½ºµé°ú »ó¼Ó, private, protected, public¿Í °°Àº Á¢±Ù Á¦ÇÑ, friend, namespace, declarationÀÇ »ç¿ë, directiveÀÇ »ç¿ë µîÀÌ C++ ½ºÄÚÇÁ¿¡ ÇØ´çÇÑ´Ù. ÇöÀç ½Éº¼ Å×À̺íÀÇ ±â´ÉÀº C++ ½ºÄÚÇÁ¸¦ ¸ðµ¨¸µÇϱâ À§ÇÑ ¿ÏÀüÇÑ ±â´ÉÀÇ ±âÃʺκÐÀÌ µÉ °ÍÀÌ´Ù.

ÆÄ½º Æ®¸®¿Í AST(Abstract Syntax Tree)¸¦ ¸¸µå´Â °ÍÀº tree ¸ðµâ¿¡ ÀÇÇØ¼­ 󸮵ȴÙ. ÆÄ½º Æ®¸®³ª AST´Â semantic action¿¡ ºñÇØ¼­ ´ÙÀ½°ú °°Àº ÀåÁ¡µéÀÌ ÀÖ´Ù. ÀÔ·ÂÀ» ´Ù½Ã ÆÄ½ÌÇÏÁö ¾Ê°íµµ ¿©·¯ ¹øÀÇ µ¥ÀÌÅÍ Àü´ÞÀ» ÇÒ ¼ö ÀÖ´Ù. Æ®¸®¿¡¼­ º¯È¯À» ½ÃµµÇÒ ¼öµµ ÀÖ´Ù. ¼Ó¼ºÀ» ÅëÇØ¼­´Â óÀ½ºÎÅÍ ³¡À¸·Î ó¸®ÇØ¾ß ÇÏÁö¸¸, Æ®¸®¸¦ ÀÌ¿ëÇÏ¸é ¿øÇÏ´Â ¼ø¼­´ë·Î ¾î¶² °ªÀ» °è»êÇÒ ¼ö ÀÖ´Ù. ¾Ö¸Å¸ðÈ£ÇÑ ±×·¡¸¶¿¡¼­ ³ªÅ¸³¯ ¼ö ÀÖ´Â ¹éÆ®·¡Å·À̳ª »çÀ̵å ÀÌÆåÆ®¿¡ ´ëÇØ¼­ ½Å°æ¾µ Çʿ䰡 ¾ø´Ù.

utility ¸ðµâÀº ÀϹÝÀûÀ¸·Î À¯¿ëÇÑ ÆÄ¼­µé°ú ¸®½ºÆ® ÀÛ¾÷À̳ª ÁÖ¼®, confix expressionµîÀÇ ÀÛ¾÷ÀÇ Ã³¸®¿¡ À¯¿ëÇÑ Áö¿ø Ŭ·¡½ºµéÀÇ ¸ðÀ½ÀÌ´Ù.

meta ¸ðµâÀº °í±Þ ½ºÇǸ´ ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ ¸ÞŸÇÁ·Î±×·¡¹Ö ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ ¸ðµâÀº ½ºÇǸ´ ÆÄ¼­ÀÇ ÄÄÆÄÀÏŸÀÓÀ̳ª ·±Å¸ÀÓ ÀÚ°¡ Á¡°ËÀ» ¿ëÀÇÇÏ°Ô ÇÑ´Ù.

5. Core

5.1. Primitives


ÇÁ·¹ÀÓ¿öÅ©´Â predefineµÈ ±âº» ÆÄ¼­µéÀ» °®°í ÀÖ´Ù. À̰͵éÀº »ç¿ëÀÚ°¡ º¹ÀâÇÑ ÆÄ¼­¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÇ´Â °¡Àå ±âÃÊÀûÀÎ Á¦ÀÛ ´ÜÀ§ÀÌ´Ù. ±âº» ÆÄ¼­µéÀº ¸Å¿ì À¯¿¬ÇÏ°Ô ¸¸µé¾îÁø ÅÛÇø®Æ® Ŭ·¡½ºµéÀÌ´Ù.

±âº» ÆÄ¼­µéÀº Á÷Á¢À̳ª ÇïÆÛ ÇÔ¼öµéÀ» ÅëÇØ¼­ ÀνºÅº½ºÈ­ µÈ´Ù. ÀϹÝÀûÀ¸·Î ÇïÆÛ ÇÔ¼öµéÀÌ »ç¿ëÇϱ⠴õ ½±´Ù.

Áö±Ý±îÁö´Â ch_p¸¦ ¹®ÀÚ ÆÄ½Ì ÇÔ¼ö·Î ¾Ë¾Æ¿ÔÀ¸³ª »ç½Ç ÆÄ¼­ »ý¼º ÇÔ¼öÀÌ´Ù. Ŭ·¡½º chlit<CharT>°¡ ¹®ÀÚ ÆÄ½Ì ÇÔ¼öÀÇ µÚÂÊ¿¡ ÀÖ´Â ½ÇÁ¦ ÅÛÇø´ Ŭ·¡½ºÀÌ´Ù. chilt°´Ã¼¸¦ ÀνºÅϽºÈ­ ÇÏ·Á¸é ÅÛÇø®Æ® ÀÎÀڷμ­ ij¸¯ÅÍÀÇ Å¸ÀÔÀ» °áÁ¤Çϱâ À§ÇÑ CharT¸¦ Á¦°øÇØ Áà¾ß ÇÑ´Ù. º¸Åë ÀÌ Å¸ÀÔÀº ÀÔ·ÂÀÇ Å¸ÀÔ°ú ´ëÀÀµÇ¸ç, ÀϹÝÀûÀ¸·Î charÀ̳ª wchar_t°¡ »ç¿ëµÈ´Ù. ´ÙÀ½ÀÇ ±¸¹®Àº ÇϳªÀÇ ±ÛÀÚ 'X'¸¦ ÀνÄÇÏ´Â Àӽà ÆÄ¼­ °´Ã¼¸¦ ¸¸µç´Ù.

    chlit<char>('X');

chiltÀÇ »ý¼º ÇÔ¼öÀÎ ch_p¸¦ »ç¿ëÇÏ´Â °ÍÀº chilt<> Ŭ·¡½ºÀÇ »ç¿ëÀ» ´Ü¼øÈ­ÇÑ´Ù. (ÀÌ ³»¿ëÀº ´ëºÎºÐÀÇ ÆÄ¼­ Ŭ·¡½º¿¡µµ Àû¿ëµÈ´Ù. ±× ÀÌÀ¯´Â ´ëºÎºÐÀÇ ½ºÇǸ´ ÆÄ¼­ Ŭ·¡½ºµéÀÌ ´ëÀÀµÇ´Â »ý¼º ÇÔ¼ö¸¦ °¡Áö°í Àֱ⠶§¹®ÀÌ´Ù.) ÄÄÆÄÀÏ·¯°¡ ÀÎÀÚ Ãß·ÐÀ» ÅëÇØ¼­ ÅÛÇø®Æ® ŸÀÔÀ» Ãß·ÐÇϱ⠶§¹®¿¡ ÇÔ¼ö¸¦ ÄÝÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. À§ÀÇ ¿¹Á¦¸¦ ch_p ÇïÆÛ ÇÔ¼ö¸¦ ÅëÇØ¼­ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.
    ch_p('X')  // equivalent to chlit<char>('X') object

 ÆÄ¼­ »ý¼º±â
    ÆÄ¼­ »ý¼º ÇÔ¼ö¸¦ ÄÝÇÏ´Â °ÍÀº ÆÄ¼­ ÀÚü¸¦ »ç¿ëÇÏ´Â °Í°ú µ¿ÀÏÇÏ´Ù. 
    ¿Ö³ÄÇϸé ch_p ¹®ÀÚ ÆÄ¼­¸¦ ÄÝ ÇÒ ¶§ ¸¶´Ù ÆÄ¼­¸¦ »ý¼ºÇϱ⠶§¹®ÀÌ´Ù.

´ÙÀ½ÀÇ ÀοëµÈ ±×·¡¸¶´Â ÀÌ·± °ÍÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö¸¦ º¸¿©ÁØ´Ù.
    // a rule can "store" a parser object.  They're covered
    // later, but for now just consider a rule as an opaque type
    rule<> r1, r2, r3;

    chlit<char> x('X');     // declare a parser named x

    r1 = chlit<char>('X');  //  explicit declaration
    r2 = x;                 //  using x
    r3 = ch_p('X')          //  using the generator

5.1.1. chlit¿Í ch_p

ÇϳªÀÇ ¹®ÀÚ¸¦ ¸ÅÄ¡ÇÑ´Ù. chilt´Â ÇϳªÀÇ Å¸ÀÔ ÀÎÀÚ¸¦ °®´Â ÅÛÇø®Æ®·Î ±âº» ÀÎÀڷμ­ char¸¦ °®´Â´Ù. (Áï chilt<>´Â chilt<char>¿Í µ¿ÀÏÇÏ´Ù.) ÀÌ Å¸ÀÔ ÀÎÀÚ´Â ÆÄ½ÌÇÒ ¶§ ÀνÄÇÒ ÀÎÀÚÀÇ Å¸ÀÔÀÌ´Ù. »ý¼º ÇÔ¼ö¿¡¼­´Â ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ÅëÇØ¼­ ÅÛÇø®Æ®ÀÇ Å¸ÀÔ ÀÎÀÚ¸¦ Ãß·ÐÇÑ´Ù. chilt Ŭ·¡½º »ý¼ºÀÚ´Â ÇϳªÀÇ ÀÎÀÚ¸¦ ¹Þ´Â´Ù. »ý¼ºÀÚ ÀÎÀÚ´Â ÀԷ¿¡ ¸ÅÄ¡µÉ ¹®ÀÚÀÌ´Ù. ¿¹:
    r1 = chlit<>('X');
    r2 = chlit<wchar_t>(L'X');
    r3 = ch_p('X');
¿ø·¡ÀÇ ¿¹·Î µ¹¾Æ°¡ º¸ÀÚ.
    group = '(' >> expr >> ')';
    expr1 = integer | group;
    expr2 = expr1 >> *(('*' >> expr1) | ('/' >> expr1));
    expr  = expr2 >> *(('+' >> expr2) | ('-' >> expr2));
¿©±â¼­ ±×·¡¸¶ ¾ÈÀÇ ¹®ÀÚ '(', ')', '+', '-', '*', '/'´Â implicitÇÏ°Ô chilt °´Ã¼¸¦ ¼±¾ðÇÑ´Ù.

 char ¿ÀÆÛ·£µå(operand)
    À§ÀÇ ¿¹Á¦´Â (char, ParserT)³ª (ParserT, char)¸¦ ¹Þ´Â >> ¿¬»êÀÚÀÇ ¿À¹ö·Îµå¸¦ ¸¸µç´Ù.
    ÀÌ ÇÔ¼öµéÀº char¸¦ chilt°´Ã¼·Î ¹Ù²Û´Ù.

´ÙÀ½°ú °°ÀÌ ¸íÈ®ÇÏ°Ô ¼±¾ðÇØ¼­ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.
    chlit<> plus('+');
    chlit<> minus('-');
    chlit<> times('*');
    chlit<> divide('/');
    chlit<> oppar('(');
    chlit<> clpar(')');

5.1.2. range¿Í range_p

¹®ÀÚÀÇ range´Â ³·°í ³ôÀº ¹®ÀÚÀÇ ½ÖÀ¸·ÎºÎÅÍ »ý¼ºµÈ´Ù. rangeÆÄ¼­´Â ¾ç³¡À» Æ÷ÇÔÇÑ ¹üÀ§¿¡ ÀÖ´Â ÇϳªÀÇ Ä³¸¯Å͸¸À» ¸ÅÄ¡ÇÑ´Ù. chilt¿Í ¸¶Âù°¡Áö·Î char¸¦ ±âº» °ªÀ¸·Î ÇÏ´Â ÇϳªÀÇ ÅÛÇø®Æ® ŸÀÔ ÀÎÀÚ¸¦ °®´Â´Ù. rangeŬ·¡½ºÀÇ »ý¼ºÀÚ´Â 2°³ÀÇ ÀÎÀÚ¸¦ °®´Â´Ù. 2°³ÀÇ ÀÎÀÚ´Â ½ÃÀÛ°ú ³¡ÀÇ ¹®ÀÚ ¹üÀ§¸¦ ³ªÅ¸³»¸ç ³ªÁß¿¡ ÀԷ¿¡ ¸ÅÄ¡°¡ µÈ´Ù. »ý¼º ÇÔ¼ö´Â range_pÀÌ´Ù. ¿¹:
    range<>('A','Z')    // matches 'A'..'Z'
    range_p('a','z')    // matches 'a'..'z'
³»ºÎ ¹®ÀÚ ÀÎÄÚµù¿¡¼­ ù¹øÂ° ¹®ÀÚ´Â µÎ¹øÂ° ¹®ÀÚº¸´Ù ÀÛÀº °ÍÀ̾î¾ß ÇѴٴµ¥ ÁÖÀÇÇÏÀÚ. range´Â chilt¿Í ¸¶Âù°¡Áö·Î single character ÆÄ¼­ÀÌ´Ù.

 ¹®ÀÚ ¸ÅÇÎ
   ¹®ÀÚ ¸ÅÇÎÀº Ç÷§Æû¿¡ Á¾¼ÓÀûÀÌ´Ù. 
   ¿¹¿¡¼­ »ç¿ëÇÑ 'A' < 'Z'°¡ º¸ÀåµÇ´Â °ÍÀº ¾Æ´Ï´Ù. 
   ÇÏÁö¸¸ ´ëºÎºÐÀÇ °æ¿ì ASCII, ISO-8859-1, UnicodeµîÀ» »ç¿ëÇÑ´Ù. 
   ´Ù¸¥ Ç÷§Æû¿¡¼­ »ç¿ëÇÒ ¶§´Â ÁÖÀÇÇÏÀÚ.

5.1.3. strlit¿Í str_p

ÀÌ ÆÄ¼­´Â ÇϳªÀÇ ½ºÆ®¸µÀ» ¸ÅÄ¡ÇÑ´Ù. strlit´Â iterator ŸÀÔÀÇ ÅÛÇø®Æ® ŸÀÔ ÀÎÀÚ ÇÑ °³¸¦ °®´Â´Ù. ³»ºÎÀûÀ¸·Î strlit´Â ½ºÆ®¸µÀ» °¡¸®Å°´Â begin/end iterator ½ÖÀ» À¯ÁöÇÑ´Ù. strlit´Â ÇöÀç ÀÔ·Â ½ºÆ®¸²°ú ÀÌ ¹®ÀÚ¿­°úÀÇ ¸ÅÄ¡¸¦ ½ÃµµÇÑ´Ù. ±âº» ÅÛÇø®Æ® ŸÀÔ ÀÎÀÚ´Â char const *ÀÌ´Ù. strlt´Â 2°¡Áö »ý¼ºÀÚ¸¦ °®´Â´Ù. ù¹øÂ°´Â null-terminated character pointerÀÌ´Ù. ÀÌ »ý¼ºÀÚ´Â strlit¸¦ ""·Î ¸¸µé¾îÁø ¹®ÀÚ¿­¿¡¼­ ¸¸µé ¶§ »ç¿ëÇÑ´Ù. µÎ¹øÂ° »ý¼ºÀÚ´Â first/last iterator ½ÖÀ» ¹Þ´Â´Ù. »ý¼º ÇÔ¼ö´Â str_pÀÌ´Ù. ¿¹:
    strlit<>("Hello World")
    str_p("Hello World")

    std::string msg("Hello World");
    strlit<std::string::const_iterator>(msg.begin(), msg.end());

 ¹®ÀÚ ´ÜÀ§¿Í ±¸¹® ´ÜÀ§ ÆÄ½Ì
    ÀϹÝÀûÀÎ ÆÄ¼­´Â ¹®ÀÚ(ÇϳªÀÇ ´Ü¾î¸¦ ÀÌ·ç´Â ±âÈ£)¿Í ¹®Àå(¹®ÀåÀ» ÀÌ·ç´Â ´Ü¾îµé)ÀÇ Ã³¸®¸¦ º°µµÀÇ ¿µ¿ªÀ¸·Î Ãë±ÞÇÑ´Ù. 
    ¿¹¾à¾î³ª ¿¬»êÀÚ, ½ºÆ®¸µ, ¼ýÀÚ »ó¼ö µî°ú °°Àº ±×·¡¸¶ÀÇ terminal·Î »ç¿ëµÇ´Â ¿ä¼ÒµéÀº º¸Åë lexical analysis ´Ü°è¿¡¼­ ¸ÕÀú ÃßÃâµÇ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù.

    ¿ì¸®°¡ Áö±Ý±îÁö »ìÆìº» ¿¹¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, ÀϹÝÀûÀÎ ÆÄ¼­¿Í´Â ´Ù¸£°Ô ½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©´Â ¹®ÀÚ ´ÜÀ§³ª ±¸¹® ´ÜÀ§³ª °°ÀÌ Ã³¸®ÇÑ´Ù. 
    ½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©¿¡¼­´Â lexical analyzer°¡ ¿Ïº®ÇÏ°Ô ÅëÇյǾî ÀÖ´Ù. 

    ½ºÇǸ´ ÆÄ¼­ ¶óÀ̺귯¸®¿¡¼­´Â ºÐ¸®µÈ lexical analyzer°¡ ºÒÇÊ¿äÇÏÁö¸¸, ¹Ýµå½Ã »ç¿ëÇÏÁö ¾ÊÀ» ÇÊ¿ä´Â ¾ø´Ù. Çʿ信 µû¶ó¼­´Â ¿©·¯ °³ÀÇ ÆÄ½Ì ´Ü°è¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. 
    Preprocessor, lexical analyzer, ÆÄ¼­¸¦ »ý¼ºÇÏ°í °°Àº ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ¸ðµÎ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.


5.1.4. chseq¿Í chseq_p

¹®ÀÚ¸¦ ¼ø¼­´ë·Î ¹Þ¾ÆµéÀδÙ. chseq´Â strlit¿Í °°Àº ÅÛÇø®Æ® ŸÀÔ ÀÎÀÚ¸¦ »ç¿ëÇÑ´Ù. »ý¼º ÇÔ¼ö´Â chseq_pÀÌ´Ù. ¿¹:
    chseq<>("ABCDEFG")
    chseq_p("ABCDEFG")

strlit´Â ¹®ÀÚ ´ÜÀ§·Î µ¿ÀÛÇÑ´Ù. ¹Ý¸é¿¡ chseq´Â ¹®ÀÚ ´ÜÀ§¿Í ±¸¹® ´ÜÀ§ÀÇ ¾çÂÊ ¸ðµÎ·Î µ¿ÀÛÇÑ´Ù. ´Ü¼øÈ÷ ¾ê±âÇÏ¸é ½ºÆ®¸µ¿¡ Á¸ÀçÇÏ´Â °ø¹éÀ» ¹«½ÃÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹:
    chseq<>("ABCDEFG")
À̰ÍÀº ¾Æ·¡ÀÇ ¹®ÀÚ¿­µéÀ» ÆÄ½ÌÇÒ ¼ö ÀÖ´Ù.
    ABCDEFG
    A B C D E F G
    AB CD EFG

5.1.5. ±âŸ ¹®ÀÚ ÆÄ¼­µé

½ºÇǸ´¿¡¼­´Â ¸ðµç single character ÆÄ¼­µéÀ» Á¤ÀÇÇϰí ÀÖ´Ù.

Single character ÆÄ¼­µé
anychar_p Matches any single character (including the null terminator: '\0')
alnum_p Matches alpha-numeric characters
alpha_p Matches alphabetic characters
blank_p Matches spaces or tabs
cntrl_p Matches control characters
digit_p Matches numeric digits
graph_p Matches non-space printing characters
lower_p Matches lower case letters
print_p Matches printable characters
punct_p Matches punctuation symbols
space_p Matches spaces, tabs, returns, and newlines
upper_p Matches upper case letters
xdigit_p Matches hexadecimal digits

5.1.6. negation ~

chlit, range, anychar_p, alnum_pµé°ú °°Àº single character ÆÄ¼­´Â ºÎÁ¤(negate)µÉ ¼ö ÀÖ´Ù. ¿¹:
    ~ch_p('x')
À§ÀÇ ¿¹´Â 'x'¸¦ Á¦¿ÜÇÑ ¸ðµç ij¸¯Å͸¦ ¸ÅÄ¡ÇÑ´Ù. ÆÄ¼­ÀÇ ÀÌÁß ºÎÁ¤Àº Ãë¼ÒµÈ´Ù. ~~alpha_p´Â alpha_p¿Í °°´Ù.

5.1.7. eol_p

¶óÀÎÀÇ ¸¶Áö¸·°ú ¸ÅÄ¡µÈ´Ù. (CR/LF¿Í ¸ÅÄ¡µÈ´Ù.)

5.1.8. nothing_p

¾Æ¹«°Í°úµµ ¸ÅÄ¡µÇÁö ¾Ê´Â´Ù. Ç×»ó ½ÇÆÐÇÑ´Ù.

5.1.9. end_p

ÀÔ·ÂÀÇ ³¡°ú ¸ÅÄ¡µÈ´Ù. (ÀÔ·ÂÀÌ ¸ðµÎ ¼ÒÁøµÇ¾úÀ» ¶§ ¼º°øÀûÀ¸·Î ¸ÅÄ¡µÈ´Ù.)

5.2. Operators

¿¬»êÀÚ´Â °´Ã¼ÀÇ Á¶ÇÕ°ú Æ÷ÇÔÀÇ ¼ö´ÜÀ¸·Î »ç¿ëµÈ´Ù. ´Ü¼øÇÑ ÆÄ¼­´Â ¿ÀÆÛ·¹ÀÌÅÍ ¿À¹ö·ÎµùÀ» ÅëÇØ¼­ Á¶ÇÕ ÆÄ¼­¸¦ ¸¸µé±â À§Çؼ­ Á¶ÇյȴÙ. À̰ÍÀº EBNF(Extended Backus-Normal Form) ¹®¹ýÀ» ¸¸µé¾î ³»±â À§Çؼ­ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ±¸¹®À» º¸¸é
    a | b
a¿Í b¶ó´Â °ÍÀ» Á¶ÇÕÇÏ´Â »õ·Î¿î ÆÄ¼­ ŸÀÔÀ» ¸¸µé¾î ³½´Ù. ÀÌ ¿¹Á¦¸¦ ´õ »ìÆìº¸¸é, a¿Í b°¡ chilt<>ŸÀÔÀ̶ó°í ÇÑ´Ù¸é, °á°ú´Â ´ÙÀ½°ú °°Àº Á¶ÇÕ Å¸ÀÔÀÌ µÈ´Ù.
    alternative<chlit<>, chlit<> >
ÀϹÝÀûÀ¸·Î ¾î¶² ¹ÙÀ̳ʸ® ¿¬»êÀÚµç parser1°ú parser2¶ó´Â µÎ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ¾Æ¼­ »õ·Î¿î Á¶ÇÕ ÆÄ¼­¸¦ ¸¸µç´Ù.
    op<parser1, parser2>
¿©±â¼­ parser1°ú parser2´Â ¾î¶² º¹ÇÕ ÆÄ¼­¶óµµ °¡´ÉÇÏ´Ù. (ÀÌ °¡´É¼ºÀº ÄÄÆÄÀÏ·¯ÀÇ ÇѰ迡¸¸ Á¦¾àµÈ´Ù.)

5.2.1. ÁýÇÕ ¿¬»êÀÚ

Set operators
a | b Union Match a or b. Also referred to as alternative
a & b Intersection Match a and b
a - b Difference Match a but not b. If both match and b's matched text is shorter than a's matched text, a successful match is made
a ^ b XOR Match a or b, but not both

5.2.1.1. ´ÜÀý(short-circuiting)
¼±ÅÃÀº ¿ÞÂÊ¿¡ ÀÖ´Â ÀÎÀÚºÎÅÍ ¼ø¼­´ë·Î Çϳª¾¿ ½ÃµµÇÑ´Ù. ¼º°øÀûÀ¸·Î ¸ÅÄ¡µÇ´Â °ÍÀÌ ¹ß°ßµÇ¸é ÆÄ¼­´Â °á°ú¸¦ °áÁ¤ÁþÁö¸¸ ´Ù¸¥ °á°ú°¡ Á¸ÀçÇÒ °¡´É¼ºÀº ´ÜÀýµÈ´Ù. ÀÌ·± ´ÜÀýÀº °¡Àå ¿ÞÂÊ¿¡ ÀÖ´Â °Í¿¡ °¡Àå ³ôÀº ¿î¼±¼øÀ§°¡ ÀÖ´Ù.

´ÜÀýÀº C³ª C++ÀÇ ·ÎÁ÷ ¿¬»ê°ú ºñ½ÁÇÏ´Ù. Áï ¸¸¾à if(x<3 || y<2)¿¡¼­ ¸¸¾à x°¡ 3º¸´Ù ÀÛ´Ù°í °è»êµÇ¾ú´Ù¸é y<2´Â Å×½ºÆ®°¡ µÇÁö ¾Ê´Â´Ù. ÀÌ·± ´ÜÀýÀº ¼öÇà½Ã°£À» Çâ»ó½ÃŲ´Ù. ¼±ÅÃÀÇ ¼ø¼­´Â ³í¸®ÀûÀ¸·Î °ü°è¾ø±â ¶§¹®¿¡ ÃÖ´ëÀÇ È¿À²À» À§Çؼ­ °¡Àå ÀϹÝÀûÀÎ ¼±ÅÃÀ» ¾Õ¿¡ ³õµµ·Ï ÇØ¾ß ÇÑ´Ù.

5.2.2. ¿¬¼Ó ¿¬»êÀÚµé(Sequencing Operators)

Sequencing operators
a >> b Sequence Match a and b in sequence
a && b Sequential-and Sequential-and. Same as above, match a and b in sequence
a | | b Sequential-or Match a or b in sequence

¿¬¼Ó ¿¬»êÀÚ >>´Â ¿¬¼Ó-and ¿¬»êÀÚ·Î °£ÁÖÇÒ ¼ö ÀÖ´Ù. a && b ´Â ¡®match a and b in sequence¡¯·Î Àд´Ù. °è¼ÓÇØ¼­ ¿¬¼Ó-or ´Â ¡®match a or b in sequence¡¯·Î Àд´Ù. À̰ÍÀº ¸¸¾à a¿Í b°¡ ¸ðµÎ ¸ÅÄ¡µÈ´Ù¸é ¼ø¼­´ë·Î ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀ¸·Î a >> !b | b ¿Í µ¿ÀÏÇÏ´Ù.

5.2.3. ¿É¼Ç°ú ·çÇÁ(Optional and Loops)

Optional and Loops
*a Kleene star Match a zero (0) or more times
+a Positive Match a one (1) or more times
!a Optional Match a zero (0) or one (1) time
a % b List Match a list of one or more repetitions of a separated by occurrences of b. This is the same as a >> *(b >> a). Note that a must not also match b

ÀÚ¼¼È÷ »ìÆìº¸¸é ¿É¼Ç ¿¬»êÀÚÀÎ !a°¡ ·çÇÁ¿Í °°Àº Ä«Å×°í¸®¿¡ ÀÖ´Â °Í¿¡ ÁÖÀÇÇÏ°Ô µÈ´Ù. À̰ÍÀº ¿É¼ÇÀÌ ¸ÅÄ¡ÇÏ´Â °ÍÀ» °í·ÁÇÒ ¶§ ±×°ÍÀÌ 0¹øÀ̳ª 1¹ø ¹Ýº¹µÈ´Ù´Â °ÍÀ» ÀǹÌÇϱ⠶§¹®ÀÌ´Ù.



ID
Password
Join
A man who fishes for marlin in ponds will put his money in Etruscan bonds.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-12-15 16:25:36
Processing time 0.0205 sec