Boost ¶óÀ̺귯¸®¿¡¼­ Æļ­ Á¦³Ê·¹ÀÌÅÍÀÎ ½ºÇǸ´(Sprit)¿¡ ´ëÇÑ ¸Å´º¾óÀ» ¹ø¿ªÇÑ °ÍÀÔ´Ï´Ù. * ¿øº» : [http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/index.html] * ¶óÀ̼¾½º : [http://www.boost.org/LICENSE_1_0.txt] * ¹ø¿ª : [±è»ó±Õ] ---- [[TableOfContents]] == ¼Ò°³ == ½ºÇǸ´Àº 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. }}} ÀÌ µÈ´Ù. ¸¶Áö¸·À¸·Î °¢°¢ÀÇ ·ê¸¶´Ù ¼¼¹ÌÄÝ·Ð ';'À» »ç¿ëÇؼ­ ³¡³½´Ù. == Quick Start == === ¿Ö Spirit¸¦ »ç¿ëÇØ¾ß Çϳª? === ½ºÇǸ´Àº ½Ç¿ëÀûÀÎ ÆÄ½Ì Åø·Î¼­ ¼³°èµÇ¾ú´Ù. EBNFÇü½ÄÀ» ¿Ïº®ÇÏ°Ô ÆĽÌÇÏ´Â ´É·ÂÀ» C++ÄÚµå ³»¿¡¼­ ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿© °³¹ß ½Ã°£À» ´ÜÃà½ÃŲ´Ù. C³ª Pascal°ú °°Àº »õ·Î¿î ·©±ÍÁö¸¦ °³¹ßÇÏ°íÀÚ ÇÑ´Ù¸é, YACC³ª ANTLR°ú °°Àº Å« stand-alone Æļ­¸¦ »ç¿ëÇϴ°͵µ ½Ç¿ëÀûÀÌ´Ù. ÇÏÁö¸¸ ¾ÆÁÖ ÀÛÀº Æļ­¸¦ ¸¸µé°íÀÚ ÇÑ´Ù¸é YACC³ª ANTLRÀ» »ç¿ëÇÏ´Â °ÍÀº ³Ê¹« ¹«°Ì´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÇؾßÇÒ ÆÄ½Ì ÀÛ¾÷ÀÇ ½ºÆåÆ®·³Áß ÇÑÂÊ ³¡Àº scanf¸¦ »ç¿ëÇؼ­ Á÷°üÀûÀ¸·Î ¼öÇàÇÏ´Â °ÍÀÌ´Ù. Á¤±Ô½Ä 󸮸¦ À§ÇÑ ¶óÀ̺귯¸®(¿¹ : boostÀÇ regex)³ª ½ºÄ³³Ê(¿¹ : boostÀÇ tokenizer)°¡ Á¸ÀçÇÏÁö¸¸, Á¤±³ÇÑ Æļ­¸¦ ¸¸µå´Âµ¥´Â ºÎÁ·ÇÏ´Ù. ÀÌ·± ÅøÀ» »ç¿ëÇؼ­ º¹ÀâÇÑ Æļ­¸¦ ¸¸µé¸é ÀÌÇØÇϰųª °ü¸®Çϱâ Èûµç Äڵ带 ÀÛ¼ºÇÒ ¼ö ¹Û¿¡ ¾ø´Ù. === ¿¹Á¦ 1 === ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ¸¦ ÆĽÌÇϱâ À§ÇÑ Æļ­¸¦ »ý¼ºÇÏÀÚ {{{ real_p }}} À§ÀÇ ÄÚµå´Â ½ºÇǸ´ÀÇ ''real_parser''(built-in parser)¶ó´Â ºÎµ¿¼Ò¼öÁ¡ Æļ­¸¦ ÀÌ¿ëÇؼ­ ¸¸µé¾îÁ³´Ù. Æļ­ÀÇ ³¡ÀÌ ''_p''¶ó´Â ½ºÇǸ´ ÄÁº¥¼Ç(convention)¿¡ µû¸¥´Ù´Âµ¥ ÁÖÀÇÇÏÀÚ. ½ºÇǸ´Àº ¸¹Àº pre-defined Æļ­°¡ Á¸ÀçÇÏ°í ÀÏÁ¤ÇÑ ³×ÀÌ¹Ö ÄÁº¥¼Ç¿¡ ÀÇÇؼ­ ´ç½ÅÀÌ »ç¿ëÇϴµ¥ ÆíÇÏ°Ô µÇ¾îÀÖ´Ù. === ¿¹Á¦ 2 === ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ 2°³¸¦ ¹Þ¾ÆµéÀÌ´Â Æļ­¸¦ »ý¼ºÇÏÀÚ {{{ real_p >> real_p }}} Ä£¼÷ÇÑ ºÎµ¿¼Ò¼öÁ¡ Æļ­ÀÎ ''real_p''°¡ 2¹ø »ç¿ëµÈ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ¿©±â¼­ '>>'' ¿¬»êÀÚ°¡ ¹«½¼ ¿ªÇÒÀ» ÇÏ´Â °ÍÀϱî? ¼ýÀÚµéÀº ¹º°¡¿¡ ÀÇÇؼ­ ºÐ¸®µÇ¾î ÀÖ¾î¾ß Çϴµ¥, ±×°ÍÀÌ ¿¬¼Ó ¿¬»êÀÚ·Î ¼±ÅõǾú´Ù. À§ÀÇ ÇÁ·Î±×·¥Àº 2°³ÀÇ ´Ü¼øÇÑ Æļ­ºÎÅÍ ÇϳªÀÇ ÇϳªÀÇ Æļ­¸¦ »ý¼ºÇϴµ¥, 2°³ÀÇ Æļ­¸¦ ºÙÀÌ´Â ¿ªÇÒÀº ¿¬¼Ó ¿¬»êÀÚ°¡ ÇÑ´Ù. °á°ú´Â 2°³ÀÇ ÀÛÀº Æļ­¸¦ °áÇÕÇÑ ÇϳªÀÇ Æļ­ÀÌ´Ù. ¼ýÀÚ »çÀÌ¿¡ ÀÖ´Â °ø¹éÀº ¾î¶»°Ô Æļ­°¡ ºÒ¸®´À³Ä¿¡ µû¶ó¼­ ÀÚµ¿ÀûÀ¸·Î Á¦°ÅµÈ´Ù.(¾Æ·¡¸¦ º¸¶ó) ÁÖÀÇ: Æļ­¸¦ °áÇÕÇÒ¶§ ¹Ýµå½Ã ´õÅ« Æļ­·Î ³¡³­´Ù. Æļ­´Â °áÇÕÀ» ½ÃÅ´¿¡ µû¶ó Á¡Á¡´õ Ä¿Áø´Ù. ±×·¸Áö¸¸ ¾ðÁ¦³ª µÎ°³ÀÇ Æļ­¸¦ °áÇÕÇϸé ÇϳªÀÇ Å« Æļ­·Î ³¡³­´Ù. ÀÌ°ÍÀº Áß¿äÇÑ °³³äÀÌ´Ù. === ¿¹Á¦ 3 === ÀÓÀÇÀÇ °³¼öÀÇ ºÎµ¿¼Ò¼öÁ¡ ¼ýÀÚ¸¦ ¹Þ¾ÆµéÀÌ´Â Æļ­¸¦ »ý¼ºÇÏÀÚ. {{{ *real_p }}} ÀÌ°ÍÀº '*'¸¦ »ç¿ëÇÑ Á¤±Ô½Ä Ç¥Çö°ú ºñ½ÁÇÏÁö¸¸ C++ ÇÁ·Î±×·¡¸Ó°¡ '*' ¿¬»êÀÚ¸¦ ¿À¹ö·Îµå Çß´Ù°í Çصµ ¾à°£Àº ÀÌ»óÇÏ´Ù. ÀÌ»óÇÏ°Ô º¸ÀÌ´Â °ÍÀº '*'°¡ ¿µÇâÀ» ÁÖ´Â ''real_p'ÀÇ ¾ÕÂÊ¿¡ À§Ä¡ÇØ Àֱ⠶§¹®ÀÌ´Ù. ÀÌ°Ç C++ ¹®¹ý¿¡ ¸Â°Ô µ¿ÀÛÇÏ°Ô ÇÏ·Á°í Ç߱⠶§¹®ÀÌ´Ù. Æļ­¸¦ ¸¸µé¾î ³»´Â Ç¥ÇöÀÇ ´ëºÎºÐÀº '*'¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. C++ÀÇ ¿¬»êÀÚ ¿ì¼±¼øÀ§¿¡ µû¶ó¼­ °ýÈ£¾È¿¡ '*'¸¦ ³Ö¾î¾ß ÇÒÁöµµ ¸ð¸¥´Ù. '*'´Â Kleene Start, Keene Closure µîÀ¸·Î ¾Ë·ÁÁ® ÀÖÁö¸¸ ¾ÕÀ¸·Î´Â ±×³É º°(star)À̶ó°í ÇÑ´Ù. === ¿¹Á¦ 4 === ÀÌ ¿¹Á¦¿¡¼­ ½°Ç¥·Î ºÐ¸®µÈ ¼ýÀÚ ¸®½ºÆ®¸¦ vector¿¡ ³Ö´Â Æļ­¸¦ ¸¸µé °ÍÀÌ´Ù. ==== Step 1. Æļ­ÀÇ »ý¼º ==== {{{ real_p >> *(ch_p(',') >> real_p) }}} ''ch_p(',')''¿¡ ÁÖ¸ñÇ϶ó. ÀÌ°Ç ½±Ç¥ ','¸¦ ÀνÄÇϱâ À§ÇÑ literal character Æļ­ÀÌ´Ù. ¿©±â¼­´Â º°ÀÌ ´õ º¹ÀâÇÑ ¾Æ·¡ÀÇ ½Ä¿¡ ÀÇÇؼ­ ¸¸µé¾îÁö´Â Æļ­¿¡ ¿µÇâÀ» ÁØ´Ù. {{{ (ch_p(',') >> real_p) }}} À̹ø °Í¿¡´Â °ýÈ£°¡ ÇÊ¿äÇϴٴµ¥ ÁÖÀÇÇ϶ó. ==== 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°¡ µÈ´Ù. (Áï Æļ­´Â ¿ÏÀüÈ÷ ÀÔ·ÂµÈ ½ºÆ®¸µÀ» ÀνÄÇß´Ù.) ==== 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& 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://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/example/fundamental/number_list.cpp ¿©±â¼­] º¼¼ö ÀÖ´Ù. == ±âº» °³³ä == Àß ÀÌÇØÇØ¾ß ÇÒ ³× °¡Áö °³³äÀÌ ÀÖ´Ù. 1) Æļ­(Parser), 2) ¸ÅÄ¡(Match), 3) ½ºÄ³³Ê, 4) Semantic Action ÀÌ·± ±âº» °³³äÀº ´Ù¸¥ °Í°ú ¿¬°üµÇ¾î ÀÖ°í, °¢°¢ÀÇ ±â´ÉÀº ÇÁ·¹ÀÓ¿öÅ© Àüü¿¡ ÇϳªÀÇ ÀÏ°ü¼ºÀ» °¡Áö°í ¼¯¿©ÀÖ´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro1.png === Æļ­ === ÇÁ·¹ÀÓ¿öÅ©ÀÇ Áß½ÉÀº Æļ­ÀÌ´Ù. Æļ­´Â ½ºÄ³³Ê¿¡ ÀÇÇؼ­ óÀ½ºÎÅÍ ³¡±îÁö ¼øÂ÷ÀûÀ¸·Î ÀоîÁø ¼±ÇüÀûÀÎ ÀÔ·Â ½ºÆ®¸²À» ÀνÄÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÑ´Ù. Æļ­´Â Àß Á¤ÀÇµÈ »ç¾ç Áï ±×·¡¸¶ ·ê¿¡ ÀÔ·ÂÀ» ¸ÅÄ¡ ½ÃÅ°·Á°í ½ÃµµÇÑ´Ù. ¼º°øÇÏ°Ô µÇ¸é Æļ­´Â Á¤ÀÇµÈ semantic actionÀ» ¼öÇàÇÑ´Ù. ±×¸®°í semantic actionÀº Æļ­¿¡¼­ ³Ñ¾î¿Â µ¥ÀÌÅÍ¿Í ¿¬°áµÈ Æļ­ÀÇ °èÃþ ÄÁÅؽºÆ®(context)¿¡ µû¶ó¼­ ±¸Á¶È­µÈ Á¤º¸¸¦ »Ì¾Æ³½´Ù. ½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©´Â °£´ÜÇÑ °ÍºÎÅÍ º¹ÀâÇÑ °Í±îÁö ´Ù¾çÇÑ °ÍÀ» ÆĽÌÇÒ ¼ö ÀÖ´Â pre-defineµÈ Æļ­µéÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÈ´Ù. °³³äÀ¸·Î¼­ Æļ­´Â °ø°³µÈ °³³äÀûÀÎ ÀÎÅÍÆäÀ̽º ¾àÁ¤À» °®´Â´Ù. ¾àÁ¤¿¡ µû¶ó¼­ ´©±¸¶óµµ ÇÁ·¹ÀÓ¿öÅ©ÀÇ pre-define ±¸¼º¿ä¼Ò¿Í °°ÀÌ Àß µ¿ÀÛÇÒ ¼ö ÀÖ´Â Æļ­¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Æļ­ÀÇ °³³äÀû ÀÎÅÍÆäÀ̽ºÀÇ »ó¼¼ÇÑ Á¤ÀÇ´Â ³ªÁß¿¡ ¼³ÇÏ°Ú´Ù. ÇÁ·¹ÀÓ¿öÅ©ÀÇ »ç¿ëÀÚµéÀº ÀϹÝÀûÀ¸·Î ±×µéÀÌ Æļ­¸¦ Á÷Á¢ ÄÚµùÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ½ºÇǸ´Àº ´ëºÎºÐÀÇ ¹®¹ý°ú ÀÇ¹Ì ºÐ¼®À» ÇÒ ¼ö ÀÖ´Â pre-define Æļ­µéÀ» ´ë±Ô¸ð·Î °¡Áö°í ÀÖ´Ù. ´ÙÀ½ Àå¿¡¼­ ÀÌ·± Æļ­µéÀ» °ËÅäÇÒ °ÍÀÌ´Ù. Á¤ÀÇµÈ ±â´ÉÀÌ ¾ø´Â ¸Å¿ì µå¹® °æ¿ì¶ó Çصµ »õ·Ó°Ô »ç¿ëÀÚ°¡ Æļ­¸¦ ÀÛ¼ºÇÏ´Â °Íµµ ¾ÆÁÖ ½±´Ù. Æļ­¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ½¬¿î °ÍÀº ½ºÇǸ´ÀÇ È®Àå°¡´ÉÇÑ ±¸Á¶(extensibility)¿¡ ±âÀÎÇÑ´Ù. === ±âº»(Primitive) Æļ­¿Í Á¶ÇÕ(Composite) Æļ­ === ½ºÇǸ´ Æļ­µéÀº µÎ °¡Áö Ä«Å×°í¸®ÀÎ ±âº»Æļ­¿Í Á¶ÇÕÆļ­·Î ³ª´­ ¼ö ÀÖ´Ù. ÀÌ·± µÎ °¡Áö Ä«Å×°í¸®µéÀº ÆÄ½Ì ¿ë¾î¿¡¼­ terminal°ú non-terminal°ú ºñ½ÁÇÏ´Ù. ±âº»Æļ­´Â ´õ ÀÌ»ó ºÐÇØÇÒ ¼ö ¾ø´Â ´ÜÀ§ÀÌ´Ù. ¹Ý¸é¿¡ Á¶ÇÕÆļ­´Â ±âº»Æļ­³ª ´Ù¸¥ Æļ­µéÀÌ ÇÕÃÄÁø Æļ­ÀÌ´Ù. ´ÙÀ½ ½ºÇǸ´ ±¸¹®À» »ìÆ캸ÀÚ. {{{ real_p >> *(',' >> real_p) }}} real_p´Â ÀÚ¿¬¼ö¸¦ ÆĽÌÇÒ ¼ö ÀÖ´Â ±âº»Æļ­ÀÌ´Ù. ±¸¹® ¾È¿¡ ÀÖ´Â ','´Â ch_p(',')°ú °°Àº °ÍÀ¸·Î ÇϳªÀÇ Ä³¸¯Å͸¦ ÀνÄÇÒ ¼ö ÀÖ´Â ±âº» Æļ­ÀÌ´Ù. À§ÀÇ ±¸¹®Àº ´ÙÀ½°ú °°Àº ÆĽºÆ®¸®¿Í ´ëÀÀµÈ´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro7.png ¾Æ·¡ÀÇ ±¸¹®À» º¸ÀÚ. {{{ ',' >> real_p }}} ÀÌ ±¸¹®Àº »õ·Î¿î ¿¬¼Ó Æļ­(sequence parser)¸¦ ±¸¼ºÇÑ´Ù. À§ÀÇ ''sequence'' Æļ­´Â ¿ÞÂÊ Æí(lhs: left hand side)ÀÇ ''ch_p(',')''¿Í ¿À¸¥ÂÊ Æí(rhs: right hand side)ÀÇ ''real_p''¶ó´Â µÎ °³ÀÇ Æļ­¸¦ Æ÷ÇÔÇÏ´Â Á¶ÇÕ Æļ­ÀÌ´Ù. ÀÌ Á¶ÇÕ Æļ­°¡ ºÒ¸®¸é, ¼ø¼­´ë·Î lhs¸¦ ÄÝÇÏ°í rhs¸¦ ÄÝÇÑ´Ù. ±×¸®°í µÎ °¡Áö ÄÝ ¸ðµÎ ¼º°øÇؾ߸¸ ¼º°øµÈ ¸ÅÄ¡¶ó´Â °ÍÀ» º¸°íÇÑ´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro2.png ¿¬¼Ó Æļ­´Â ¹ÙÀ̳ʸ® Á¶ÇÕÆļ­·Î¼­ 2°³ÀÇ Æļ­·Î Á¶ÇյȴÙ. ´ÜÀÏ Á¶ÇÕ(unary composite) ¶ÇÇÑ Á¸ÀçÇÑ´Ù. ´ÜÀÏ Á¶ÇÕÀº ÇϳªÀÇ ÁÖÁ¦¸¦ À¯ÁöÇÑ´Ù. ¹ÙÀ̳ʸ® Á¶ÇÕ°ú °°ÀÌ ´ÜÀÏ Á¶ÇÕµµ Æ÷ÇÔµÈ ÁÖÁ¦¿¡ µû¶ó¼­ ÇൿÀÌ ¹Ù²ï´Ù. ÇϳªÀÇ ¿¹°¡ ¹Ù·Î º°(Kleen star)ÀÌ´Ù. Æļ­¿¡ ÀÇÇؼ­ º°ÀÌ ºÒ¸®¸é º°¿¡ Æ÷ÇÔµÈ ÁÖÁ¦¸¦ 0ȸÀÌ»ó ºÎ¸¥´Ù. 0ȸ ÀÌ»óÀ̶ó´Â °Í ¶§¹®¿¡ º°Àº Ç×»ó ¼º°øÀûÀÎ ¸ÅÄ¡¸¦ ¸®ÅÏÇϸç NULL ½ºÆ®¸µµµ ¸ÅÄ¡ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ±¸¹®À» »ìÆ캸ÀÚ. {{{ *(',' >> real_p) }}} À§ ±¸¹®Àº ¿¬¼Ó ÆÄ??''kleene_star''·Î °¨½Ñ °ÍÀÌ´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro3.png Àüü ±¸¹®Àº ''real_p'' ±âº» Æļ­¿Í ''sequence'' Æļ­¸¦ °¨½Ñ ''kleene_star'' Æļ­·Î ±¸¼ºµÈ´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro4.png °èÃþÀûÀ¸·Î Á¶ÇÕµÇ°í ±¸Á¶È­µÈ ¸î °³ÀÇ °£´ÜÇÑ Å¬·¡½º µéÀÌ ¸Å¿ì °­·ÂÇÑ °´Ã¼ÁöÇâÀû ¸®Ä¿½Ãºê-µð¼¾´øÆ® Æļ­ ¿£ÁøÀ» ¸¸µé¾î ³½´Ù. ÀÌ·± Ŭ·¡½ºµéÀº ´õ º¹ÀâÇÑ Æļ­¸¦ ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ÀÎÇÁ¶ó¸¦ Á¦°øÇÑ´Ù. ÃÖÁ¾ÀûÀÎ Æļ­ Á¶ÇÕÀº ¹«ÇÑ look-ahead¸¦ °®´Â non-deterministic recursive-descent parserÀÌ´Ù. Top-down descent´Â °èÃþÀ» ¼ø¹æÇÑ´Ù. ¿Ü°¢ÀÇ ''sequence''´Â Á¦ÀÏ ¿ÞÂÊÀº ''real_p'' Æļ­¸¦ ÄÝÇÑ´Ù. ¸¸¾à ¼º°øÇϸé ''kleene_star''ÀÌ ´ÙÀ½À¸·Î ÄݵȴÙ. ''kleene_star''´Â ¾ÈÂÊÀÇ ''sequence''¸¦ ¸ÅÄ¡¿¡ ½ÇÆÐÇϰųª ÀÔ·ÂÀÌ ´Ù ¼Ò¸ðµÉ ¶§±îÁö ¹Ýº¹ÀûÀ¸·Î ÄÝÇÑ´Ù. ³»ºÎ¿¡¼­´Â ''ch_p(',')''¿Í ''real_p''°¡ ¼ø¼­´ë·Î ÄݵȴÙ. ÆĽºÄ® ¹®¹ý ´ÙÀ̾î±×·¥À» ¿¬»ó½ÃÅ°´Â ¾Æ·¡ÀÇ ´ÙÀ̾î±×·¥Àº ¾î¶² ÀÏÀÌ ÀϾ´ÂÁö¸¦ ³ªÅ¸³½´Ù. http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro5.png °´Ã¼ Æ÷ÇÔ°ú ¸®Ä¿ÀüÀ¸·Î ¿¬°áµÈ Á¶ÇÕÀÇ À¯¿¬ÇÔÀº ÆĽ̿¡ ´ëÇÑ ´ÜÀÏ Á¢±Ù¹ýÀ» Á¦½ÃÇÑ´Ù. ¼­ºêŬ·¡½ºµéÀº ¿¬°üÀ» Çü¼ºÇÏ´Â °Í°ú º¹ÀâÇÑ ¾Ë°í¸®Áòµé·ÎºÎÅÍ ÀÚÀ¯·Ó´Ù. º¹ÀâÇÑ Æļ­´Â ¸î °³ÀÇ ±âº» Æļ­ Ŭ·¡½ºµé·ÎºÎÅÍ Á¶ÇÕµÇ¾î »ý¼ºµÉ ¼ö ÀÖ´Ù. ÇÁ·¹ÀÓ¿öÅ©´Â È®ÀåÇÒ ¼ö ÀÖ´Â ±¸Á¶·Î ¼³°èµÇ¾ú´Ù. »õ·Î¿î ±âº» Æļ­³ª Á¶ÇÕ Æļ­°¡, ´Ü¼øÇÑ °ÍºÎÅÍ º¹ÀâÇÑ °Í±îÁö ¾ðÁ¦³ª Ãß°¡µÉ ¼ö ÀÖ´Ù. Á¶ÇյǴ °ÍÀº ÄÄÆÄÀÏ Å¸ÀÓ¿¡ Á¤ÀûÀ¸·Î ÀϾ´Ù. ÀÌ°ÍÀº C++ expression template¿Í template ¸ÞŸ ÇÁ·Î±×·¡¹ÖÀÇ À¯¿¬¼º ¶§¹®¿¡ °¡´ÉÇÏ´Ù. °á°ú´Â ±âº» Æļ­¿Í ÀÛÀº Á¶ÇÕµéÀÌ Á¶ÇÕµÈ Á¶ÇÕ Æļ­ÀÌ´Ù. ÀÌ·± Æ÷ÇÔ Àü·«Àº ¿Ïº®ÇÑ EBNF±¸¹®À» ¸ðµ¨¸µ ÇÒ ¼ö ÀÖ´Â °èÃþ ±¸Á¶¸¦ ¸¸µé ¼ö ÀÖ´Â ´É·ÂÀ» ÁØ´Ù. ³ªÁß¿¡ ´õ ¸¹Àº ±âº» Æļ­¿Í Á¶ÇÕ Æļ­ Á¦ÀÛ¿ë ºí·ÏµéÀ» º¸¿©ÁÖ°Ú´Ù. === ½ºÄ³³Ê === Æļ­¿Í °°ÀÌ ½ºÄ³³Ê´Â Ãß»óÀûÀº °³³äÀÌ´Ù. ½ºÄ³³ÊÀÇ ÀÛ¾÷Àº Æļ­¿¡°Ô Á¦°øµÇ´Â ¼øÂ÷ÀûÀÎ ÀÔ·Â ½ºÆ®¸²À» Á¦°øÇÏ´Â °ÍÀÌ´Ù. ½ºÄ³³Ê´Â first¿Í last¶ó´Â 2°³ÀÇ STL forward iterator·Î ±¸¼ºµÈ´Ù. ¿©±â¼­ first´Â ·¹ÆÛ·±½ºÀÌ°í last¸¦ °ªÀÌ´Ù. First iterator´Â Æļ­¿¡ ÀÇÇؼ­ À§Ä¡¸¦ º¯È­½Ãų ¼ö ÀÖ´Â ·¹ÆÛ·±½º¸¦ °¡Áö°í ÀÖ´Ù. Á¤Ã¥ÀÇ ÁýÇÕ¿¡ ÀÇÇؼ­ ½ºÄ³³ÊÀÇ ÇൿÀÌ ÅëÁ¦µÈ´Ù. Æļ­´Â ½ºÄ³³Ê·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃßÃâÇؿͼ­ ½ºÄ³³ÊÀÇ ¸É¹öÇÔ¼ö¿¡ ÀÇÇؼ­ iterator¸¦ À§Ä¡½ÃŲ´Ù. ½ºÄ³³Ê Á¤Ã¥µéÀÇ º¹ÀâÇÔÀº ´ëºÎºÐÀÇ °æ¿ì ¸ô¶óµµ µÈ´Ù. ÇÏÁö¸¸ ½ºÄ³³ÊÀÇ ±âº» API¿¡ ´ëÇÑ Áö½ÄÀº ¿ÏÀüÇÑ ½ºÇǸ´ Æļ­¸¦ ÀÛ¼ºÇϴµ¥ ÇÊ¿äÇÏ´Ù. ½ºÄ³³Ê API´Â ´Ù¸¥ ¼½¼Ç¿¡¼­ °³·«ÀûÀ¸·Î º¸¿©ÁÙ °ÍÀÌ´Ù. Ãß°¡ÀûÀ¸·Î ÆÄ¿ö À¯Àú¸¦ À§Çؼ­ ½ºÄ³³Ê Á¤Ã¥À» ¼³¸íÇÒ °ÍÀÌ´Ù. ½ºÄ³³Ê Á¤Ã¥Àº ½ºÇǸ´À» ¸Å¿ì À¯¿¬ÇÏ°í È®Àå °¡´ÉÇÑ ±¸Á¶·Î ¸¸µç´Ù. ¿¹¸¦ µé¾î ¾î¶² Á¤Ã¥µéÀº µ¥ÀÌÅ͸¦ ÇÊÅ͸µ ÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î »ç¿ëµÇ´Â ½ºÄ³³Ê Á¤Ã¥ÀÇ ¿¹´Â ´ë¼Ò¹®ÀÚ ±¸º° ¾ø´Â ÀÔ·ÂÀ» À§Çؼ­ ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö ¾Êµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ´Ù¸¥ ½ºÄ³³Ê Á¤Ã¥ ¿¹´Â ÀÔ·ÂÀ¸·ÎºÎÅÍ °ø¹éÀ» Á¦°ÅÇÏ´Â °ÍÀÌ´Ù. === ¸ÅÄ¡ === Æļ­´Â ½ºÄ³³Ê·ÎºÎÅÍ ¾ò¾î¿À´Â ¸â¹ö ÇÔ¼ö¿Í ¸ÅÄ¡µÇ´Â °´Ã¼¸¦ ¸®ÅÏÇÏ´Â ¸â¹öÇÔ¼ö¸¦ °®´Â´Ù. ¸ÅÄ¡ °´Ã¼¸¦ À§ÇÑ ±âº» ÇÔ¼ö´Â ÆĽÌÀÇ ¼º°øÀ» Æļ­ÀÇ ÄÝ·¯¿¡°Ô º¸°íÇϱâ À§ÇÑ °ÍÀÌ´Ù. Áï ÆÄ½Ì ÇÔ¼ö°¡ ¼º°øÇϸé true¸¦, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ °è»êÇس½´Ù. ¸¸¾à ÆĽÌÀÌ ¼º°øÇÏ¸é ¸ÅÄ¡ °´Ã¼·ÎºÎÅÍ ¸ÅÄ¡µÇ´Â ij¸¯ÅÍÀÇ ±æÀ̸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. (match.length()¸¦ »ç¿ëÇÑ´Ù.) ±æÀÌ´Â ¸ÅÄ¡°¡ ¼º°øÇÑ´Ù¸é À½ÀÌ ¾Æ´Ñ °ªÀ» °®´Â°í ½ÇÆÐÇÒ °æ¿ì´Â ÀϹÝÀûÀ¸·Î -1À» °®´Â´Ù. ±æÀÌ°¡ 0ÀÏ °æ¿ìµµ Á¤È®ÇÑ ÀÔ·ÂÀÌ¸ç ¼º°øÀûÀÎ ¸ÅÄ¡¸¦ Ç¥ÇöÇÑ´Ù. Æļ­´Â ´ëÀÀµÇ´Â ¼Ó¼º µ¥ÀÌÅ͸¦ °®´Â´Ù. ¿¹¸¦ µé¾î real_p Æļ­´Â ´ëÀÀµÇ´Â ¼ýÀÚ µ¥ÀÌÅ͸¦ °®´Â´Ù. ÀÌ ¼Ó¼ºÀº ÆÄ½ÌµÈ ¼ýÀÚÀÌ´Ù. ¼Ó¼ºÀº ¸®ÅÏµÈ ¸ÅÄ¡ °´Ã¼·Î Àü´ÞµÈ´Ù. ¸ÅÄ¡ °´Ã¼·ÎºÎÅÍ ¼Ó¼ºÀ» ¾ò¾î¿Ã ¼ö ÀÖ´Ù. ÀÌ µ¥ÀÌÅÍ´Â ¸ÅÄ¡°¡ ¼º°øÇßÀ» ¶§¸¸ À¯¿äÇÏ´Ù. === Semantic Action === Á¶ÇÕ Æļ­´Â °èÃþÀ» Çü¼ºÇÑ´Ù. ÆĽÌÀº °¡Àå À§ÂÊÀÇ ºÎ¸ð Æļ­·ÎºÎÅÍ ½ÃÀÛÇÑ´Ù. ±× Æļ­´Â ÆÄ½Ì ÀÓ¹«¸¦ ÀÚ½ÅÀÇ ÀÚ½Ä Æļ­¿¡°Ô À§ÀÓÇÏ°í ¹èºÐÇÑ´Ù. ÀÌ·± °úÁ¤À» ±âº» Æļ­¿¡ µµ´ÞÇÒ ¶§±îÁö ¸®Ä¿½ÃºêÇÏ°Ô ¹Ýº¹ÇÑ´Ù. Semantic actionÀ» ÀÌ·± °èÃþÀÇ ´Ù¾çÇÑ À§Ä¡¿¡ ºÙÀÌ´Â °ÍÀ» ÅëÇØ ´ÜÁ¶·Î¿î ÀÔ·ÂÀ» ±¸Á¶È­µÈ Ç¥ÇöÀ¸·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ Æļ­°¡ ÇÏ´Â ÀÏÀÇ ÇÙ½ÉÀÌ´Ù. À§¿¡¼­ »ç¿ëÇÑ ¿¹¸¦ ´Ù½Ã Çѹø »ìÆ캸ÀÚ. {{{ real_p >> *(',' >> real_p) }}} ''real_p'' Æļ­¸¦ À§ÇÑ ÇÔ¼ö(¶Ç´Â ÇÔ¼ö°´Ã¼)¸¦ °É¾î³õ´Â °ÍÀ» ÅëÇؼ­ ¿ì¸®´Â ÀÔ·ÂÀ¸·ÎºÎÅÍ ¼ýÀÚ¸¦ »Ì¾Æ¿Ã ¼ö ÀÖ´Ù. {{{ real_p[&f] >> *(',' >> real_p[&f]) }}} http://spirit.sourceforge.net/distrib/spirit_1_8_3/libs/spirit/doc/theme/intro6.png ¿©±â¼­ ''f''´Â ÇϳªÀÇ ÀÎÀÚ¸¦ °®´Â ÇÔ¼öÀÌ´Ù. {{{[&f]}}}´Â ''real_p''°¡ À¯È¿ÇÑ ¼ýÀÚ¸¦ ÀνÄÇßÀ» ¶§ ''f''°¡ ÄÝµÇ°Ô ÇÑ´Ù. ¾î¶² ÀÛ¾÷À» ¼öÇàÇÒ Áö´Â ÇÔ¼ö¿¡ ´Þ·Á ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ ¹éÅÍ¿¡ µé¾î°¥ ¼ýÀÚ°¡ µÉ ¼ö ÀÖ´Ù. ¸¸¾à ±×·¡¸¶¿¡¼­ ','À» '+'·Î º¯°æÇؼ­ ¿ì¸®´Â Çհ踦 °è»êÇÏ´Â ´Ü¼ø °è»ê±â·Î Á¤ÀÇÇÑ´Ù¸é, ÇÔ¼ö ''f''´Â ÀÔ·ÂµÈ ¼ýÀÚ¸¦ ´õÇÏ´Â ±â´ÉÀ¸·Î ¸¸µé¾î¾ß ÇÑ´Ù. == ±¸Á¶ == ÇÁ·¹ÀÓ¿öÅ©´Â Àß ¸ðµâÈ­ µÇ¾îÀÖ°í ·¹À̾îµé·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ||iterator||actor|| ||debug|| ||attribute||dynamic||error_handling||symbols||tree||utility|| ||meta|| ||||||||core|| ||scanner||primitives||composite||non_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''' ¸ðµâÀº °í±Þ ½ºÇǸ´ ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ ¸ÞŸÇÁ·Î±×·¡¹Ö ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ ¸ðµâÀº ½ºÇǸ´ Æļ­ÀÇ ÄÄÆÄÀÏŸÀÓÀ̳ª ·±Å¸ÀÓ ÀÚ°¡ Á¡°ËÀ» ¿ëÀÇÇÏ°Ô ÇÑ´Ù. == Core == === Primitives === ÇÁ·¹ÀÓ¿öÅ©´Â predefineµÈ ±âº» Æļ­µéÀ» °®°í ÀÖ´Ù. À̰͵éÀº »ç¿ëÀÚ°¡ º¹ÀâÇÑ Æļ­¸¦ ¸¸µé±â À§Çؼ­ »ç¿ëµÇ´Â °¡Àå ±âÃÊÀûÀÎ Á¦ÀÛ ´ÜÀ§ÀÌ´Ù. ±âº» Æļ­µéÀº ¸Å¿ì À¯¿¬ÇÏ°Ô ¸¸µé¾îÁø ÅÛÇø®Æ® Ŭ·¡½ºµéÀÌ´Ù. ±âº» Æļ­µéÀº Á÷Á¢À̳ª ÇïÆÛ ÇÔ¼öµéÀ» ÅëÇؼ­ ÀνºÅº½ºÈ­ µÈ´Ù. ÀϹÝÀûÀ¸·Î ÇïÆÛ ÇÔ¼öµéÀÌ »ç¿ëÇϱ⠴õ ½±´Ù. Áö±Ý±îÁö´Â ''ch_p''¸¦ ¹®ÀÚ ÆÄ½Ì ÇÔ¼ö·Î ¾Ë¾Æ¿ÔÀ¸³ª »ç½Ç Æļ­ »ý¼º ÇÔ¼öÀÌ´Ù. Ŭ·¡½º ''chlit''°¡ ¹®ÀÚ ÆÄ½Ì ÇÔ¼öÀÇ µÚÂÊ¿¡ ÀÖ´Â ½ÇÁ¦ ÅÛÇø´ Ŭ·¡½ºÀÌ´Ù. ''chilt''°´Ã¼¸¦ ÀνºÅϽºÈ­ ÇÏ·Á¸é ÅÛÇø®Æ® ÀÎÀڷμ­ ij¸¯ÅÍÀÇ Å¸ÀÔÀ» °áÁ¤Çϱâ À§ÇÑ ''CharT''¸¦ Á¦°øÇØ Áà¾ß ÇÑ´Ù. º¸Åë ÀÌ Å¸ÀÔÀº ÀÔ·ÂÀÇ Å¸ÀÔ°ú ´ëÀÀµÇ¸ç, ÀϹÝÀûÀ¸·Î ''char''À̳ª ''wchar_t''°¡ »ç¿ëµÈ´Ù. ´ÙÀ½ÀÇ ±¸¹®Àº ÇϳªÀÇ ±ÛÀÚ 'X'¸¦ ÀνÄÇÏ´Â Àӽà Æļ­ °´Ã¼¸¦ ¸¸µç´Ù. {{{ chlit('X'); }}} ''chilt''ÀÇ »ý¼º ÇÔ¼öÀÎ ''ch_p''¸¦ »ç¿ëÇÏ´Â °ÍÀº ''chilt<>'' Ŭ·¡½ºÀÇ »ç¿ëÀ» ´Ü¼øÈ­ÇÑ´Ù. (ÀÌ ³»¿ëÀº ´ëºÎºÐÀÇ Æļ­ Ŭ·¡½º¿¡µµ Àû¿ëµÈ´Ù. ±× ÀÌÀ¯´Â ´ëºÎºÐÀÇ ½ºÇǸ´ Æļ­ Ŭ·¡½ºµéÀÌ ´ëÀÀµÇ´Â »ý¼º ÇÔ¼ö¸¦ °¡Áö°í Àֱ⠶§¹®ÀÌ´Ù.) ÄÄÆÄÀÏ·¯°¡ ÀÎÀÚ Ãß·ÐÀ» ÅëÇؼ­ ÅÛÇø®Æ® ŸÀÔÀ» Ãß·ÐÇϱ⠶§¹®¿¡ ÇÔ¼ö¸¦ ÄÝÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. À§ÀÇ ¿¹Á¦¸¦ ''ch_p'' ÇïÆÛ ÇÔ¼ö¸¦ ÅëÇؼ­ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. {{{ ch_p('X') // equivalent to chlit('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 x('X'); // declare a parser named x r1 = chlit('X'); // explicit declaration r2 = x; // using x r3 = ch_p('X') // using the generator }}} ==== chlit¿Í ch_p ==== ÇϳªÀÇ ¹®ÀÚ¸¦ ¸ÅÄ¡ÇÑ´Ù. ''chilt''´Â ÇϳªÀÇ Å¸ÀÔ ÀÎÀÚ¸¦ °®´Â ÅÛÇø®Æ®·Î ±âº» ÀÎÀڷμ­ ''char''¸¦ °®´Â´Ù. (Áï ''chilt<>''´Â ''chilt''¿Í µ¿ÀÏÇÏ´Ù.) ÀÌ Å¸ÀÔ ÀÎÀÚ´Â ÆĽÌÇÒ ¶§ ÀνÄÇÒ ÀÎÀÚÀÇ Å¸ÀÔÀÌ´Ù. »ý¼º ÇÔ¼ö¿¡¼­´Â ÇÔ¼öÀÇ ÀÎÀÚ¸¦ ÅëÇؼ­ ÅÛÇø®Æ®ÀÇ Å¸ÀÔ ÀÎÀÚ¸¦ Ãß·ÐÇÑ´Ù. ''chilt'' Ŭ·¡½º »ý¼ºÀÚ´Â ÇϳªÀÇ ÀÎÀÚ¸¦ ¹Þ´Â´Ù. »ý¼ºÀÚ ÀÎÀÚ´Â ÀԷ¿¡ ¸ÅÄ¡µÉ ¹®ÀÚÀÌ´Ù. ¿¹: {{{ r1 = chlit<>('X'); r2 = chlit(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(')'); }}} ==== 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µîÀ» »ç¿ëÇÑ´Ù. ´Ù¸¥ Ç÷§Æû¿¡¼­ »ç¿ëÇÒ ¶§´Â ÁÖÀÇÇÏÀÚ. }}} ==== 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(msg.begin(), msg.end()); }}} {{{ ¹®ÀÚ ´ÜÀ§¿Í ±¸¹® ´ÜÀ§ ÆÄ½Ì ÀϹÝÀûÀÎ Æļ­´Â ¹®ÀÚ(ÇϳªÀÇ ´Ü¾î¸¦ ÀÌ·ç´Â ±âÈ£)¿Í ¹®Àå(¹®ÀåÀ» ÀÌ·ç´Â ´Ü¾îµé)ÀÇ Ã³¸®¸¦ º°µµÀÇ ¿µ¿ªÀ¸·Î Ãë±ÞÇÑ´Ù. ¿¹¾à¾î³ª ¿¬»êÀÚ, ½ºÆ®¸µ, ¼ýÀÚ »ó¼ö µî°ú °°Àº ±×·¡¸¶ÀÇ terminal·Î »ç¿ëµÇ´Â ¿ä¼ÒµéÀº º¸Åë lexical analysis ´Ü°è¿¡¼­ ¸ÕÀú ÃßÃâµÇ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ¿ì¸®°¡ Áö±Ý±îÁö »ìÆ캻 ¿¹¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ, ÀϹÝÀûÀÎ Æļ­¿Í´Â ´Ù¸£°Ô ½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©´Â ¹®ÀÚ ´ÜÀ§³ª ±¸¹® ´ÜÀ§³ª °°ÀÌ Ã³¸®ÇÑ´Ù. ½ºÇǸ´ ÇÁ·¹ÀÓ¿öÅ©¿¡¼­´Â lexical analyzer°¡ ¿Ïº®ÇÏ°Ô ÅëÇյǾî ÀÖ´Ù. ½ºÇǸ´ Æļ­ ¶óÀ̺귯¸®¿¡¼­´Â ºÐ¸®µÈ lexical analyzer°¡ ºÒÇÊ¿äÇÏÁö¸¸, ¹Ýµå½Ã »ç¿ëÇÏÁö ¾ÊÀ» ÇÊ¿ä´Â ¾ø´Ù. ÇÊ¿ä¿¡ µû¶ó¼­´Â ¿©·¯ °³ÀÇ ÆÄ½Ì ´Ü°è¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Preprocessor, lexical analyzer, Æļ­¸¦ »ý¼ºÇÏ°í °°Àº ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ¸ðµÎ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. }}} ==== 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 }}} ==== ±âŸ ¹®ÀÚ Æļ­µé ==== ½ºÇǸ´¿¡¼­´Â ¸ðµç 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 || ==== negation ~ ==== ''chlit'', ''range'', ''anychar_p'', ''alnum_p''µé°ú °°Àº single character Æļ­´Â ºÎÁ¤(negate)µÉ ¼ö ÀÖ´Ù. ¿¹: {{{ ~ch_p('x') }}} À§ÀÇ ¿¹´Â 'x'¸¦ Á¦¿ÜÇÑ ¸ðµç ij¸¯Å͸¦ ¸ÅÄ¡ÇÑ´Ù. Æļ­ÀÇ ÀÌÁß ºÎÁ¤Àº Ãë¼ÒµÈ´Ù. ~~alpha_p´Â alpha_p¿Í °°´Ù. ==== eol_p ==== ¶óÀÎÀÇ ¸¶Áö¸·°ú ¸ÅÄ¡µÈ´Ù. (CR/LF¿Í ¸ÅÄ¡µÈ´Ù.) ==== nothing_p ==== ¾Æ¹«°Í°úµµ ¸ÅÄ¡µÇÁö ¾Ê´Â´Ù. Ç×»ó ½ÇÆÐÇÑ´Ù. ==== end_p ==== ÀÔ·ÂÀÇ ³¡°ú ¸ÅÄ¡µÈ´Ù. (ÀÔ·ÂÀÌ ¸ðµÎ ¼ÒÁøµÇ¾úÀ» ¶§ ¼º°øÀûÀ¸·Î ¸ÅÄ¡µÈ´Ù.) === Operators === ¿¬»êÀÚ´Â °´Ã¼ÀÇ Á¶ÇÕ°ú Æ÷ÇÔÀÇ ¼ö´ÜÀ¸·Î »ç¿ëµÈ´Ù. ´Ü¼øÇÑ Æļ­´Â ¿ÀÆÛ·¹ÀÌÅÍ ¿À¹ö·ÎµùÀ» ÅëÇؼ­ Á¶ÇÕ Æļ­¸¦ ¸¸µé±â À§Çؼ­ Á¶ÇյȴÙ. ÀÌ°ÍÀº EBNF(Extended Backus-Normal Form) ¹®¹ýÀ» ¸¸µé¾î ³»±â À§Çؼ­ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ±¸¹®À» º¸¸é {{{ a | b }}} a¿Í b¶ó´Â °ÍÀ» Á¶ÇÕÇÏ´Â »õ·Î¿î Æļ­ ŸÀÔÀ» ¸¸µé¾î ³½´Ù. ÀÌ ¿¹Á¦¸¦ ´õ »ìÆ캸¸é, a¿Í b°¡ chilt<>ŸÀÔÀ̶ó°í ÇÑ´Ù¸é, °á°ú´Â ´ÙÀ½°ú °°Àº Á¶ÇÕ Å¸ÀÔÀÌ µÈ´Ù. {{{ alternative, chlit<> > }}} ÀϹÝÀûÀ¸·Î ¾î¶² ¹ÙÀ̳ʸ® ¿¬»êÀÚµç parser1°ú parser2¶ó´Â µÎ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ¾Æ¼­ »õ·Î¿î Á¶ÇÕ Æļ­¸¦ ¸¸µç´Ù. {{{ op }}} ¿©±â¼­ parser1°ú parser2´Â ¾î¶² º¹ÇÕ Æļ­¶óµµ °¡´ÉÇÏ´Ù. (ÀÌ °¡´É¼ºÀº ÄÄÆÄÀÏ·¯ÀÇ ÇÑ°è¿¡¸¸ Á¦¾àµÈ´Ù.) ==== ÁýÇÕ ¿¬»êÀÚ ==== ||||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 || ===== ´ÜÀý(short-circuiting) ===== ¼±ÅÃÀº ¿ÞÂÊ¿¡ ÀÖ´Â ÀÎÀÚºÎÅÍ ¼ø¼­´ë·Î Çϳª¾¿ ½ÃµµÇÑ´Ù. ¼º°øÀûÀ¸·Î ¸ÅÄ¡µÇ´Â °ÍÀÌ ¹ß°ßµÇ¸é Æļ­´Â °á°ú¸¦ °áÁ¤ÁþÁö¸¸ ´Ù¸¥ °á°ú°¡ Á¸ÀçÇÒ °¡´É¼ºÀº ´ÜÀýµÈ´Ù. ÀÌ·± ´ÜÀýÀº °¡Àå ¿ÞÂÊ¿¡ ÀÖ´Â °Í¿¡ °¡Àå ³ôÀº ¿î¼±¼øÀ§°¡ ÀÖ´Ù. ´ÜÀýÀº C³ª C++ÀÇ ·ÎÁ÷ ¿¬»ê°ú ºñ½ÁÇÏ´Ù. Áï ¸¸¾à {{{if(x<3 || y<2)}}}¿¡¼­ ¸¸¾à x°¡ 3º¸´Ù ÀÛ´Ù°í °è»êµÇ¾ú´Ù¸é {{{y<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}}} ¿Í µ¿ÀÏÇÏ´Ù. ==== ¿É¼Ç°ú ·çÇÁ(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¹ø ¹Ýº¹µÈ´Ù´Â °ÍÀ» ÀǹÌÇϱ⠶§¹®ÀÌ´Ù. ---- CategoryManual