lex yacc ÃÊ¹Ì´Ï ÇÏ¿ìÅõ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

  • Docbook ¿ø¹®
  • Á¤±ÔÇ¥Çö
  • ÇØ¾ßÇÒ Àϵé
    1. ¾ÆÁ÷ ¹Ì¿Ï¼º
    2. ¹®¸ÆÀ» ÀüüÀûÀ¸·Î ´Ùµë¾î¾ß ÇÔ
    3. ¿ë¾î Á¤¸®¹× yacc, lexÀÇ ±âº»À̷п¡ ´ëÇÑ ³»¿ë Ãß°¡
    4. ½ÇÇàÆÄÀÏ ±îÁö ¸¸µé¾î³»´Â °£´ÜÇÑ ÄÄÆÄÀÏ·¯ ¸¸µé±â

Flex and Bison Howto

Flex and Bison Howto

À±»ó¹è

고친 과정
고침 0.890.882004³â 07¿ù 25ÀÏ 13½Ã2004³â 07¿ù 25ÀÏ 04½Ã
¿ÀŸ ¼öÁ¤°è»ê±â ¿¹Á¦ Ãß°¡
고침 0.852004³â 07¿ù 22ÀÏ 09½Ã
¹ø¿ª¿¡¼­ ¹®¼­ Âü°í ½ºÅ¸ÀÏ º¯°æ
고침 0.822004³â 07¿ù 21ÀÏ 09½Ã
lex/yacc¸¦ flex/bision ±â¹ÝÀ¸·Î º¯°æ, 4Àå Ãß°¡
고침 0.812004³â 07¿ù 20ÀÏ 09½Ã
¹ø¿ª½ÃÀÛ 1-3Àå
고침 0.82002³â 04¿ù 20ÀÏ 19½Ã
¿øº» ¹®¼­ÀÛ¼º

1. ¼Ò°³

¹®¼­ÀÇ ¸¹Àº ºÎºÐÀº Lex, Yacc Howto¿Í Compact Guide to Lex & Yacc¸¦ Âü°íÇϰí ÀÖ½À´Ï´Ù.

¸¸¾à ´ç½ÅÀÌ ¿À·£½Ã°£µ¿¾È À¯´Ð½º ȯ°æ¿¡¼­ ÇÁ·Î±×·¡¹ÖÀ» ÇØ¿Ô´Ù¸é LEX¿Í YACC¶ó´Â À̸§ÀÇ ´Ù¼Ò ½Åºñ½º·¯¿î ´À³¦À» ÁÖ´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­ µé¾î ºÃÀ» °ÍÀÌ´Ù. Ȥ ´ç½ÅÀÌ GNU/Linux¿¡ ´õ Ä£¼÷ÇÏ´Ù¸é Flex¿Í BisonÀ̶ó´Â ÇÁ·Î±×·¥¿¡ ´ëÇØ¼­µµ ¸î¹ø Á¤µµ´Â µé¾î ºÃÀ» °ÍÀÌ´Ù. Flex´Â Vern Paxon¿¡ ÀÇÇØ¼­ ¸¸µé¾îÁø lex(12)ÀÇ È®Àå µµ±¸°ÝÀÎ ÇÁ·Î±×·¥À̸ç, BisonÀº YACCÀÇ GNU¹öÁ¯°ÝÀÎ ÇÁ·Î±×·¥ÀÌ´Ù. ¿©±â¿¡¼­´Â Lex¿Í yacc(12)ÀÇ È­°®¾îÀüÀ̶ó°í ÇÒ¼ö ÀÖ´Â Bison°ú Flex¿¡ ´ëÇØ¼­ ´Ù·ê °ÍÀÌ´Ù. ¿øÁ¶°ÝÀÎ Yacc¿Í Lex¿ÍÀÇ Â÷ÀÌÁ¡ÀÌ °ÅÀÇ ¾øÀ¸¹Ç·Î ȣȯ¿¡ ¹®Á¦°¡ »ý±âÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¾î¶µç GNUȯ°æ¿¡¼­ÀÇ °³¹ßÀº GNUÅøÀº Bison°ú flex°¡ Á»´õ ÀÚ¿¬½º·´´Ù.

À̵é ÇÁ·Î±×·¥Àº ´ç½ÅÀÌ ¸Å¿ì Áß¿äÇÏ°Ô »ç¿ëÇÏ´Â C ÄÄÆÄÀÏ·¯¿Í °°Àº ÇÁ·Î±×·¥ÀÇ ÀÛ¼º¿¡ Áß¿äÇÏ°Ô »ç¿ëµÇ´Âµ¥, ±× Á߿伺¿¡ ºñÇØ¼­ man ÆäÀÌÁö´Â ½â ÈǸ¢ÇÏÁö ¸øÇؼ­ À̰͸¸ À» °¡Áö°í´Â ÀÌµé µµ±¸¸¦ »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù. ¿©±â¿¡¼­´Â ÀÌµé µµ±¸¸¦ ½ÇÁúÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Á»´õ ½Ç¿ëÀû °üÁ¡¿¡¼­ ´Ù·ê °ÍÀÌ´Ù.


1.1. ÀÌ ¹®¼­¿¡¼­ ÇÒ ¼ö ¾ø´Â °Í

½ÃÁß¿¡´Â ÀÌ¹Ì ´Ù¾çÇÑ Á¾·ùÀÇ Lex¿Í Yacc¸¦ ÁÖÁ¦·Î Çϰí ÀÖ´Â ÁÁÀº Ã¥µéÀÌ ³ª¿Í ÀÖ´Ù.(¿ö³«¿¡³ª Flex/Bison°ú ºñ½ÁÇϱ⠶§¹®¿¡, Àúµé Ã¥À» °¡Áö°í Flex¿Í BisonÀ» ÇнÀÇϱ⵵ ÇÑ´Ù.) ºñ·Ï ÀÌ ¹®¼­°¡ Bison°ú Flex¸¦ ÇнÀÇϴµ¥ ¸¹Àº µµ¿òÀ» ÁÖ±ä ÇϰÚÁö¸¸, À̵é Ã¥º¸´Ù ´õ ³ºÀº Á¤º¸¸¦ Á¦°øÇØÁÖ±ä Èûµé °ÍÀÌ´Ù. À̵é Ã¥Àº ´ëºÎºÐÀÇ °æ¿ì Ã¥ÀÓ°¨À» °¡Áö°í ÀÛ¼ºµÇ¾ú±â ¶§¹®¿¡ ÀÌ ¹®¼­¿¡¼­ Á¦½ÃÇÏÁö ¸øÇÑ ´Ù¸¥ Áß¿äÇÑ Á¤º¸µéÀ» °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â Flex¿Í BisonÀ» Á»´õ ½±°Ô Á¢ÇÒ ¼ö ÀÖ±â À§ÇÑ ÀÔ¹®¼­ Á¤µµ·Î Ȱ¿ëÀ» ÇØÁÖ±æ ¹Ù¶õ´Ù.

¶ÇÇÑ À̹®¼­¸¦ ÀÛ¼ºÇÑ ÀúÀÚ´Â Flex/Bison Àü¹®°¡°¡ ¾Æ´Ï¸ç, °øºÎÇϸ鼭 ÀÌ ¹®¼­¸¦ ÀÛ¼ºÇß´Ù. ÀÌÁ¡À» ¿°µÎ¿¡ µÎ°í ÀÌ ¹®¼­¸¦ Àб⠹ٶõ´Ù. ´ëºÎºÐÀÇ ¿¹Á¦µéÀº µ¹¾Æ°¡´ÂÁö È®ÀÎÇϱâ À§ÇÑ °£´ÜÇÑ ¼öÁØ¿¡¼­ ÀÛ¼ºµÉ °ÍÀÌ´Ù. Á»´õ Çö½Ç°¨ ÀÖ´Â ¿¹Á¦¸¦ Ãß°¡ÇÏ±æ ¿øÇÑ ´Ù¸é ¾ðÁ¦µçÁö ÀÌ ¹®¼­ÀÇ ¿øº»À» ¼öÁ¤ÇÏ´Â Á¤µµ·Î Âü°¡ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


1.3. Flex¿Í Bison

