· 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
If you make a mistake you right it immediately to the best of your ability.


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.0213 sec