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.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.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ÇÔ¼ö¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù.
ÀÌ ÇÔ¼öÀÇ ÀÎÀÚ´Â ´ÙÀ½°ú °°´Ù.
±×·³ ÆĽÌÇغ¸ÀÚ.
r = real_p >> *(ch_p(',') >> real_p); parse(str, r, space_p) // Not a full statement yet, patience...parseÇÔ¼ö´Â parse_info¶ó ºÒ¸®´Â ÇϳªÀÇ °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼ ¿ì¸®´Â ´ÙÀ½°ú °°Àº°ÍÀ» ¾Ë°íÀÚ ÇÑ´Ù.
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¸¦ ¸®ÅÏÇÑ´Ù.
Àüü ¼Ò½ºÄÚµå´Â ¿©±â¼ º¼¼ö ÀÖ´Ù.
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. ±¸Á¶ ¶ÇÁ·¹ÀÓ¿öÅ©´Â Àß ¸ðµâÈ µÇ¾îÀÖ°í ·¹À̾îµé·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
½ºÇǸ´Àº 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.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 ÆļµéÀ» Á¤ÀÇÇÏ°í ÀÖ´Ù.
5.1.6. negation ~ ¶chlit, range, anychar_p, alnum_pµé°ú °°Àº single character Æļ´Â ºÎÁ¤(negate)µÉ ¼ö ÀÖ´Ù.
¿¹:
~ch_p('x')À§ÀÇ ¿¹´Â 'x'¸¦ Á¦¿ÜÇÑ ¸ðµç ij¸¯Å͸¦ ¸ÅÄ¡ÇÑ´Ù. ÆļÀÇ ÀÌÁß ºÎÁ¤Àº Ãë¼ÒµÈ´Ù. ~~alpha_p´Â alpha_p¿Í °°´Ù. 5.2. Operators ¶¿¬»êÀÚ´Â °´Ã¼ÀÇ Á¶ÇÕ°ú Æ÷ÇÔÀÇ ¼ö´ÜÀ¸·Î »ç¿ëµÈ´Ù. ´Ü¼øÇÑ Æļ´Â ¿ÀÆÛ·¹ÀÌÅÍ ¿À¹ö·ÎµùÀ» ÅëÇؼ Á¶ÇÕ Æļ¸¦ ¸¸µé±â À§Çؼ Á¶ÇյȴÙ. ÀÌ°ÍÀº EBNF(Extended Backus-Normal Form) ¹®¹ýÀ» ¸¸µé¾î ³»±â À§Çؼ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ±¸¹®À» º¸¸é
a | ba¿Í b¶ó´Â °ÍÀ» Á¶ÇÕÇÏ´Â »õ·Î¿î Æļ ŸÀÔÀ» ¸¸µé¾î ³½´Ù. ÀÌ ¿¹Á¦¸¦ ´õ »ìÆ캸¸é, a¿Í b°¡ chilt<>ŸÀÔÀ̶ó°í ÇÑ´Ù¸é, °á°ú´Â ´ÙÀ½°ú °°Àº Á¶ÇÕ Å¸ÀÔÀÌ µÈ´Ù. alternative<chlit<>, chlit<> >ÀϹÝÀûÀ¸·Î ¾î¶² ¹ÙÀ̳ʸ® ¿¬»êÀÚµç parser1°ú parser2¶ó´Â µÎ °³ÀÇ ÀÎÀÚ¸¦ ¹Þ¾Æ¼ »õ·Î¿î Á¶ÇÕ Æļ¸¦ ¸¸µç´Ù. op<parser1, parser2>¿©±â¼ parser1°ú parser2´Â ¾î¶² º¹ÇÕ Æļ¶óµµ °¡´ÉÇÏ´Ù. (ÀÌ °¡´É¼ºÀº ÄÄÆÄÀÏ·¯ÀÇ ÇÑ°è¿¡¸¸ Á¦¾àµÈ´Ù.) 5.2.1. ÁýÇÕ ¿¬»êÀÚ ¶
5.2.1.1. ´ÜÀý(short-circuiting) ¶¼±ÅÃÀº ¿ÞÂÊ¿¡ ÀÖ´Â ÀÎÀÚºÎÅÍ ¼ø¼´ë·Î Çϳª¾¿ ½ÃµµÇÑ´Ù.
¼º°øÀûÀ¸·Î ¸ÅÄ¡µÇ´Â °ÍÀÌ ¹ß°ßµÇ¸é Æļ´Â °á°ú¸¦ °áÁ¤ÁþÁö¸¸ ´Ù¸¥ °á°ú°¡ Á¸ÀçÇÒ °¡´É¼ºÀº ´ÜÀýµÈ´Ù.
ÀÌ·± ´ÜÀýÀº °¡Àå ¿ÞÂÊ¿¡ ÀÖ´Â °Í¿¡ °¡Àå ³ôÀº ¿î¼±¼øÀ§°¡ ÀÖ´Ù.
´ÜÀýÀº C³ª C++ÀÇ ·ÎÁ÷ ¿¬»ê°ú ºñ½ÁÇÏ´Ù.
Áï ¸¸¾à
if(x<3 || y<2) ¿¡¼ ¸¸¾à x°¡ 3º¸´Ù ÀÛ´Ù°í °è»êµÇ¾ú´Ù¸é y<2 ´Â Å×½ºÆ®°¡ µÇÁö ¾Ê´Â´Ù.
ÀÌ·± ´ÜÀýÀº ¼öÇà½Ã°£À» Çâ»ó½ÃŲ´Ù.
¼±ÅÃÀÇ ¼ø¼´Â ³í¸®ÀûÀ¸·Î °ü°è¾ø±â ¶§¹®¿¡ ÃÖ´ëÀÇ È¿À²À» À§Çؼ °¡Àå ÀϹÝÀûÀÎ ¼±ÅÃÀ» ¾Õ¿¡ ³õµµ·Ï ÇØ¾ß ÇÑ´Ù.
5.2.2. ¿¬¼Ó ¿¬»êÀÚµé(Sequencing Operators) ¶
¿¬¼Ó ¿¬»êÀÚ >>´Â ¿¬¼Ó-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) ¶
ÀÚ¼¼È÷ »ìÆ캸¸é ¿É¼Ç ¿¬»êÀÚÀÎ !a°¡ ·çÇÁ¿Í °°Àº Ä«Å×°í¸®¿¡ ÀÖ´Â °Í¿¡ ÁÖÀÇÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀº ¿É¼ÇÀÌ ¸ÅÄ¡ÇÏ´Â °ÍÀ» °í·ÁÇÒ ¶§ ±×°ÍÀÌ 0¹øÀ̳ª 1¹ø ¹Ýº¹µÈ´Ù´Â °ÍÀ» ÀǹÌÇϱ⠶§¹®ÀÌ´Ù. |
His heart was yours from the first moment that you met. |