ÇÊÀÚ°¡ ÇÑ»ìÀÌ´ø 1975³â°æ ¹«·Æ ÄÄÆÄÀÏ·¯¸¦ ÀÛ¼ºÇÏ´Â °ÍÀº »ç¶÷ÀÇ ¾Ö°£ÀåÀ» ³ìÀÌ´Â Àΰ£ÀÇ Àγ»·ÂÀÌ ¾îµð±îÁöÀΰ¡¸¦ Å×½ºÆ®ÇÏ´Â °íµµÀÇ ÂüÀ»¼º°ú ÁýÁß·ÂÀ» ÇÊ¿ä·Î ÇÏ´Â ÀÛ¾÷À̾ú´Ù. ÀÌ·¯ÇÑ ÀÏ·ÃÀÇ ÀÛ¾÷À» Á»´õ ½±°Ô ÇϱâÀ§Çؼ­ Johnson°ú Lesk¶õ »ç¶÷µéÀÌ lex¿Í yacc¶ó´Â µµ±¸¸¦ ¸¸µé°Ô µÇ¾ú´Ù. ÀÌ µµ±¸´Â ÄÄÆÄÀÏ·¯ÀÇ ÀÛ¼ºÀ» ¸Å¿ì °£´ÜÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Â ÈǸ¢ÇÑ ±â´ÉÀ» °¡Áö°í ÀÖ¾úÀ¸¸ç °è¼Ó ¹ßÀüÀ» ÇØ¼­ 1986³â°æ Áö±Ý ¿ì¸®°¡ »ç¿ëÇÏ´Â Çö´ëÀûÀÎ ±â´ÉÀ» °¡Áø lex¿Í yacc°¡ ¹ßÇ¥µÇ°Ô µÇ¾ú´Ù. lex¿Í yacc´Â ¸Å¿ì ÈǸ¢ÇÑ µµ±¸ ¿´±â ¶§¹®¿¡ ¾Æ·¡¿Í °°Àº ´Ù¸¥ ¸¹Àº ¹öÁ¯µéÀÌ ¸¸µé¾îÁö°Ô µÇ¾ú´Ù.

  1. Mortice Kern Systems(MKS), http://www.mks.com

  2. (¿ì¸®°¡ ´Ù·ç°íÀÚ ÇÏ´Â)GNU flex, bison

  3. Ming, http://www.mingw.org

  4. ¶Ç´Ù¸¥ lex, yacc¹öÁ¯, http://www.epaperpress.com

ÀÌÁß ÁÖ¸ñÇÒ ¸¸ÇѰÍÀ¸·Î´Â ³ôÀº ǰÁúÀ» Á¦°øÇÏ´Â »ó¿ëÁ¦Ç°ÀÎ MKS¿Í GNU¶óÀ̼¾½ºÇÏ¿¡¼­ ¹èÆ÷µÇ´Â flex,bisonÀÌ´Ù. flex, bisonÀº ÇöÀç ¹öÀü 1.24Àε¥, »ó¿ëÀ¸·Îµµ °áÄÚ ¼Õ»ö¾ø´Â ±â´ÉÀ» Á¦°øÇϰí ÀÖ´Ù. Ming¿Í CygwinÀº À©µµ¿ì ½Ã½ºÅÛ¿¡¼­ GNU¼ÒÇÁÆ®¿þ¾î¸¦ Æ÷ÆÃÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ¿©±â¿¡´Â gcc¿Í g++°°Àº ÄÄÆÄÀÏ·¯°¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç »ó´çÇÑ ¼öÁØÀÇ GNU°³¹ß ȯ°æÀ» Á¦°øÇÑ´Ù.

¿©±â¿¡¼­´Â lex¿Í yaccÀÇ ¿ø¸®¿¡ ´ëÇØ °£´ÜÇÏ°Ô ¼Ò°³Çϵµ·Ï ÇÒ °ÍÀÌ´Ù. ¿ì¸®ÀÇ ¸ñÀûÀÌ Flex¿Í BisonÀÇ »ç¿ë¹æ¹ýÀ̱ä ÇÏÁö¸¸ ¿ö³«¿¡ lex¿Í yaccÀÇ ¿ª»çÀû Àǹ̰¡ ±íÀº °ü°è·Î lex, yacc¸¦ ±âÁØÀ¸·Î Çß´Ù. ±×·¯³ª µµ±¸ÀÇ À̸§ÀÌ Æ²¸®°í ¸¸µé¾î³»´Â ÆÄÀÏÀÇ À̸§ÀÌ Æ²¸° ¿Ü¿¡´Â µ¿ÀÏÇÔÀ¸·Î ¹®Á¦µÉ°Ç ¾øÀ» °ÍÀÌ´Ù.

lex´Â ¾îÈֺм®°ú scanner¸¦ À§ÇÑ CÄڵ带 »ý¼ºÇÑ´Ù. lex´Â ÀÔ·ÂµÈ ¹®ÀÚ¿¡¼­ ¸ÅĪµÇ´Â ¹®ÀÚ¿­ÀÇ ÆÐÅÏÀ» ÀÌ¿ëÇØ¼­ ¹®ÀÚ¿­À» ÅäÅ«À¸·Î º¯È¯ÇÑ´Ù. ÅäÅ«Àº ¹®¹ýÀûÀ¸·Î ´õÀÌ»ó ³ª´­ ¼ö ¾ø´Â ±âº»ÀûÀÎ ¾ð¾î ¿ä¼Ò¸¦ ¸»ÇÑ´Ù. ´ÙÀ½Àº ÄÄÆÄÀÏÀÌ ÀÌ·ç¾îÁö´Â ÀϹÝÀûÀÎ °úÁ¤ÀÌ´Ù. ÅäÅ«À» ¸¸µé¾î³»´Â °úÁ¤À» ÁÖÀÇ ±í°Ô º¸±â ¹Ù¶õ´Ù.

½Éº¼ Å×À̺íÀ» ÀÌ¿ëÇØ¼­ lex´Â ÀԷµǴ ¹®ÀÚ¿­ÀÇ Æ¯Â¡À» °¡Á®¿Â´Ù. ½Éº¼ Å×À̺íÀº ¹®ÀÚ¿­ÀÌ ¼ýÀÚÀÎÁö ´Ü¾îÀÎÁö¿Í °°Àº ŸÀÔ¿¡ ´ëÇÑ Á¤º¸¿Í ¾î¶² º¯¼ö¸¦ ÅëÇØ ¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ ¼ö ÀÖÀ» °ÍÀÎÁö µîÀ» Á¤ÀÇ ÇÑ´Ù.

그림 1. ÄÄÆÄÀÏ °úÁ¤

Yacc´Â ±¸¹®ºÐ¼®°ú ÆÄ¼­¸¦ À§ÇÑ CÄڵ带 »ý¼ºÇÑ´Ù. yacc´Â lex·Î ºÎÅÍ ÅäÅ«À» ¹Þ¾ÆµéÀ̰í À̰ÍÀ» ¹®¹ý·ê¿¡ ³Ö°í µ¹·Á¼­ ±¸¹®Æ®¸®(syntax tree)¸¦ »ý¼ºÇÑ´Ù. ±¸¹®Æ®¸®´Â ÅäÅ«±¸Á¶Ã¼ÀÇÀÇ °èÃþÀûÀÎ ±¸Á¶¸¦ ¸¸µé°Ô µÈ´Ù. À§ÀÇ ±×¸²À» º¸¸é ¿¬»êÀÚ¿Í °ª¿¡ µû¶ó °èÃþ ±¸Á¶¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½ ´Ü°è¿¡¼­ Äڵ带 »ý¼º(code generator)ÇÏ°Ô µÈ´Ù. ÄÚµå »ý¼ºÀº ±íÀÌ ¿ì¼±À¸·Î ÀÌ·ç¾îÁö°Ô µÈ´Ù. ¸¸µé¾îÁö´Â ÄÚµå´Â ½Ã½ºÅÛÀÇ ¾î¼Àºí·¯°¡ ÇØ¼®°¡´ÉÇÑ ¾î¼Àºí¸®ÄÚµå ȤÀº ±â°è¾î Äڵ尡 µÈ´Ù.

그림 2. lex¿Í yacc·Î ºÎÅÍ ÄÄÆÄÀÏ·¯¸¦ ÀÛ¼ºÇÏ´Â °úÁ¤

À§ÀÇ ±×¸²Àº lex¿Í yacc¿¡ ÀÇÇØ¼­ »ç¿ëµÇ´Â ÆÄÀÏ À̸§ÀÇ ±ÔÄ¢ÀÌ´Ù. ¿¹¸¦ µé¾î BASIC ÄÄÆÄÀÏ·¯¸¦ ¸¸µç´Ù°í °¡Á¤ÇØ º¸ÀÚ. ¸ÕÀú ¿ì¸®´Â ÆÐÅϸÅĪ ±ÔÄ¢À» °¡Áø bas.i¶ó´Â lexÆÄÀÏÀ» ¸¸µé °ÍÀÌ´Ù. ±×¸®°í ¹®¹ý±ÔÄ¢À» À§Çؼ­ basy.y¶ó´Â yaccÆÄÀÏÀ» ¸¸µé °ÍÀÌ´Ù. ±×¸®°í ¸¶Áö¸·À¸·Î gcc¸¦ ÀÌ¿ëÇØ¼­ basc ¶ó´Â ÄÄÆÄÀÏ·¯¸¦ ¸¸µé°Ô µÈ´Ù.
yacc -d bas.y                  # create y.tab.h, y.tab.c
lex bas.l                      # create lex.yy.c 
gcc lex.yy.c y.tab.c -o basc   # compile/link
			
