· 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
One man tells a falsehood, a hundred repeat it as true.


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