yacc´Â bas.y·Î ºÎÅÍ ¹®¹ý ±ÔÄ¢À» Àо°í ÆÄ¼­¸¦ »ý¼ºÇÑ´Ù. ÆÄ¼­ÀÇ À̸§Àº y.tab.cÀε¥ ¿©±â¿¡´Â yyparse¶ó´Â ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù. -d ¿É¼ÇÀº ÅäÅ«¿¡ ´ëÇÑ °¢Á¾ ¼±¾ðÀ» °¡Áø Çì´õÆÄÀÏÀÎ y.tab.h¸¦ »ý¼º½Ã۱â À§Çؼ­ ÇÊ¿äÇÑ ¿É¼ÇÀÌ´Ù. ÀÌ Çì´õÆÛÀÏÀº lex¿¡¼­ yacc¸¦ ¿¬°áÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. lex´Â ¾îÈֺм®±â¿ªÇÒÀ» ÇÏ´Â yylexÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â lex.yy.c ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.

¸¶Áö¸·À¸·Î gcc¿¡ ÀÇÇØ¼­ lexer¿Í parserÀÌ ÄÄÆÄÀÏ µÈÈÄ ¸µÅ©µÇ¾î¼­ basc½ÇÇàÆÄÀÏÀ» ¸¸µé°Ô µÈ´Ù. ÀÛ¼ºµÈ ÄÄÆÄÀÏ·¯¸¦ ½ÇÇà ½Ã۸é mainÇÔ¼ö¿¡¼­ yyparse¸¦ È£ÃâÇϰí yyparse´Â ÀÚµ¿ÀûÀ¸·Î yylex¸¦ È£ÃâÇØ¼­ ÅäÅ«À» ¾ò¾î³½´Ù.


2. Flex

FlexÀÇ ¿øÁ¶´Â Lex·Î ÈçÈ÷ Lex generate¶ó°í Çϸç 'Lexer'¶ó°í ºÎ¸£±âµµ ÇÑ´Ù. GNU¹öÁ¯Àº ¿©±â¿¡ F(Fast)¸¦ ºÙ¿©¼­ ÀÌÀü ¹öÁ¯ÀÇ Lex¿Í ±¸ºÐÇϰí ÀÖ´Ù. ÁÖ·Î ¹®ÀÚ¿­À» ¹Þ¾ÆµéÀÌ°í ¹®ÀÚ¿­Áß¿¡¼­ ¿øÇÏ´Â Çü½ÄÀÇ ¹®ÀÚÀÇ Á¶ÇÕÀÌ ÀÖ´ÂÁö È®ÀÎÇØ¼­ ¾î¶² ÇÔ¼ö(ÀÛ¾÷)¸¦ ½ÇÇà½ÃŰ´Â ÀÏÀ» ÇÑ´Ù. ´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

%{
#include <stdio.h>
%}

%%
stop printf("Stop command receive\n");
start printf("Start command receive\n");
%%
		
ù¹øÂ° ¼½¼ÇÀ» º¸¸é %{¿Í %}¸¦ ÇѽÖÀ¸·Î ÇÏ°í ±× ¾È¿¡ include°¡ µé¾î°¡ ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. À̰ÍÀº ³ªÁß¿¡ »ç¿ëµÉ printf(3)ÇÔ¼ö¸¦ À§Çؼ­ »ç¿ëµÈ´Ù. ¾Æ½Ã´Ù ½ÃÇÇ printfÇÔ¼ö´Â stdio.h¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

´ÙÀ½ ¼½¼ÇÀº %%¸¦ ±¸ºÐÀÚ·Î ÇØ¼­ ½ÃÀ۵Ǵµ¥, ù¹øÂ°´Â 'stop'À̶ó´Â ¹®ÀÚ¿­À» Ű·Î ½ÃÀÛÇϰí ÀÖ´Ù. À̰ÍÀº ¹®ÀÚ¿­ÀÇ ÀÔ·ÂÁß¿¡ 'stop'¹®ÀÚ¿­À» ´ë¸éÇÒ °æ¿ì µÚ¿¡ ÀÖ´Â printf()¸¦ ½ÇÇàÇ϶ó´Â Àǹ̸¦ °¡Áø´Ù.

stop°ú ¸¶Âù°¡Áö·Î 'start'¿¡ ´ëÇØ¼­µµ printf()¹®À» ½ÇÇàÇ϶ó°í ¼±¾ðµÇ¾î ÀÖ´Ù.

À§ÀÇ ¹®¹ýÀº lex¿¡¼­ »ç¿ëµÉ ¼ö ÀÖ´Â ¹®¹ýÀ¸·Î, ÀÌ°É ½ÇÁ¦ »ç¿ëÇϱâ À§Çؼ­´Â C°¡ ÀνÄÇÒ ¼ö ÀÖ´Â ¹®¹ýÀ¸·Î º¯°æ½ÃÄÑÁà¾ß ÇÑ´Ù. ÀÌ·¯ÇÑÀÏ ¿ª½Ã lex°¡ ´ã´çÇÑ´Ù. ÀÏÁ¾ÀÇ ¼±Ã³¸®±â ¶ó°í ÇÒ ¼ö ÀÖ´Ù.

# flex example1.l
# gcc lex.yy.c -o example1 -lfl 
		

참고: ¸¸¾à flex´ë½Å¿¡ lex¸¦ »ç¿ëÇÏ±æ ¿øÇÑ´Ù¸é -lfl ´ë½Å -llÀ» »ç¿ëÇÏ¸é µÈ´Ù.

ÀÌÁ¦ example1¶ó´Â ½ÇÇàÆÄÀÏÀÌ »ý¼ºµÉ °ÍÀÌ´Ù. ÀÌ ÆÄÀÏÀ» ½ÇÇà½Ã۸é Ç¥ÁØÀÔ·ÂÀ» ¹Þ¾ÆµéÀ̴µ¥, stop/start¿Í °°Àº ¹®ÀÚ¿­À» ¸¸³µÀ» ¶§ lex¹®¿¡¼­ Á¤ÀÇÇÑ printf() ¹®À» ½ÇÇà½ÃŰ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÔ·ÂÀ» Áß´ÜÇÏ°í ½ÍÀ» ¶§´Â (^D)¸¦ ÀÔ·ÂÇϵµ·Ï ÇÑ´Ù.
# ./example1 
start program
Start command receive
 program
stopped
Stop command receive
ped
^D
		


2.1. Á¤±ÔÇ¥ÇöÀ» ÀÌ¿ëÇÑ ¸ÅĪ

À̹ø ¿¹Á¦´Â ¾Æ¸¶µµ ¸Å¿ì À¯¿ëÇÏ°Ô ÀÀ¿ëÇÒ ¼ö ÀÖ´Â ¿¹Á¦·Î lex¿¡¼­ÀÇ Á¤±ÔÇ¥Çö Áö¿ø¿¡ ´ëÇÑ ¹æ¹ýÀ» ´ã°í ÀÖ´Ù.

%{
#include <stdio.h>
%}

%%
[0123456789]+           printf("NUMBER\n");
[a-zA-Z][a-zA-Z0-9]*    printf("WORD\n");
%%
			
ÀÌ Lex ÆÄÀÏÀº "¹®ÀÚ¿­(WORD)"¿Í "¼ýÀÚ"(NUMBER) 2Á¾·ù¿¡ ´ëÇÑ ¸ÅĪ Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·¯ÇÑ °Ë»ç¸¦ (¼ÒÀ§¸»ÇÏ´Â)¼ÕÄÚµùÀ¸·Î ±¸ÇöÇÒ·Á°í ÇÏ¸é »ó´çÈ÷ ±ÍÂúÀº ÀÛ¾÷ÀÌ ÇÊ¿äÇϰÚÁö¸¸ ¿©±â¿¡¼­´Â À¯´Ð½º¿¡¼­ ÀϹÝÀûÀ¸·Î »ç¿ëÇÏ´Â Á¤±ÔÇ¥ÇöÆÐÅÏÀ» ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô Ã³¸®ÇϰíÀÖ´Ù. Lex´Â ¼ýÀÚ¿¡ ´ëÇÑ ¸ÅĪÀ» °Ë»çÇϱâ À§Çؼ­ ´ÙÀ½°ú °°Àº Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇϰí ÀÖ´Ù.
[0123456789]+
			
À̰ÍÀº 0123456789ÀÇ ±×·ì¿¡ ´ëÇØ¼­ ÇϳªÀÌ»óÀÌ ¹ß°ßµÇ¾úÀ» ¶§ ¸¸Á·½Ã۶ó´Â Àǹ̷Π´ÙÀ½°ú °°ÀÌ ´Ü¼øÇÏ°Ô Ç¥ÇöÇÒ ¼öµµ ÀÖ´Ù.
[0-9]+
			
¹®ÀÚ¿¡ ´ëÇÑ ¸ÅĪÀ» À§ÇÑ Á¤±ÔÇ¥Çö½ÄÀº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
[a-zA-Z][a-zA-Z0-9]* 
			
ù¹øÂ° ºÎºÐÀº 'a'¿¡¼­ 'z'¼Ò¹®ÀÚ ÇϳªÈ¤Àº 'A'¿¡¼­ 'Z'±îÁöÀÇ ¹®ÀÚÁï ¸ðµç ¿µ¹® ¾ËÆÄºª ´Ü¾î¸¦ ¶æÇÑ´Ù. µÎ¹øÂ° ºÎºÐÀº ¸ðµç¿µ¹®ÀÚ¿Í ¼ýÀÚ±îÁö¸¦ ¶æÇÑ´Ù. ¸¶Áö¸·ÀÇ º°Ç¥("*")´Â 0°³ ÀÌ»óÀÇ ¹ß°ßÀ» ¶æÇÑ´Ù. °á·ÐÀûÀ¸·Î ÇϳªÀÌ»óÀÇ ¿µ¹®°ú ¼ýÀÚ·Î ±¸¼ºµÈ ´Ü¾îµéÁß ¿¡¼­ óÀ½ ù±ÛÀÚ°¡ ¿µ¹®À¸·Î ½ÃÀÛÇÏ´Â ´Ü¾î¸¦ "¹®ÀÚ¿­"·Î º¸°í ¸ÅĪÀ» ½ÃŰ°Ú´Ù´Â Àǹ̰¡ µÈ´Ù.

À§ÀÇ Á¤±ÔÇ¥Çö¿¡¼­ "+"¿Í "*"ÀÇ Â÷À̸¦ ºÐ¸íÈ÷ ÇØµÑÇʿ䰡 ÀÖ´Ù. "+"´Â Çϳª ÀÌ»ó ¹ß°ßµÇ¾î¾ß ÇÏ´Â°É ÀǹÌÇϸç, "*"´Â 0°³ ÀÌ»ó ¹ß°ßµÇ¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.

À§ LexÆÄÀÏÀ» example2.l·Î ÀúÀåÇÑ´ÙÀ½ ÄÄÆÄÀÏÇØ¼­ ½ÇÇà½ÃÄÑ º¸ÀÚ.

# ./example1 
foo
WORD

bar
WORD

123
NUMBER

bar123
WORD

123bar
NUMBER
WORD
			
ÀÔ·ÂÁß¿¡ °ø¹é¹®ÀÚ(½ºÆäÀ̽º¹Ù)¸¦ Æ÷ÇÔ½ÃŰ¸é °ø¹é¹®ÀÚ´Â ±×´ë·Î Ãâ·ÂµÊÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌÀ¯´Â ¸ðµç whitespace´Â ¾î¶² °Í°úµµ ¸ÅνÃŰÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀÌµé ¹®ÀÚ´Â ´Ü¼ø Ãâ·Â½ÃŲ´Ù.

Flex¸¦ Á¦´ë·Î ´Ù·ç±â À§Çؼ­´Â Á¤±ÔÇ¥Çö¿¡ ´ëÇÑ ¾î´ÀÁ¤µµÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ¾î¾ßÇÑ´Ù. Á¤±ÔÇ¥ÇöÀ» È¿°úÀûÀ¸·Î ÀÍÈ÷´Â °¡Àå ÁÁÀº ¹æ¹ýÀº Perl ¾ð¾î¸¦ ÀÌ¿ëÇØ¼­ Á¤±ÔÇ¥Çö °ü·Ã ÇÁ·Î±×·¥À» ¸¸µé¾î º¸´Â°Ô µÉ°ÍÀÌ´Ù. ¶ÇÇÑ ½ÃÁßÀÇ ¸¹Àº Perl°ü·Ã Ã¥µéÀÌ »ó´çºÎºÐÀ» Á¤±ÔÇ¥Çö¿¡ ÇÒ¾ÖÇϰí ÀÖÀ¸¹Ç·Î À̵é Ã¥À» ±¸ÀÔÇØ¼­ ÇнÀÇÏ´Â °Íµµ ÁÁÀº ¹æ¹ýÀÌ µÉ°ÍÀÌ´Ù.


2.1.1. ²À ÇÊ¿äÇÑ Á¤±ÔÇ¥Çö

Á¤±ÔÇ¥ÇöÀº ¸Å¿ì ±¤¹üÀ§ÇÑ ÁÖÁ¦ÀÓÀ¸·Î ¿©±â¿¡¼­´Â ¹Ýµå½Ã ÇÊ¿äÇÑ Á¤±ÔÇ¥Çö ±ÔÄ¢¿¡ ´ëÇØ¼­¸¸ °£´ÜÈ÷ Á¤¸®Çϱâ·Î ÇϰڴÙ. Á¤±ÔÇ¥Çö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â Á¤±ÔÇ¥ÇöÀ» Âü°íÇϱ⠹ٶõ´Ù.

표 1. ÀÚÁÖ »ç¿ëµÇ´Â ÆÐÅϸÅĪ

.°³Ç๮ÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ
\n°³Ç๮ÀÚ
*0ȤÀº ±× ÀÌ»óÀÇ ÀÏÄ¡
+Çѹø ȤÀº ±× ÀÌ»óÀÇ ÀÏÄ¡
?0ȤÀº ÇѹøÀÇ ÀÏÄ¡
^¶óÀÎÀÇ Ã³À½¿¡¼­ ÀÏÄ¡
$¶óÀÎÀÇ ³¡¿¡¼­ ÀÏÄ¡
a|ba ¶Ç´Â b
(ab)+ab¿Í ÇϳªÀÌ»ó ÀÏÄ¡
[]¹®ÀÚ Å¬·¡½ºÀÇ ÁöÁ¤

표 2. ÆÐÅϹÌĪÀÇ »ç¿ë ¿¹

Ç¥Çö¸ÅĪ
abcabc
abc*ab abc abcc abccc ...
a(bc)+abc abcbc abcbcbc ...
a(bc)?a abc
[abc]a b c
[a-z]a¿¡¼­ z±îÁö
[a\-z]a, -, z Áß Çϳª
[a\-z]a, -, z Áß Çϳª
[-az]-, a, z Áß Çϳª
[a-zA-Z0-9]+ÇϳªÀÌ»óÀÇ ¸ðµç ¿µ¹®ÀÚ¿Í ¼ýÀÚ
[\t\n]+whitespace ¹®ÀÚ
[^ab]a¿Í b¸¦ Á¦¿ÜÇÑ ¸ðµç
[a^b]a, ^, b Áß Çϳª
[a|b]a, |, b Áß Çϳª
flex¸¦ Á¦´ë·Î »ç¿ëÇϱâ À§Çؼ­´Â À§ÀÇ Ç¥¿¡ Á¤¸®µÈ ÀÚÁÖ»ç¿ëµÇ´Â ÆÐÅϸÅĪÀÇ ³»¿ëµéÀº ±âº»ÀûÀ¸·Î ¼÷ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù. µÎ¹øÂ° Ç¥¿¡ ÀÖ´Â°Ç ÆÐÅϸÅĪÀÇ »ç¿ë¿¹ÀÌ´Ù.


2.2. º¹ÀâÇÑ ¹®ÀåÀÇ ÆÄ½Ì

À̹ø¿¡´Â ¾Æ·¡¿Í °°Àº Á»´õ º¹ÀâÇÑ ¹®ÀåÀ» ÆÄ½ÌÇØ º¸µµ·Ï ÇϰڴÙ.(bind¸¦ À§ÇÑ ¼³Á¤ÆÄÀÏÀÇ ÀϺκÐÀÌ´Ù)

logging {
	category lame-servers { null; };
	category cname { null; };
};

zone "." {
	type hint;
	file "/etc/bind/db.root";
};
			

Flex¹®À» È®½ÇÈ÷ ÀÛ¼ºÇϱâ À§Çؼ­ À§ÀÇ ºÐ¼®¹®ÀÚ¿­¿¡¼­ »ç¿ëµÇ°í ÀÖ´Â ÅäÅ«µé¿¡ ´ëÇÑ Ä«Å×°í¸®¸¦ ¸¸µé Çʿ䰡 ÀÖ´Ù.

  • 'zone', 'type' °°Àº ¹®ÀÚ¿­

  • '/etc/bind/db.root' °°Àº ÆÄÀÏÀ̸§

  • ÆÄÀÏÀ̸§À» °¨½Î´Âµ¥ »ç¿ëÇÏ´Â ÄõÅÍ(") ¹®ÀÚ

  • {, Áß°ýÈ£ ¿­±â

  • }, Áß°ýÈ£ ´Ý±â

  • ;, ¼¼¹ÌÄÝ·Ð

´ÙÀ½Àº À§ÀÇ Ä«Å×°í¸®¸¦ ¸¸Á·½ÃŰ´Â LexÆÄÀÏÀÌ´Ù. ÆÄÀϸíÀº example3.l·Î ÇÏÀÚ.

%{
#include <stdio.h>
%}

%%
[a-zA-Z][a-zA-Z0-9]*    printf("WORD ");
[a-zA-Z0-9\/.-]+        printf("FILENAME ");
\"                      printf("QUOTE ");
\{                      printf("OBRACE ");
\}                      printf("EBRACE ");
;                       printf("SEMICOLON ");
\n                      printf("\n");
[ \t]+                  /* ignore whitespace */;
%%
			
À§ÀÇ lex ÆÄÀÏÀ» ÄÄÆÄÀÏÇѵڿ¡ Å×½ºÆ®Çغ¸¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
# ./example3 < test.txt
WORD OBRACE 
WORD FILENAME OBRACE WORD SEMICOLON EBRACE SEMICOLON 
WORD WORD OBRACE WORD SEMICOLON EBRACE SEMICOLON 
EBRACE SEMICOLON 

WORD QUOTE FILENAME QUOTE OBRACE 
WORD WORD SEMICOLON 
WORD QUOTE FILENAME QUOTE SEMICOLON 
EBRACE SEMICOLON 
			
À§ÀÇ °á°ú¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖµíÀÌ ÀϹݼ³Á¤ÆÄÀÏ Çü½ÄÀ» °¡Áö´Â ²Ï º¹ÀâÇÑ ¹®Àåµµ ¾î·ÆÁö ¾Ê°Ô ÆÄ½ÌµÊÀ» ¾Ë ¼ö ÀÖ´Ù.


2.3. flex¿¡ ¹Ì¸® Á¤ÀÇµÈ º¯¼öµé

Áö±Ý±îÁöÀÇ ³»¿ëÀ» º¸¸é ¸î°³ flex¿¡¼­ Á¤ÀÇÇØ¼­ »ç¿ëÇÏ´Â º¯¼ö¿Í ÇÔ¼öµéÀÌ º¸ÀÏ °ÍÀÌ´Ù. À̰͵éÀ» Ç¥·Î Á¤¸®ÇØ µÎ¾úÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.

표 3. flex¿¡¼­ ¹Ì¸® Á¤ÀÇµÈ °ªµé

int yylex(void)lexer¸¦ È£ÃâÇϰí ÅäÅ«À» ¸®ÅÏÇÑ´Ù.
char *yytext¸ÅĪµÈ ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍ
yyleng¸ÅĪµÈ ¹®ÀÚ¿­ÀÇ ±æÀÌ
yylvalÅäÅ«¿¡ ´ëÇÑ Á¤º¸ °ª
int yywrap(void) 
FILE *yyoutÃâ·Â ÆÄÀÏ
FILE *yyinÀÔ·Â ÆÄÀÏ
INITIALinitial start condition
BEGINcondition switch start condition
ECHO¸ÅĪµÈ ¹®ÀÚ¿­À» ¾´´Ù.


2.4. Áö±Ý±îÁö ´Ù·é ³»¿ëµé

Áö±Ý±îÁöÀÇ ³»¿ëµéÀ» ÅëÇÏ¿© Lex´Â ÀÓÀÇÀÇ ÀÔ·ÂÀ» ¹Þ¾Æµé¿©¼­ °¢°¢ÀÇ ºÎºÐÀ» Àǹ̸¦ °áÁ¤ÇÒ ¼ö ÀÖÀ½À» ¾Ë¾Ò´Ù. ÀÌ·¯ÇÑ °ÍÀ» 'Tokenizing'¶ó°í ÇÑ´Ù.


3. Bison

BisonÀÇ ¿øÁ¶°ÝÀÎ YACC¿¡ ´ëÇØ¼­ ¸ÕÀú ¾Ë¾Æº¸±â·Î ÇÏÀÚ. YACC´Â Yet Another Compiler CompilerÀÇ ¾àÀÚ·Î ÄÄÆÄÀÏ·¯¸¦ »ý¼ºÀ» À§ÇÑ ÇÁ·Î±×·¥ ÀÌ´Ù. compiler-generator ȤÀº compiler-compilerÀ̶ó°í ºÎ¸£±âµµ ÇÑ´Ù. yacc´Â lex¿¡ ÀÇÇØ¼­ ¾ò¾îÁø tokenµéÀÇ °ü°è¸¦ ±¸¼ºÇÏ´Â "±¸¹®ºÐ¼®±â"¸¦ »ý¼ºÇÏ´Â ÅøÀÌ´Ù. yacc°¡ ³»ºÎÀûÀ¸·Î tokenÀ» ¾ò±â À§Çؼ­ lex¸¦ »ç¿ëÇϴµ¥, lex¿Í yacc, flex¿Í bisonÀ» ÇÑ ¹­À½À¸·Î ÇØ¼­ ´Ù·ç´Â ÀÌÀ¯°¡ µÈ´Ù. lex¸¦ È£ÃâÇϱ⠶§¹®¿¡ lexÀÇ »óÀ§¿¡ À§Ä¡ÇÏ°Ô µÈ´Ù. BisonÀº ÀÌ·¯ÇÑ ÀÏÀ» ÇÏ´Â YACCÀÇ GNU¹öÁ¯À̸ç, ÇÏ´ÂÀÏ ¿É¼Çµî¿¡ À־ °ÅÀÇ µ¿ÀÏÇÏ´Ù.

Bison(yacc)´Â BNF (Backus Naur Form)À» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÏÀ» ¼öÇàÇÑ´Ù. ÀÌ ±â¼úÀº John Backus ¿Í Peter Naur¿¡ ÀÇÇØ¼­ ¸¸µé¾î Á³À¸¸ç ALGOL60 ¾ð¾î¸¦ Á¦ÀÛÇϴµ¥ »ç¿ëµÇ¾ú´Ù. BNF ¹®¹ýÀº ÀÚÀ¯·Î¿î ¹®¸Æ(context-free) ¾ð¾î¸¦ Ç¥ÇöÇϴµ¥ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. Çö´ëÀÇ ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â BNF¸¦ ÀÌ¿ëÇØ¼­ ¹®¸ÆÀ» Ç¥ÇöÇϰí ÀÖ´Ù.


3.1. °£´ÜÇÑ ¿Âµµ Á¶Àý±â

BisonÀÇ ¿ëµµ¸¦ È®ÀÎÇϱâ À§Çؼ­ °£´ÜÇÑ ¿Âµµ Á¶Àý±â¸¦ À§ÇÑ ¾ð¾î¸¦ ¸¸µå´Â °úÁ¤À» ¿¹·Î µé¾î º¸°Ú´Ù. ¿Âµµ Á¶Àý±â¸¦ ¸¸µé±â À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ 3°³ÀÇ ¼¼¼ÇÀÌ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

heat on
	Heater on !
heat off
	Heater off !
target temperature 22
	New temperature set !
			
À§¿¡¼­ ¾òÀ» ¼ö ÀÖ´Â tokenÀº heat, on/off(»óÅÂ), target, temperature, ¼ýÀÚ(¿Âµµ ¼³Á¤¿ë) ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.

À§ÀÇ ÅäÅ«À» ºÐ¸®Çϱâ À§Çؼ­ ´ÙÀ½°ú °°Àº lex ÆÄÀÏÀ» ÀÛ¼ºÇϰí example4.l·Î ÀúÀåÇϵµ·Ï ÇÑ´Ù.

%{
#include <stdio.h>
#include "example4.tab.h"
%}
%%
[0-9]+                  return NUMBER;
heat                    return TOKHEAT;
on|off                  return STATE;
target                  return TOKTARGET;
temperature             return TOKTEMPERATURE;
\n                      /* ignore end of line */;
[ \t]+                  /* ignore whitespace */;
%%
			
À§ÀÇ Äڵ忡¼­ ±âÁ¸°ú Å©°Ô ´Þ¶óÁø Á¡À» µÎ°¡Áö ¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿ì¼± example.tab.h ¶ó´Â ÆÄÀÏÀÌ ÀÎŬ·çµå µÇ¾î ÀÖ´Ù. ±×¸®°í printf()´ë½Å¿¡ tokenÀÇ À̸§À» ¸®ÅÏÇϰí ÀÖ´Ù. ÀÌ·¸°Ô ÅäÅ«ÀÇ °ªÀ» ¸®ÅÏÇÏ´Â ÀÌÀ¯´Â bisionÀÌ tokenÀÇ Á¤º¸¸¦ ¹Þ¾Æ¼­ À̸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï Çϱâ À§ÇÔÀÌ´Ù. example4.tab.h¿¡´Â °¢ token¿¡ ´ëÇØ¼­ bisonÀÌ ¾î¶»°Ô ó¸®ÇØ¾ß ÇÒ°ÍÀÎÁö¿¡ ´ëÇÑ Á¤º¸°¡ µé¾î°£´Ù.

bison ÄÚµå´Â Å©°Ô 3°¡Áö ºÎºÐÀ¸·Î ÀÌ·ç¾îÁø´Ù.

... Á¤ÀÇ(definitions) ...
%%
... ±ÔÄ¢(rules) ...
%%
... ÇÔ¼öµé(subroutines) ...
			
Á¤ÀÇ ºÎºÐ¿¡¼­´Â ÅäÅ«°ú °¢Á¾ »ó¼ö¸¦ ¼±¾ðÇÑ´Ù. ±×¸®°í CÄڵ带 Æ÷ÇÔ½Ãų¼ö Àִµ¥, ÀÌ·²°æ¿ì %{¿Í %} »çÀÌ¿¡ ÇØ´ç CÄڵ带 Æ÷ÇÔ½ÃŰ¸é µÈ´Ù. BNF ¹®¹ýÀº rule ¼½¼Ç¿¡ À§Ä¡Çϸç, ÇÔ¼ö ¼½¼Ç¿¡ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ Ãß°¡½Ãų ¼ö ÀÖ´Ù.

example4.tab.h¿¡ ´ëÇØ¼­ ¿ì¸®°¡ ½Å°æ¾µ ÇÊ¿ä´Â ¾ø´Ù. bison¹®¹ýÆÄÀÏÀ» ±ÔÄ¢´ë·Î ÀÛ¼ºÇØÁÖ°í³ª¼­ bison¸¦ µ¹¸®¸é example4.tab.h´Â ÀÚµ¿ÀûÀ¸·Î »ý¼ºµÇ±â ¶§¹®ÀÌ´Ù. ´ÙÀ½Àº À§ÀÇ ÅäÅ«ÀÇ Á¤º¸¸¦ ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÀÛ¼ºµÈ bison ¹®¹ý ÆÄÀÏÀÌ´Ù.

commands: /* empty */
        | commands command
        ;

command:
        heat_switch
        |
        target_set
        ;

heat_switch:
        TOKHEAT STATE
        {
                printf("\tHeat turned on or off\n");
        }
        ;

target_set:
        TOKTARGET TOKTEMPERATURE NUMBER
        {
                printf("\tTemperature set\n");
        }
        ;
			
ù¹øÂ° ºÎºÐÀ» 'root'¶ó°í ºÎ¸£µµ·Ï ÇϰڴÙ. ¿©±â¿¡¼­ ¿ì¸®´Â commands ¶ó´Â ·ê »ç¿ëÇßÀ¸¸ç, ±¸¼º¿ä¼Ò·Î command¸¦ °¡Áö°í ÀÖ´Ù.

µÎ¹øÂ° ·ê¿¡¼­´Â command¿¡ ´ëÇØ¼­ Á¤ÀÇÇϰí ÀÖ´Ù. ¿©±â¿¡¼­´Â heat_switch¿Í target_setµÎ°³ÀÇ ¸í·É¸¸À» Á¤ÀÇÇÑ´Ù. ÀÌµé ¸í·ÉÀ» ¼±¾ðÇϴµ¥ '|'ÀÌ »ç¿ëµÇ°í Àִµ¥, ÀÌ´Â command°¡ heat_switch ¶Ç´Â target_set¸¦ ±¸¼º¿ä¼Ò·Î °¡Áö°í ÀÖÀ½À» ÀǹÌÇÑ´Ù.

heat_switch´Â HEAT token¿¡ ´ëÇÑ Ã³¸®¸¦ ´ã´çÇÏ´Â ±¸¼º¿ä¼Ò·Î 'heat'¿Í state ÅäÅ«ÀÌ ¿Ã °æ¿ì À̸¦ ½ÇÇàÇϵµ·Ï Çß´Ù. ÀÌ´Â È÷Å͸¦ ۰í ÄÓ¶§ 2°³ÀÇ ÅäÅ«À¸·Î ÀÌ·ç¾îÁö±â ¶§¹®ÀÌ´Ù.

¿Âµµ¸¦ ¼³Á¤ÇÏ´Â ¸í·ÉÀº 'target'°ú targetÀ¸·Î ÁöÁ¤ÇÒ '°´Ã¼', ±×¸®°í '°ª'ÀÇ 3°³ÀÇ °´Ã¼·Î ÀÌ·ç¾îÁø´Ù. À̸¦ À§Çؼ­ 3°³ÀÇ ÅäÅ«ÀÌ ¸¸Á·ÇÒ ¶§ target_setÀÌ ½ÇÇàµÇµµ·Ï ·êÀ» ¸¸µé¾ú´Ù.


3.1.1. ¿ÏÀüÇÑ Bison ÆÄÀÏ

´ÙÀ½Àº ÀÌ»óÀÇ ¸ðµç ³»¿ëÀ» Á¾ÇÕÇÑ Bison ÆÄÀÏÀÌ´Ù.

%{
#include <stdio.h>
#include <string.h>
 
void yyerror(const char *str)
{
	fprintf(stderr,"error: %s\n",str);
}
 
int yywrap()
{
	return 1;
} 
  
main()
{
	yyparse();
} 
%}

%token NUMBER TOKHEAT STATE TOKTARGET TOKTEMPERATURE
%%
commands: /* empty */
	| commands command
	;

command:
	heat_switch
	|
	target_set
	;

heat_switch:
	TOKHEAT STATE
	{
		printf("\tHeat turned on or off\n");
	}
	;

target_set:
	TOKTARGET TOKTEMPERATURE NUMBER
	{
		printf("\tTemperature set\n");
	}
	;
				
yyerror()ÇÔ¼ö´Â Bison¿¡¼­ ¿¡·¯¸¦ ¹ß°ßÇßÀ» ¶§, ¿¡·¯¸¦ µÇµ¹·ÁÁØ´Ù. ÀÎÀÚ·Î ÁÖ¾îÁö´Â strÀ» Ãâ·ÂÇØ º½À¸·Î½á ¿ì¸®´Â °£´ÜÇÏ°Ô ¿¡·¯ÀÇ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

yywrap()´Â ´Ù¸¥ ÆÄÀÏ·Î ºÎÅÍ °è¼ÓÀûÀ¸·Î Àб⸦ ¼öÇàÇϰíÀÚ ÇÒ¶§ »ç¿ëÇÑ´Ù.

mainÇÔ¼ö°¡ È£ÃâµÇ¾ú´Ù. mainÇÔ¼ö´Â ´ÜÁö yyparse¸¸À» È£ÃâÇÏÁö¸¸ ¿ì¸®°¡ Áö±Ý±îÁö ¸¸µé¾ú´ø ·êÀ» ÀÌ¿ëÇØ¼­ ÀԷµǴ ¹®ÀÚ¿­À» ÀÌ¿ëÇØ¼­ ÀÛ¾÷À» ¼öÇàÇÑ´Ù.

¸¶Áö¸·À¸·Î ¿ì¸®°¡ »ç¿ëÇÏ°ÔµÉ ÅäÅ«À» ¼±¾ðÇÏ¿´´Ù. Áö±Ý±îÁöÀÇ ¸ðµç³»¿ëÀº yacc ¸¦ -d ¿É¼ÇÀ» ÁÖ°í ½ÇÇàÇÔÀ¸·Î½á, y.tab.h¿¡ ¾²¿©Áö°Ô µÈ´Ù.

ÄÄÆÄÀÏÀº ¾Æ·¡¿Í °°ÀÌ ÀÌ·ç¾îÁø´Ù.

# flex example4.l
# bison -d example4.y
# gcc lex.yy.c example4.tab.c -o example4
				
ÀÌÁ¦ ¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥ÀÌ Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö Å×½ºÆ® ÇØº¸µµ·Ï ÇÏÀÚ.
# ./example4 
heat on
        Heat turned on or off
heat off
        Heat turned on or off
target temperature 10
        Temperature set
target humidity 20
error: parse error
				
¿ì¸®°¡ ¸¸µç ÇÁ·Î±×·¥Àº ±×·° Àú·° µ¹¾Æ°¡Áö¸¸ ¾ÆÁ÷ ¿Ïº®ÇÏÁö ¾ÊÀ½À» ¾Ë ¼ö ÀÖ´Ù. ´ÙÀ½Àý¿¡¼­´Â Á»´õ ±×·²µíÇÏ°Ô ÀÛµ¿ÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé °ÍÀÌ´Ù.


3.2. ¿ÂµµÁ¶Àý ÇÁ·Î±×·¥ÀÇ ¾÷±×·¹À̵å

¾î¶µç ¿ì¸®´Â ¹®ÀåÀ» ÆÄ½ÌÇØ¼­ ¿øÇÏ´Â ·çƾÀ» ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾î ³Â´Ù. ±×·¯³ª Á»´õ ¿Ïº®ÇÏ°Ô ÀÛµ¿Çϱâ À§Çؼ­´Â ´ÜÁö "¹«¾ùÀ» ÆÄ½Ì Çß´Ù"°¡ ¾Æ´Ñ "ÆÄ½ÌÇÑ Á¤º¸°¡ ¹«¾ù"ÀÌ´Ù¶ó´Â °ªÀ» ¾ò¾î ¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µéÀÚ¸é 'heat'´Â ¿ÂµµÁ¶Àý±â¸¦ ÄѰųª ²ô´Âµ¥, À̸¦ À§Çؼ­´Â heat ÅäÅ« ´ÙÀ½ÀÇ 'on', 'off' ÅäÅ«À» °¡Á®¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

¶ÇÇÑ ¿Âµµ ¼³Á¤À» À§ÇÑ target temperatureÀÇ °æ¿ì ¿Âµµ °ªÀ» Àоî¿Ã ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

Flex´Â ¸ÅĪµÈ ´Ü¾îÀÇ ¹®ÀÚ¿­À» 'yytex'¶ó´Â º¯¼ö¿¡ ÀúÀåÇÑ´Ù. ¶ÇÇÑ 'yylval'¿¡ ¸®ÅϰªÀ» µÇµ¹·ÁÁÙ ¼öµµ ÀÖ´Ù. À̸¦ ÀÌ¿ëÇÏ¸é ÆÐÅϸÅĪÀÇ °á°ú¸¦ ³Ñ±æ ¼ö°¡ ÀÖ´Ù. ¾Æ·¡¿Í °°ÀÌ ÀÛ¼ºÇϰí example5.l ·Î ÀúÀåÇÏÀÚ.

%{
#include <stdio.h>
#include "y.tab.h"
%}
%%
[0-9]+                  yylval=atoi(yytext); return NUMBER;
heat                    return TOKHEAT;
on|off                  yylval=!strcmp(yytext,"on"); return STATE;
target                  return TOKTARGET;
temperature             return TOKTEMPERATURE;
\n                      /* ignore end of line */;
[ \t]+                  /* ignore whitespace */;
%%
			
ÅäÅ«ÀÌ ¼ýÀÚÀÏ °æ¿ì atoi¸¦ ÅëÇØ¼­ ¹Þ¾Æ¿Â ÅäÅ«(yytext)¸¦ ¼ýÀÚ·Î º¯È¯ÇßÀ½À» ¾Ë¼ö ÀÖ´Ù. º¯È¯µÈ °ªÀº yylvalÀ» ÅëÇØ¼­ bisonÄڵ忡¼­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¸®ÅϺ¯¼ö NUMBERÀ» ÅëÇØ¼­ ¸®ÅÏÇÑ´Ù. ¶ÇÇÑ "on"À» ¸¸³µÀ» °æ¿ì 1À» ¸®ÅÏÇϵµ·Ï Çß´Ù.

ÀÌÁ¦ Bison Äڵ忡¼­ yylvalÀ» ÅëÇØ¼­ ³Ñ¾î¿Â °ªÀ» ÀÌ¿ëÇØ¼­ ¾î¶² ÀÛ¾÷À» °¡´ÉÇϵµ·Ï ÄÚµùÇØ Áֱ⸸ ÇÏ¸é µÈ´Ù. ´Ù¸¥ ºÎºÐÀº ¸ðµÎ µ¿ÀÏÇÏ´Ï ¾Æ·¡ÀÇ ºÎºÐ¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù.

heat_switch:
    TOKHEAT STATE
    {
        if($2)
            printf("\tHeat turned on\n");
        else
            printf("\tHeat turned off\n");
    }
    ;

target_set:
    TOKTARGET TOKTEMPERATURE NUMBER
    {
        printf("\tTemperature set %d\n", $3);
    }
    ;
			
ÀÌÇØ´Â ½¬¿ï °ÍÀÌ´Ù. ÅäÅ«ÀÇ °¢ À̸§ÀÇ ¼ø¼­´ë·Î $1, $2.. ÇØÁÖ´Â Á¤µµ·Î ÅäÅ«ÀÌ ³Ñ°ÜÁÖ´Â °ªÀ» ¹Þ¾Æ¿Ã ¼ö ÀÖ´Ù. heat_switchÀÇ °æ¿ì µÎ¹øÂ° ÅäÅ«°ªÀÎ STATE·Î °ªÀÌ ³Ñ¾î¿À¹Ç·Î "$2"¸¦ ÀÌ¿ëÇÏ¸é ¹Þ¾Æ¿Ã ¼ö ÀÖ´Ù. ó¸®ÄÚµå´Â °£´ÜÇÏ´Ù. 1À̸é on, 2¸é off°ü·Ã ¸Þ½ÃÁö¸¦ »Ñ·ÁÁÖµµ·Ï ¸¸µé¾ú´Ù.

tatget_set ¿ª½Ã µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î ¼öÁ¤Çß´Ù. ¿Âµµ °ªÀº NUMBER ÅäÅ«°ªÀ¸·Î ³Ñ¾î¿ÈÀ¸·Î $3¸¦ ÀÌ¿ëÇØ¼­ ¹Þ¾Æ¼­ À̸¦ Ãâ·ÂÇß´Ù.

ÄÄÆÄÀÏ Å×½ºÆ®¸¦ ÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

# ./example5
heat on
  Heat turned on
heat off
  Heat turned off
target temperature 50
			


3.3. °è»ê±â¸¦ ¸¸µé¾î º¸ÀÚ

À̹ø¿¡´Â °è»ê±â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ¾Õ¼­ÀÇ ¿¹Á¦Ã³·³ flex¿Í bisonÀÇ ÀÛµ¿¹æ½Äµµ ÇÔ²² ¼³¸íÇϵµ·Ï ÇϰڴÙ.

°è»ê±â ÇÁ·Î±×·¥Àº »çÄ¢¿¬»êÀ» Çϴµ¥, "()"µµ 󸮸¦ ÇÒ °ÍÀÌ´Ù. ¶ÇÇÑ °ªÀ» º¯¼ö¿¡ ÀúÀåÇÏ´Â ±â´É±îÁö¸¦ Ãß°¡ÇÒ °ÍÀÌ´Ù. ¾Æ½Ã°ÚÁö¸¸ °è»ê±â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÔ¿¡ À־ ()󸮸¦ ÇÑ´Ù´Â°Ô ±×¸® °£´ÜÇÑ°Ô ¾Æ´Ï¶ó´Â°É ÀÌÇØ ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¿¹Á¦¸¦ ÅëÇØ¼­ flex¿Í bisonÀ» ¾´´Ù¸é ±×¸® ¾î·ÆÁö ¾Ê°Ô ÀÛ¼º °¡´ÉÇÏ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÕÀ» °ÍÀÌ´Ù.

°è»ê±â ÇÁ·Î±×·¥¿¡¼­´Â ÅäÅ«À¸·Î INTEGER¿Í VARIABLE¸¦ ¼±¾ðÇÑ´Ù. INTEGERÀº ÇÇ¿¬»êÀÚ¿¡ ´ëÇÑ ÅäÅ«À» ¸¸³µÀ» ¶§ »ç¿ëÇÏ´Â ÅäÅ«°ªÀ̸ç, VARIABLE´Â º¯¼ö¸¦ ¸¸³µÀ» ¶§ »ç¿ëÇÒ ÅäÅ« °ªÀÌ´Ù. ¿©·¯ºÐÀÌ bison¸¦ ½ÇÇà ½ÃŲ´Ù¸é cal.tab.h ÆÄÀÏÀ» º¼ ¼ö ÀÖÀ» °Çµ¥, ´ÙÀ½°ú °°Àº Äڵ带 Æ÷ÇÔÇϰí ÀÖÀ» °ÍÀÌ´Ù.

#ifndef YYSTYPE
#define YYSTYPE int
#endif
#define INTEGER 258
extern YYSTYPE yylval;
			
bisonÀº ÀÌ ÀÎŬ·çµå ÆÄÀÏÀ» Æ÷ÇÔÇØ¼­ ¼±¾ðµÈ ÅäÅ«°ªÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ÅäÅ«À» ¾ò±â À§Çؼ­ bison´Â yylex¸¦ È£ÃâÇÏ°Ô µÈ´Ù. yylex´Â int°ªÀ» ¸®ÅÏÇϴµ¥ ¹Ù·Î À§¿¡¼­ Á¤ÀÇµÈ ÅäÅ«¿¡ ´ëÇÑ intÇü °ªÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. ÅäÅ«¿¡ ´ëÇÑ °ªÀº ¿Âµµ°è¿¹Á¦ ¿¡¼­ ¼³¸íÇßµíÀÌ yylvalÀ» ÅëÇØ¼­ ¸®ÅÏ ÇÒ ¼ö ÀÖ´Ù.
[0-9]+     {
               yylval = atoi(yytext);
               return INTEGER;
           }
			
yylval¿¡´Â intÇü µ¥ÀÌÅͰ¡ ÀúÀåµÇ°í, ÅäÅ«°ªÀ¸·Î INTEGER¸¦ ¸®ÅÏÇÏ°Ô µÈ´Ù. yylvaluÀº YYSTYPE·Î ¼±¾ðµÇ¾î ÀÖ´Ù. ÅäÅ«°ªÀº 0-255±îÁö »ç¿ë°¡´É ÇÏ´Ù.

ÀÌÁ¦ ¿¬»êÀÚµé°ú ()¿¡ ´ëÇÑ ÅäÅ«À» ¾ò¾î¿Í¾ß ÇÑ´Ù.

[-+()=/*\n]   {return *yytext;}
			
±×¸®°í º¯¼ö¿¡ ´ëÇÑ ÅäÅ«µµ ¾ò¾î¿Í¾ß ÇÑ´Ù. º¯¼ö¸íÀº ¿µ¹® ¹®ÀÚ Çϳª¸¸ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Á¦ÇÑÇϵµ·Ï ÇϰڴÙ.
[a-z]  {
          yylval = *yytext - 'a';
          return VARIABLE  
       }
			

bison ¹®¹ý¿¡¼­ÀÇ ÇÙ½ÉÀº °¢ ¿¬»êÀÚ¿¡ ¸Âµµ·Ï ¿¬»êÀ» ½ÇÇàÇϰí, °ýÈ£¸¦ ¸¸³µÀ» °æ¿ì ¿ì¼± ¿¬»êÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù.

expr:
		INTEGER
		| VARIABLE       { $$ = sym[$1]; }
		| expr '+' expr  { $$ = $1 + $3; }
		| expr '-' expr  { $$ = $1 + $3; }
		| expr '*' expr  { $$ = $1 + $3; }
		| expr '/' expr  { $$ = $1 / $3; }
		| '(' expr ')'   { $$ = $2; }
		;
			
ÇϳªÀÇ ¿¬»ê ¹®Àå¿¡´Â a + c - d * c ¿Í °°Àº ¿©·¯°³ÀÇ ¿¬»êÀÚ°¡ »ç¿ëµÉ ¼ö ÀÖÀ¸¹Ç·Î À̹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â left-recursionÀ» ÀÀ¿ëÇØ¼­ °³Ç๮ÀÚ¸¦ ¸¸³¯¶§±îÁö ¿¬»êÀÚ¿Í ÇÇ¿¬»çÀÚ¸¦ °Ë»çÇϸ鼭 °è»êÀ» ÇØ¾ß ÇÑ´Ù. 그림 1À» º¸¸é ÀÌ·¯ÇÑ °úÁ¤ÀÌ ÀÌÇØ°¡ °¥°ÍÀÌ´Ù. ¿ì¸®´Â ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ ¿ì¼± parse ½ºÅÃÀ» ¸¸µçÈÄ ½ºÅÃÀÇ °¡Àå ¾Æ·¡(À§¶ó°í ÇØµµ °ü°è ¾ø´Ù)¿¡¼­ ºÎÅÍ Â÷·Ê´ë·Î ¿¬»êÀ» ÇØ¾ß ÇÑ´Ù. ÀÌ·¯ÇÑ ½ºÅø¸µå´Â ÀÛ¾÷Àº ¹°·Ð ÇÁ·Î±×·¡¸Ó°¡ Á÷Á¢ÇÒ ÇÊ¿ä ¾ø´Ù. ¹®¹ý¸¸ Àß ¸¸µé¾î ÁÖ¸é bison¿¡¼­ ¾Ë¾Æ¼­ ÇØÁØ´Ù. ½ºÅÿ¡ ¹Ð¾î ³Ö±â À§Çؼ­ expr:·êÀ» »ç¿ëÇÑ´Ù. ¸¸µé¾îÁø ½ºÅÿ¡ ¹Ð¾î ³Ö±â À§Çؼ­ expr '+' expr ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ¿À¸¥ ÂÊ¿¡ ÀÖ´Â exprÀº ½ºÅÃÀÇ ¿À¸¥ÂÊ °ªÀ̰í, ¿ÞÂÊÀÇ exprÀº ½ºÅÃÀÇ ¿ÞÂÊ °ªÀ̵ȴÙ. C Äڵ忡¼­´Â ÀÌ °ªµéÀ» $1°ú $3¸¦ ÅëÇØ¼­ ¾ò¾î¿Ã ¼ö ÀÖ´Ù. $2¿¡´Â ¿¬»êÀÚ°¡ µé¾î °¡°Ô µÈ´Ù. $$Àº °è»êµÈ °ªÀ» ½ºÅÃÀÇ °¡Àå ¾Æ·¡·Î ¹Ð¾î ³ÖÀ¸¶ó´Â Ç¥½Ã´Ù.

()¸¦ ¸¸³µÀ» °æ¿ì ÀÌ ¿¬»êÀº ¿ì¼±ÀûÀ¸·Î ÀÌ·ç¾î Á®¾ß ÇÑ´Ù. ±×·¯¹Ç·Î ()¾È¿¡ ÀÖ´Â ¿¬»êµé ÀÚü¸¦ ½ºÅÃÀÇ °¡Àå ¾Æ·¡·Î ¹Ð¾î ³Ö¾î¾ß ÇÒ °ÍÀÌ´Ù. À̸¦ À§Çؼ­ '(' expr ')' {$$ = $2;}°¡ »ç¿ëÇϰí ÀÖ´Ù.

´ÙÀ½Àº flex¿Í bisonÀÇ ¿ÏÀüÇÑ ÄÚµå·Î ÆÄÀÏÀ̸§Àº cal.l, cal.y·Î Çϸç, À§¿¡¼­ ºüÁø ¸î°¡Áö ³»¿ëµéÀº ÁÖ¼®À» ÅëÇØ¼­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.

¿¹Á¦ : cal.l

%{
#include <stdlib.h>
void yyerror(char *);
#include "mycal.tab.h"
%}

%%
 /* º¯¼ö¸íÀ» À§ÇÑ VARIABLE ÅäÅ«À» µÇµ¹·Á ÁØ´Ù */
 /* º¯¼ö¸íÀº a-z ±îÁö »ç¿ëµÉ ¼ö ÀÖ´Ù.         */ 
 /* ¸®ÅÏµÈ °ªÀº cal.y¿¡¼­ symÅ×À̺íÀ» ¸¸µé±â À§Çؼ­ »ç¿ëµÈ´Ù. */ 
[a-z]   {
          yylval = *yytext - 'a';
          return VARIABLE;
        }
 
 /* ¼ýÀÚ¸¦ ¸¸³µÀ» ¶§ */
[0-9]+  {
          yylval = atoi(yytext);
          return INTEGER;
        }
 /* ¿¬»êÀÚ¸¦ ¸¸³µÀ» ¶§ */
[-+()=/*\n] {return *yytext;}

[ \t]   ;     /* ¹«½ÃÇÑ´Ù */

.       yyerror("invalid character");
%%

int yywrap(void)
{
  return 1;
}
			
¿¹Á¦ : cal.y
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'

%{
  void yyerror(char *);
  int yylex(void);
  int sym[26];
%}

%%

program:
    program statement '\n'
    |
    ;

 /* º¯¼ö¸¦ ¸¸³µÀ» °æ¿ì                                */
 /* º¯¼ö¸íÀÇ ÅäÅ«°ªÀ» ÀÌ¿ëÇØ¼­ ½Éº¼¸¯ Å×À̺íÀ» ¸¸µç´Ù */ 
 /* ¸¸¾à º¯¼ö¸íÀÌ 'a'¶ó¸é ÅäÅ«°ªÀº 0ÀÌ ¸®ÅÏµÇ°í       */
 /* sym[0] ¿¡ ¿¬»ê°á°ú°¡ µé¾î°¡°Ô µÈ´Ù.               */   
statement:
    expr                  { printf("°è»ê°á°ú %d\n", $1); }
    | VARIABLE '=' expr   { sym[$1] = $3; }
    ;

expr:
    INTEGER
    | VARIABLE            { $$ = sym[$1]; }
    | expr '+' expr       { $$ = $1 + $3; }
    | expr '-' expr       { $$ = $1 - $3; }
    | expr '*' expr       { $$ = $1 * $3; }
    | expr '/' expr       { $$ = $1 / $3; }
    | '(' expr ')'        { $$ = $2; }
    ;

%%
void yyerror(char *s)
{
  printf("%s\n", s);
  return 0;
}

int main(void)
{
  yyparse();
  return 0;
}
			
´ÙÀ½Àº Å×½ºÆ® °á°ú´Ù. °ýÈ£¸¦ ÅëÇÑ ¿¬»êÀº ¹°·ÐÀÌ°í ´ÙÁßÀÇ °ýÈ£±îÁö ó¸®Çϰí ÀÖÀ½À» ¾Ë ¼ö ÀÕ´Ù.
# ./cal 
a=5*(10+20)
a
°è»ê °á°ú 150
a=10+5+2 +(2*10)
a
°è»ê °á°ú 37
(10*12)/(3*2)
°è»ê °á°ú 20
b=((52+32)/(2*1)+(16*3))+(22*2)
b
°è»ê °á°ú 134
			


Cache Error

category_C
category__1
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.