¤³¤Î¾Ï¤Ç¤Ï»ú¶ç¥¹¥¥ã¥ó½èÍý¤Î³µÇ°¤òÀâÌÀ¤·¡¢Flex¤Î¤è¤¦¤Ê¥Ä¡¼¥ë¤Î ɬÍ×À¤ò¼¨¤·¤Þ¤¹¡£ ËܾϤθåȾ¤Ç¤ÏFlex¤ò»È¤¦¤³¤È¤Î¤Ç¤¤ë¾õ¶·¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£
Unix¤ª¤è¤ÓC¤ÎÀ¤³¦¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¸Ä¡¹¤Î¥Ð¥¤¥È¤¬Ï¢Â³¤·¤¿¤â¤Î¤È¤·¤Æ °·¤ï¤ì¤Þ¤¹¡£ ¸Ä¡¹¤Î¥Ð¥¤¥È¤ò½¸¤á¤Æ¤É¤Î¤è¤¦¤Ë¥°¥ë¡¼¥×²½¤¹¤ë¤«¤È¤¤¤¦ÅÀ¤Ï¡¢ ¥×¥í¥°¥é¥Þ¤¬·è¤á¤ë¤³¤È¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤ÊÃê¾Ý²½¤ÏÈó¾ï¤Ë¶¯ÎϤǤ¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢¤É¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ç¤¢¤Ã¤Æ¤â¤³¤ÎÃê¾Ý²½ÊýË¡¤Ë¤è¤Ã¤ÆÉ½¸½¤Ç¤¤ë¤«¤é ¤Ç¤¹¡£ ¤·¤«¤·¤³¤ÎÊýË¡¤Ë¤Ïû½ê¤â¤¢¤ê¡¢¥×¥í¥°¥é¥Þ¤Ï¤Û¤È¤ó¤É¾ï¤ËÀ¸¤Î¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ ¹½Â¤¤ò¤¢¤Æ¤Ï¤á¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¸À¤¤´¹¤¨¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤ò¤è¤ê°ÕÌ£¤Î¤¢¤ëÉôʬ¤Ëʬ³ä¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È ¤Ç¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥é¤Î¤¢¤ëÉôʬ¤Ï¥Õ¥¡¥¤¥ë¤«¤éϢ³¤·¤¿Ê¸»ú¤ò¼õ¤±¼è¤ê¡¢ ¹½Ê¸¥Á¥§¥Ã¥«¤¬Íý²ò¤¹¤ë¤³¤È¤Î¤Ç¤¤ë¹½À®Í×ÁÇ¡¢ ¤¿¤È¤¨¤Ð¡¢¿ôÃÍ¡¢¥¡¼¥ï¡¼¥É¡¢Ê¸»úÎó¤Ê¤É¤Ë¥°¥ë¡¼¥×²½¤·¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦Íýͳ¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¸À¸ì¥Ñ¡¼¥µ¤¬½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢Ï¢Â³¤·¤¿ ʸ»ú¤ËÂФ·¤Æ¤Ç¤Ï¤Ê¤¯¡¢¤½¤Î¸À¸ì¤Î¥·¥ó¥Ü¥ë¤¬Ï¢Â³¤·¤¿¤â¤Î¤ËÂФ·¤Æ¤À¤«¤é¤Ç¤¹¡£
¥Ç¡¼¥¿¥Ù¡¼¥¹¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¡¢¥Ð¥¤¥Ê¥ê¥Õ¥¡¥¤¥ë¤ò°·¤¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢ °·¤¦¥Ç¡¼¥¿¤ËÂФ·¤Æ¤¢¤ë¸ÇÄꤵ¤ì¤¿¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¯¡¢ ¤½¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»È¤Ã¤ÆÆþÎϥǡ¼¥¿¤«¤é°ÕÌ£¤òƳ¤½Ð¤·¤Þ¤¹¡£ ¥Æ¥¥¹¥È¤òÆþÎϤ¹¤ë¥×¥í¥°¥é¥à¤ÏÄ̾盧¤ì¤È¤ÏÈ¿ÂФǡ¢ÆþÎϤòñ¸ì¤ä¥·¥ó¥Ü¥ë¤Ë ʬ³ä¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Î¤Ç¤¹¤¬¡¢Ä̾盧¤ì¤é¤Îñ¸ì¤ä¥·¥ó¥Ü¥ë¤¬ ¤É¤Î¤è¤¦¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ë¤«¤ò¼¨¤¹·è¤Þ¤Ã¤¿¹½Â¤¤È¤¤¤¦¤â¤Î¤Ï¸ºß¤·¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥Æ¥¥¹¥È½èÍý¤ò¹Ô¤¦¥×¥í¥°¥é¥à¤Ï¡¢ÆþÎϤµ¤ì¤¿¾ðÊó¤ò°ÕÌ£¤Î¤¢¤ë ¥·¥ó¥Ü¥ë¤Ëʬ³ä¤¹¤ë¤¿¤á¤Ë¡¢»ú¶ç²òÀϤ⤷¤¯¤Ï»ú¶ç¥¹¥¥ã¥ó¤È¸Æ¤Ð¤ì¤ë ½èÍý¤ò¹Ô¤¦Éôʬ¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¯¡¢¤½¤³¤ÇÆþÎϾðÊó¤Îʬ³ä¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦´Ø¿ô·²¤Î¤³¤È¤ò»ú¶ç¥¢¥Ê¥é¥¤¥¶¤â¤·¤¯¤Ï»ú¶ç¥¹¥¥ã¥Ê¡¢ ¤¢¤ë¤¤¤Ïû¤¯¡Ö¥¹¥¥ã¥Ê¡×¤È¸Æ¤Ó¤Þ¤¹¡£
°ìÈÌŪ¤Ë¡¢¥¹¥¥ã¥Ê¤òºîÀ®¤¹¤ë¤Î¤Ï¡¢ ¥×¥í¥°¥é¥Þ¤Ë¤È¤Ã¤ÆÆñ¤·¤¤¤³¤È¤Ç¤â¤ª¤â¤·¤í¤¤¤³¤È¤Ç¤â¤Ê¤¤¤Î¤Ç¤¹¤¬¡¢ »þ´Ö¤Î¤«¤«¤ëºî¶È¤Ë¤Ê¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤¹¡£ ÉáµÚ¤·¤Æ¤¤¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤Û¤È¤ó¤É¤Ï¡¢ ¥¹¥¥ã¥Ê¤ÎºîÀ®¤ò»Ù±ç¤¹¤ëµ¡Ç½¤¬ÉÔ½½Ê¬¤Ç¤¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢Ï¢Â³¤·¤¿Ê¸»ú¤òñ¸ì¡¢¥È¡¼¥¯¥ó¡¢¥·¥ó¥Ü¥ë¤Ëʬ³ä¤¹¤ëÁȤ߹þ¤ß¤Îµ¡Ç½ ¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ Ä̾ï¤Ï¤³¤Î¤è¤¦¤Ê»Å»ö¤ò¹Ô¤¦¥é¥¤¥Ö¥é¥ê¥ë¡¼¥Á¥ó¤¬Â¸ºß¤·¤Þ¤¹¤¬¡¢ ½ÀÆð¤Ç¤Ê¤«¤Ã¤¿¤ê¡¢»È¤¤¤Ë¤¯¤«¤Ã¤¿¤ê¡¢¤¢¤ë¤¤¤Ï¡¢ ¥ë¡¼¥Á¥ó¤È¤Î¤ä¤ê¼è¤ê¤Ë¤¢¤Þ¤ê¤Ë¿¤¯¤Î¥³¡¼¥É¤¬É¬Íפˤʤ俤ꤹ¤ë¤³¤È¤¬Â¿¤¤¤¿¤á¤Ë¡¢ ¼ÂÁõ¾å¤ÎºÙ¤«¤ÊÅÀ¤Ë¤è¤Ã¤Æº¬ËÜŪ¤ÊÌäÂ꤬ÉÔÌÀÎÆ¤Ë¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
1¤Ä¤ÎÎɤ¤Î㤬¡¢C¸À¸ì¤Çµö¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¿ôÃÍ·¿ ¡ÊÉâÆ°¾®¿ôÅÀ¡¢À°¿ô¡¢16¿Ê¿ô¡¢8¿Ê¿ô¡Ë ¤ò½èÍý¤¹¤ë¥¹¥¥ã¥Ê¤òC¸À¸ì¤Çµ½Ò¤¹¤ë¾ì¹ç¤Ç¤¹¡£ ¤³¤ì¤ÏÈó¾ï¤ËÆñ¤·¤¤¤È¤¤¤¦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ ¤Ç¤¾å¤¬¤Ã¤¿¥³¡¼¥É¤ÏÄ̾ïÈþ¤·¤¤¤È¤Ï¤È¤Æ¤â¤¤¤¨¤Ê¤¤¤â¤Î¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤Ç¤·¤ç¤¦¤·¡¢ ¤½¤ÎÊݼé¤ä³ÈÄ¥¤ÏÍÆ°×¤Ç¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Î¤Ç¤¹¡£
¤Û¤È¤ó¤É¤Î¥×¥í¥°¥é¥Þ¤¬Â¨ºÂ¤ËÃǸÀ¤¹¤ë¤è¤¦¤Ë¡¢ ¾¿Í¤Î½ñ¤¤¤¿¥³¡¼¥É¤òÊݼ餹¤ë¤Î¤ÏÄ̾濫¤Þ¤ê³Ú¤·¤¤ºî¶È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¤µ¤é¤Ë¡¢Èþ¤·¤¯¤Ê¤¤¥³¡¼¥É¤òÊݼ餹¤ë¤Î¤Ï¡¢³Ú¤·¤¤¤È¤¤¤¦¤Ë¤Ï¤Û¤É±ó¤¤¤â¤Î¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤Ë¡¢¥¹¥¥ã¥Ê¤ò½ñ¤¯¤³¤È¤¬Âà¶þ¤Ç¡¢¤½¤ÎÊݼ餬Æñ¤·¤¤¤È¤Ê¤ë¤È¡¢ ¥¹¥¥ã¥Ê¤ÎºîÀ®¤ò¤è¤êÍÆ°×¤Ë¤·¤Æ¤¯¤ì¤ëÊýË¡¤ò¹Í¤¨¤è¤¦¤È¤·¤¿Íýͳ¤¬ÆÉ¼Ô¤Ë¤â¤ª¤ï¤«¤ê ¤¤¤¿¤À¤±¤ë¤Ç¤·¤ç¤¦¡£
Flex¤Ï¥×¥í¥°¥é¥Þ¤ËÂФ·¤Æ¡¢»ú¶ç²òÀϽèÍýÉôʬ¤ò¤¤ì¤¤¤Ëµ½Ò¤·¡¢ ¤½¤Îµ½Ò¤Ë¤·¤¿¤¬¤Ã¤¿¸úΨŪ¤Ê»ú¶ç¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ëÊýË¡¤òÄ󶡤·¤Þ¤¹¡£ ¥×¥í¥°¥é¥Þ¤ÏFlex¤ËÂФ·¤Æ¡¢É¬Íפʥ¹¥¥ã¥Ê¤Ë´Ø¤¹¤ëµ½Ò¾ðÊó¤òÄ󶡤·¤Þ¤¹¡£ Flex¤Ï¤½¤Îµ½Ò¾ðÊó¤ò»È¤Ã¤Æ¡¢C¸À¸ì¤Ç½ñ¤«¤ì¤¿¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ µ½Ò¤Ë»È¤ï¤ì¤ë¸À¸ì¤Ï¹âµé¸À¸ì¤Ç¤¢¤ê¡¢ ¥¹¥¥ã¥Ê¤Îµ½Ò¤Ë´Ø¤·¤Æ¤ÏC¸À¸ì¤è¤ê¤â¤Ï¤ë¤«¤ËŬ¤·¤Æ¤¤¤Þ¤¹¡£ ¤½¤Î¹âµé¸À¸ì¤ò»È¤¦¤³¤È¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢Ê¸»ú¤ò¤É¤Î¤è¤¦¤Ë¥°¥ë¡¼¥×²½¤·¡¢ ¥°¥ë¡¼¥×²½¤¬´°Î»¤·¤¿¤È¤¤Ë¤É¤Î¤è¤¦¤Ê¥¢¥¯¥·¥ç¥ó¤òȯÀ¸¤µ¤»¤ë¤«¤ò»ØÄê¤Ç¤¤Þ¤¹¡£
Ãí°Õ¡§Ëܽñ¤Î¤Û¤È¤ó¤É¤ÎÉôʬ¤ÏFlex¡¢Lex¤ÎξÊý¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ Lex¤Ï¡ÊFlex¤Ë¤ÏÎô¤ê¤Þ¤¹¤¬¡Ë ¤Û¤È¤ó¤É¤ÎUnix¥·¥¹¥Æ¥à¾å¤Ë¤¢¤ëɸ½à¤Î¥¹¥¥ã¥ÊÀ¸À®¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£ ξ¼Ô¤Î´Ö¤Ë°ã¤¤¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢Flex¤òÍ¥À褵¤»¤Æ¤¤¤Þ¤¹¡£ Lex¤Ë¤Ä¤¤¤Æ¤Ïɸ½àLex¤Ç´Êñ¤ËÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤³¤Ç¤â1¤Ä¤ÎÎɤ¤Î㤬¥³¥ó¥Ñ¥¤¥é¤Ç¤¹¡£ Á°½Ò¤Î¤è¤¦¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤Î¹½Ê¸¥Á¥§¥Ã¥«¤Ï¡¢Ê¸»ú¤¬Ï¢Â³¤·¤¿¤â¤Î¤Ç¤Ï¤Ê¤¯¡¢ ¸À¸ìʸˡ¤Î¹½À®Í×ÁǤòɽ¤¹¥È¡¼¥¯¥ó¤¬Ï¢Â³¤·¤¿¤â¤Î¤ò¡¢ ÆþÎϤȤ·¤Æ¼õ¤±¼è¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ Flex¤Ï¤³¤Î¤è¤¦¤Ê¾ì¹ç¤ËºÇŬ¤Ç¤¹¡£ Flex¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤¬¹½Ê¸¥Á¥§¥Ã¥«¤È¥Õ¥¡¥¤¥ë¤ÎÃç²ðÌò¤È¤Ê¤ê¡¢ ¹½Ê¸¥Á¥§¥Ã¥«¤¬¼¡¤Î°ÕÌ£¤Î¤¢¤ë¥È¡¼¥¯¥ó¤òÍ׵᤹¤ë¤Î¤òÂÔ¤Á¤Þ¤¹¡£ Flex¤Ï¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¡¢¥×¥í¥°¥é¥Þ¤¬Í¿¤¨¤ëµ½Ò¤Ë¤·¤¿¤¬¤Ã¤ÆÊ¸»ú¤ò¥°¥ë¡¼¥×²½¤·¤Æ¡¢ ¥Þ¥Ã¥Á¤·¤¿¥È¡¼¥¯¥ó¤òÊÖ¤·¤Þ¤¹¡£ ¤³¤Î½èÍý¤Ï¡¢¥¹¥¥ã¥Ê¤â¤·¤¯¤Ï¥Ñ¡¼¥µ¤¬½ªÎ»¤¹¤ë¤Þ¤Ç³¤¤Þ¤¹¡£
C¤Î¥³¥ó¥Ñ¥¤¥é¤òºîÀ®¤¹¤ë¾ì¹ç¡¢ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦¤¿¤á¤ËɬÍפȤʤëFlex¤Îµ½Ò¾ðÊó¤Ï¡¢ ¥³¡¼¥É¤Î¹Ô¿ô¤Ë¤·¤Æ100¡Á300¹Ô¤°¤é¤¤¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ¤³¤Îµ½Ò¾ðÊó¤Î¤Û¤È¤ó¤É¤Ï¡¢ ¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î´ÉÍý¡¢¼±Ê̻Ҥθ¡º÷¡¢·¿¤Î¥Þ¥Ã¥Ô¥ó¥°¡¢¤¢¤ë¿ô¤ÎÃͤʤɤÎÄɲþðÊó¤ÎÊֵѤò¹Ô¤¦¤¿¤á¤ÎÊä½õŪ¤ÊC¥³¡¼¥É¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£ ¤³¤¦¤·¤¿¥³¡¼¥É¼«ÂΤϵ½Ò¾ðÊó¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ Ä̾¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÉ¬ÍפȤµ¤ì¤ë¤â¤Î¤Ç¤¹¡£
³µÇ°Åª¤Ë¤ÏFlex¤Ï¡¢¸¶ºàÎÁ¡Êʸ»ú¡Ë¤ò¼è¤ê¹þ¤ß¡¢ ¾ÃÈñ¼Ô¡Ê¥Ñ¡¼¥µÅù¡Ë¤¬¤¹¤°¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤ë´°À®Éʡʥȡ¼¥¯¥ó¡Ë¤òÀ½Â¤¤¹¤ë¹©¾ì¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£
Flex¤Ï¥³¥ó¥Ñ¥¤¥é¤Ë¤·¤«»È¤¨¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ÆÉ¼Ô¤Î¥³¥ó¥Ô¥å¡¼¥¿¾å¤Ë¤¢¤ë¡¢¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ó¤À¤ê¡¢ ¤Ê¤ó¤é¤«¤Î·Á¤Çʸ»ú¤Î¥°¥ë¡¼¥×¤ò½èÍý¤¹¤ëɬÍפΤ¢¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¡¢ ÆÃ¤Ë¡¢ÊÑ´¹¥Õ¥£¥ë¥¿¤ä¸À¸ì¥Ä¡¼¥ë¤Î¤³¤È¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤¦¤·¤¿¥×¥í¥°¥é¥à¤Î¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤ò¡¢ FlexñÂΡ¢¤â¤·¤¯¤ÏFlex¤È¾¤Î¥Ä¡¼¥ë¤ÎÁȤ߹ç¤ï¤»¤Ë¤è¤Ã¤ÆºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Îɤ¤Îã¤Î1¤Ä¤¬Ê¸»ú¿ô¤Î¥«¥¦¥ó¥È¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÎÁ´¹Ô¿ô¡¢¸Ä¡¹¤Îʸ»ú¤Î½Ð¸½²ó¿ô¡¢
foo¤È¤¤¤¦Ã±¸ì¤Î½Ð¸½²ó¿ô¤òÄ´¤Ù¤ë¥×¥í¥°¥é¥à¤òºîÀ®¤·¤¿¤¤¾ì¹ç¤Ç¤¹¡£
ɸ½àŪ¤Ê¥Ä¡¼¥ë¡Êgrep¡¢sed¡¢awk¡¢perlÅù¡Ë
¤ÇºîÀ®¤¹¤ë¤³¤È¤â¡¢C¸À¸ì¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤ÆºîÀ®¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¤¬¡¢
Flex¤ÇºîÀ®¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£
¤â¤¦1¤Ä¤ÎÎã¤È¤·¤Æ¡¢ÆÃÄê¤Î¥¡¼¥ï¡¼¥É¤òõ¤¹É¬ÍפΤ¢¤ë¡¢¥á¡¼¥ë¥ê¡¼¥À¤¬¤¢¤ê¤Þ¤¹¡£
¤³¤Î¾ì¹ç¤Ç¤â¡¢É¸½à¥Ä¡¼¥ë¤Ç¼Â¸½¤¹¤ë¤³¤È¤â¡¢Flex¤ÈC¸À¸ì¤Ç¼Â¸½¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£
Flex¤ò»È¤¦¤³¤È¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢ ¥¹¥¥ã¥Ê¤Î³«È¯¤ä¥Õ¥¡¥¤¥ë¤ò¹½À®¤¹¤ëʸ»ú¤Î½èÍý¤Ë¤«¤«¤ë»þ´Ö¤òÂçÉý¤Ë¸º¤é¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢Flex¤ËÂФ¹¤ëÆþÎϾðÊó¤Ï¡¢ ´û¸¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ½Ò¤µ¤ì¤¿¥³¡¼¥É¤ÈÈæ³Ó¤·¤Æ¡¢ ¤è¤êÍý²ò¤·¤ä¤¹¤¯¡¢¾¯¤Ê¤¯¤È¤âÆ±ÄøÅ٤ΰܿ¢À¤¬¤¢¤ê¡¢Êݼé¤â¤è¤ê´Êñ¤Ç¤¹¡£ ¤½¤ì¤À¤±¤Ç¤Ê¤¯¡¢Flex¤Ç¥¹¥¥ã¥Ê¤ò³«È¯¤¹¤ë¤Î¤Ë¤«¤«¤ë»þ´Ö¤Ï¡¢ ´û¸¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÇƱÅù¤Î¥¹¥¥ã¥Ê¤ò³«È¯¤¹¤ë¾ì¹ç¤ÈÈæ¤Ù¤¤ï¤á¤ÆÃ»¤¯¤Æ¤¹¤à¤Î¤Ç¡¢ Flex¤Ï¡¢¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤ä¡¢ °ìÅÙ¤·¤«»È¤ï¤Ê¤¤¥×¥í¥°¥é¥à¤ä¥Õ¥£¥ë¥¿¤Î³«È¯¤ËºÇŬ¤Ç¤¹¡£
¤³¤Î¾Ï¤Ç¤ÏFlex¤òµ¯Æ°¤¹¤ë´ðËÜŪ¤ÊÊýË¡¤òÀâÌÀ¤·¡¢ Flex¤Ç»ÈÍѲÄǽ¤Ê¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ò´Êñ¤ËÀâÌÀ¤·¤Þ¤¹¡£
Flex¤Ïµ½Ò¾ðÊó¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤òÆþÎϤȤ·¤Æ¼õ¤±¼è¤ê¡¢ ¥¹¥¥ã¥Êµ¡Ç½¤ò»ý¤ÄC¤Î¥Õ¥¡¥¤¥ë¤ËÊÑ´¹¤·¤Þ¤¹¡£ Flex¤òµ¯Æ°¤¹¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¹Ô¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
flex [-bcdfinpstvFILT8] [-C[efmF]] [-Sskeleton] [file ...]
°ìÈÌŪ¤Ë¤Ï¡¢
ñ¤Ëflex¤Ë³¤±¤Æ½èÍý¤¹¤Ù¤¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ¹¤ë¤³¤È¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
flex myfile.l
µ½Ò¾ðÊó¥Õ¥¡¥¤¥ë̾¤ÎËöÈø¤Î.l¤Ï¡¢
myfile¤¬Flex¤â¤·¤¯¤ÏLex¤Îµ½Ò¥Õ¥¡¥¤¥ë¤Ç¤¢¤ë¤³¤È¤ò¼¨¤¹´·ÎãŪ¤ÊÊýË¡¤Ç¤¹¡£
̾Á°ÉÕ¤±¤Î´·Îã¤È¤·¤Æ¤â¤¦1¤Ä¤è¤¯¸«¤é¤ì¤ë¤Î¤¬¡¢ËöÈø¤Ë.lex¤ò»È¤¦¤³¤È¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
flex myfile.lex
Flex¤Ïµ½Ò¾ðÊó¥Õ¥¡¥¤¥ë¡Êmyfile.l¡Ë¤òÆÉ¤ß¹þ¤ß¡¢
¤½¤³¤Ëµ½Ò¤µ¤ì¤¿¥Ñ¥¿¡¼¥ó¤òǧ¼±¤¹¤ë¥¹¥¥ã¥Êµ¡Ç½¤ò»ý¤Älex.yy.c¤È¤¤¤¦Ì¾Á°¤ÎC¸À¸ì¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£
µ½Ò¾ðÊó¤ÎÃæ¤Ë¤Ê¤ó¤é¤«¤Î¥¨¥é¡¼¤¬¤¢¤ì¤Ð¡¢
Flex¤ÏÂбþ¤¹¤ë¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òstderr¤Ë½ÐÎϤ·¤Þ¤¹¡£
Flex¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£
-b¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤Èlex.backtrack¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¥¹¥¥ã¥Ê¤Îµ½Ò¾ðÊó¤òºÇŬ²½¤¹¤ëºÝ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£
¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Optimizing for Speed¡£
-c¥ª¥×¥·¥ç¥ó¤ÏC¸À¸ì¤Ë¤è¤ë¥¢¥¯¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
stderr¤Ë½ÐÎϤ·¤Þ¤¹¡£
-f¡Ê¾®Ê¸»ú¡Ë¥ª¥×¥·¥ç¥ó¤È-F¡ÊÂçʸ»ú¡Ë¥ª¥×¥·¥ç¥ó¤È¤Ï°Û¤Ê¤ë¸ú²Ì¤ò»ý¤ÄÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
-v¥ª¥×¥·¥ç¥ó¤Ë¤è¤ë½ÐÎϤòÍÞÀ©¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£
POSIX¤Ç¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢
¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤¬»ØÄꤵ¤ì¤Ê¤¤¤«¤®¤ê¤³¤Î¤è¤¦¤Ê½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£
Flex¤Ç¤Ï¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤Ï°ÕÌ£¤ò»ý¤¿¤Ê¤¤¤Î¤Ç¡¢¤³¤Î¥Õ¥é¥°¤Ï¾éŤǤ¹¡£
-p¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤ë¤È¡¢
Flex¤ÏÀǽ¥ì¥Ý¡¼¥È¤òstderr¤Ë½ÐÎϤ·¤Þ¤¹¡£
¥¹¥¥ã¥Ê¤ÎÀǽ¤ò¸þ¾å¤µ¤»¤ëÊýË¡¤Ë´Ø¤¹¤ë²òÀâ¤Ë¤Ä¤¤¤Æ¤Ï¡¢
See Optimizing for Speed¡£
stdout¤Ë½ÐÎϤ¹¤ë¤³¤È¤Ç¤¹¡£
-s¥ª¥×¥·¥ç¥ó¤Ï¤³¤Î¤è¤¦¤Ê¥¢¥¯¥·¥ç¥ó¤òÍÞÀ©¤·¡¢
¤½¤ÎÂå¤ï¤ê¤ËÆþÎϾðÊ󤬥ޥåÁ¤·¤Ê¤«¤Ã¤¿»þÅÀ¤Ç¥¹¥¥ã¥Ê¤ò°Û¾ï½ªÎ»¤µ¤»¤Þ¤¹¡£
lex.yy.c¤Ë¤Ç¤Ï¤Ê¤¯stdout¤Ë½ÐÎϤ·¤Þ¤¹¡£
-F¡ÊÂçʸ»ú¡Ë¤Ï-f¡Ê¾®Ê¸»ú¡Ë¤È¤Ï°Û¤Ê¤ë¸ú²Ì¤ò»ý¤ÄÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
-f¤È-F¤ÎÁê°ãÅÀ¤Ë´Ø¤¹¤ë¾ðÊó¤Ë¤Ä¤¤¤Æ¤Ï¡¢
See Table Compression and Scanner Speed¡£
#line»Ø¼¨»Ò¤ò½ñ¤¹þ¤ß¤Þ¤¹¡£
¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ#line»Ø¼¨»Ò¤Î½ñ¤¹þ¤ß¤Ï¹Ô¤ï¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
stderr¤Ë½ÐÎϤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤¦¤·¤¿¥á¥Ã¥»¡¼¥¸¤Ï¡¢
Flex¤òÈó¾ï¤Ë¤è¤¯Íý²ò¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼°Ê³°¤Ë¤Ï̵°ÕÌ£¤Ç¤·¤ç¤¦¡£
Flex 2.5¤Ç¤Ï¡¢Á°Àá¡ÊCommand Line Switches¡Ë¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢ °Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
-f¡¢-F¡¢-Cf¡¢-CF¡¢
-+¥ª¥×¥·¥ç¥ó¤ÈƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
Flex¤ÈLex¤Î¡ÊÈó¡Ë¸ß´¹À¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and Lex¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
-I¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê¤Ç¤¹¡£
-8¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê¤Ç¤¹¡£
ÆâÉôŪ¤ËÀ¸À®¤µ¤ì¤ë¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤Ï-8¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¤È
Èæ³Ó¤·¤ÆÈ¾Ê¬¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤Ï¡¢8¥Ó¥Ã¥Èʸ»ú¤ò´Þ¤àÆþÎϤò½èÍý
¤Ç¤¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
-Cf¡¢-CF¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
ÌÀ¼¨Åª¤Ë-7¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢8¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
-h¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£
long int¤ÎÇÛÎó¤È¤·¤ÆÄêµÁ
¤¹¤ë¤è¤¦Flex¤ËÄÌÃΤ·¤Þ¤¹¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïshort int·¿¤ÎÇÛÎó¤È¤Ê¤ê¤Þ¤¹¡Ë¡£
RISC¥Þ¥·¥ó¤Ë¤è¤Ã¤Æ¤Ï¡¢long int¤Î¤Û¤¦¤¬¹â®¤Ë½èÍý¤µ¤ì¤ë¤¿¤á¡¢¥¹¥¥ã¥Ê
¤ÎÀǽ¸þ¾å¤¬´üÂԤǤ¤Þ¤¹¤¬¡¢¤½¤ÎÈ¿ÌÌ¡¢¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤ÏÂ礤¯¤Ê¤ê¤Þ¤¹¡£
read()¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»È¤¤¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ÂÐÏ÷¿¥¹¥¥ã¥Ê¤Î¾ì¹ç¤Ïgetc()¤¬¡¢
¥Ð¥Ã¥Á¡ÊÈóÂÐÏ÷¿¡Ë¥¹¥¥ã¥Ê¤Î¾ì¹ç¤Ïfread()¤¬»È¤ï¤ì¤Þ¤¹¡£
lex.yy.c¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
yy¤¬ÉÕ¤±¤é¤ì¤Þ¤¹¡£
¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤ë¤È¡¢yy¤ÎÂå¤ï¤ê¤Ë¡¢
prefix¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ëʸ»úÎó¤¬ÀÜÆ¬¼¤È¤·¤Æ»ÈÍѤµ¤ì¤Þ¤¹¡£
¤Þ¤¿¡¢-o¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¤Î¥¹¥¥ã¥Ê¥Õ¥¡¥¤¥ë̾
lex.yy.c¤â¡¢lex.prefix.c¤È¤Ê¤ê¤Þ¤¹¡£
°Ê²¼¤Ë¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê±Æ¶Á¤ò¼õ¤±¤ë̾Á°¤Î°ìÍ÷¤ò¼¨¤·¤Þ¤¹¡£
yy_create_buffer yy_delete_buffer yy_scan_buffer yy_scan_string yy_scan_bytes yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrap
-+¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢
±Æ¶Á¤ò¼õ¤±¤ë¤Î¤Ïyywrap¤ÈyyFlexLexer¤Î2¤Ä¤À¤±¤Ç¤¹¡£
¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤ê¡¢
yywrap()¤Î̾Á°¤¬Êѹ¹¤µ¤ì¤Æ¤·¤Þ¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¥×¥í¥°¥é¥à¤ò¥ê¥ó¥¯¤¹¤ë¤¿¤á¤Ë¤Ï¡¢
prefixwrap¤È¤¤¤¦Ì¾Á°¤Î´Ø¿ô¤òºîÀ®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤³¤Î´Ø¿ô¤òºîÀ®¤·¤¿¤¯¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢
¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¡¢%option noyywrap¤ò»ØÄꤷ¤Æ¡¢
¥ê¥ó¥¯»þ¤Ë-lfl¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Þ¤¹¡£
%option»Ø¼¨»Ò¤Ë¤Ä¤¤¤Æ¤Ï¡¢%option (Flex 2.5)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
-h¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£
-V¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£
¤³¤Î¾Ï¤Ç¤Ï¡¢¥¹¥¥ã¥ÊÄêµÁ¤Î¹½À®Í×ÁǤòÀâÌÀ¤·¡¢¤½¤Î»ÈÍÑÎã¤ò¼¨¤·¤Þ¤¹¡£ Flex¤ò¸úΨŪ¤Ë»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢ ÄêµÁ¤Î¸Ä¡¹¤ÎÍ×ÁǤò´°Á´¤ËÍý²ò¤¹¤ë¤³¤È¤¬Èó¾ï¤Ë½ÅÍפǤ¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢½é¤á¤ÆFlex¤ò»È¤¦¥æ¡¼¥¶¡¼¤Ï¡¢ »þ´Ö¤ò¤«¤±¤ÆËܾϤòÆÉ¤à¤³¤È¤ò¤ª¤¹¤¹¤á¤·¤Þ¤¹¡£
Flex¥¹¥¥ã¥ÊÄêµÁ¤Î¤Û¤È¤ó¤É¤ÎÍ×ÁǤϡ¢Ç¤°Õ¤Ç¤¹¡£ Á´ÂÎŪ¤ÊÄêµÁ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
ÄêµÁ¤È½é´üC¥³¡¼¥É %% ¥ë¡¼¥ë %% ¾¤ÎC¥³¡¼¥É
¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤Æ¡¢°Ê²¼¤Ë¤ª¤¤¤Æ¾ÜºÙ¤ËÀâÌÀ¤·¤Þ¤¹¡£
C¤Î¥³¡¼¥É¤òµ½Ò¤Ç¤¤ë¤È¤³¤í¤Ë¤Ï¡¢¤É¤³¤Ë¤Ç¤â¥³¥á¥ó¥È¤òµ½Ò¤Ç¤¤Þ¤¹¡£ ¥³¥á¥ó¥È¤Î½ñ¼°¤Ï¡¢C¤Î¥³¥á¥ó¥È¤Îµ¬Â§¤Ë½¾¤¤¤Þ¤¹¡£ ¥³¥á¥ó¥È¤Ï¡¢µ½Ò¾ðÊó¤Ë±Æ¶Á¤òµÚ¤Ü¤¹¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£ C¥¹¥¿¥¤¥ë¤Î¥³¥á¥ó¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
/* ... */
¤³¤ì¤Ë²Ã¤¨¤Æ¡¢Flex¤Ç¤Ï#¤Ç»Ï¤Þ¤ë¥³¥á¥ó¥È¤âµö¤µ¤ì¤Þ¤¹¡£
¤·¤«¤·¡¢¤³¤Î¤è¤¦¤Ê¥³¥á¥ó¥È¤Ïlex.yy.c¤Ë¤Ï¥³¥Ô¡¼¤µ¤ì¤Ê¤¤¤Î¤Ç¡¢
¤³¤Î·Á¼°¤Î¥³¥á¥ó¥È¤Î»ÈÍѤϤª¤¹¤¹¤á¤Ç¤¤Þ¤»¤ó¡£
Ãí°Õ¡§C°Ê³°¤Î¸À¸ì¡Ê¤¿¤È¤¨¤ÐPascal¡Ë ¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ëLex¤â¸ºß¤·¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤ÊLex¤Ç¤Ï¥³¥á¥ó¥È¤Î½ñ¼°¤Ï¤ª¤½¤é¤¯°Û¤Ê¤ë¤Ç¤·¤ç¤¦¡£ Flex¤Î¾ì¹ç¤ÏC¤Î¥³¡¼¥É¤·¤«À¸À®¤·¤Þ¤»¤ó¡£
¥×¥í¥°¥é¥Þ¤Ï¡¢2¤Ä¤Î°Û¤Ê¤ëÊýË¡¤òÍѤ¤¤Æ¡¢
¥¹¥¥ã¥Ê¤ÎÃæ¤ËľÀÜC¤Î¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Âè1¤ÎÊýË¡¤Ï¡¢¡ÖÄêµÁ¤È½é´üC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó
¡ÊºÇ½é¤Î%%¤è¤êÁ°¤ÎÉôʬ¡Ë¤Ë¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤Ç¤¹¡£
Âè2¤ÎÊýË¡¤Ï¡¢¡Ö¾¤ÎC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó
¡Ê2ÈÖÌܤÎ%%¤è¤ê¸å¤í¤ÎÉôʬ¡Ë¤Ë¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤Ç¤¹¡£
¤É¤Á¤é¤Î¾ì¹ç¤â¡¢¥³¡¼¥É¤Ï¤½¤Î¤Þ¤Þlex.yy.c¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¤Î¤Ç¡¢
ÀµÅö¤Ê¥³¡¼¥É¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Âè1¤Î¥»¥¯¥·¥ç¥óÃæ¤ÎC¥³¡¼¥É¤Ï°Ê²¼¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£
%{
C¥³¡¼¥É
...
%}
¤³¤³¤Ç%{...%}¤È¤¤¤¦¥Ú¥¢¤¬¡¢
C¥³¡¼¥É¥Ö¥í¥Ã¥¯¤ÎÀèÆ¬¤ÈËöÈø¤ò¼¨¤¹¤¿¤á¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤Î·Á¼°¤Î¥³¡¼¥É¤ÈÄêµÁ¤Ï¡¢¡ÖÄêµÁ¤È½é´üC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó¤Î¤É¤³¤Ë¤Ç¤â
¼«Í³¤Ëµ½Ò¤Ç¤¤Þ¤¹¡£
ÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ï¼¡¤ÎÀá¤ÇÀâÌÀ¤·¤Þ¤¹¡£
C¤Î¥³¡¼¥É¤¬ºÇ½é¤Î¥«¥é¥à¤«¤é»Ï¤Þ¤ë¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢
%{...%}¤È¤¤¤¦¥Ú¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
¤·¤«¤·ÉáÄ̤ϡ¢¤ï¤«¤ê¤ä¤¹¤¯¤¹¤ë¤¿¤á¤Ëµ½Ò¤·¤Æ¤ª¤¤¤¿¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
¤â¤¦1¤Ä¤Î¥Ý¥¤¥ó¥È¤Ï¡¢#ifdef¤Ê¤É¤Î¤è¤¦¤ËºÇº¸Ã¼¤Î¥«¥é¥à¤«¤é»Ï¤Þ¤é¤Ê¤±¤ì¤Ð
¤Ê¤é¤º¡¢¤«¤Ä¡¢Ä̾ï¤Ï¥¹¥¥ã¥Êµ½Ò¾ðÊó¤ÎÀèÆ¬¤ËÃÖ¤«¤ì¤ëɬÍפΤ¢¤ë¤â¤Î¤¬Â¸ºß¤¹¤ë
¤È¤¤¤¦ÅÀ¤Ç¤¹¡£
¤³¤¦¤·¤¿¾ì¹ç¡¢%{...%}¤Ë°Ï¤Þ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢
Flex¤Ï¤½¤ì¤òÄêµÁ¤Î°ìÉô¤Ç¤¢¤ë¤È¤ß¤Ê¤¹¤Ç¤·¤ç¤¦¡£
¤³¤ì¤¬¡¢¾ï¤Ë%{...%}¤ò»È¤¦¤â¤¦1¤Ä¤ÎÍýͳ¤Ç¤¹¡£
ºÇ¸å¤Î¡Ê¡Ö¾¤ÎC¥³¡¼¥É¡×¡Ë¥»¥¯¥·¥ç¥óÆâ¤Î¥³¡¼¥É¤Ï¡¢¤½¤Î¤Þ¤Þ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ¤³¤³¤Ë¤ÏÆÃÊ̤ÊÀë¸À¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
ÄêµÁ¥»¥¯¥·¥ç¥ó¤Ë¤ª¤¤¤Æ¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢¤¢¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ë°ì°Õ¤Ê¼±Ê̻ҤòÍ¿¤¨¡¢ ¤½¤Î¼±Ê̻Ҥ¬¤½¤Îʸ»ú¥°¥ë¡¼¥×¤ËÃÖ¤´¹¤¨¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ÄêµÁ¤Ï°Ê²¼¤Î¤è¤¦¤Ê·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£
definition_name definition
definition_name¤ÏºÇ½é¤Î¥«¥é¥à¤«¤é»Ï¤Þ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢
¤½¤¦¤·¤Ê¤¤¤È¤½¤ÎÄêµÁ¤Ïlex.yy.c¤Ë¤½¤Î¤Þ¤Þ¥³¥Ô¡¼¤µ¤ì¤Æ¤·¤Þ¤¦¤È¤¤¤¦¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
°Ê²¼¤Ë°ìÈÌŪ¤ÊÄêµÁ¤ò¤¤¤¯¤Ä¤«¤¢¤²¤Þ¤¹¡£
DIGIT [0-9]
LETTER [a-z]
IDENT [a-z_][a-z0-9_]*
ALPHANUM {LETTER}|{DIGIT}
definition name¤Ï¡¢
¤½¤Î¥°¥ë¡¼¥×¤Î°ì°Õ¤Ê¼±Ê̻ҤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¤Þ¤¿¡¢definition¤Ï¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¡Ê¸å½Ò¡Ë¤Ë¤ª¤¤¤ÆÀµÅö¤Ê¤â¤Î¤Ç¤¢¤ì¤Ð
¤Ê¤ó¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£
¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤ä¡Ê¾å¤ÎÎã¤ÎALPHANUM¤ÎÄêµÁ¤Ë¤ª¤¤¤Æ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¡Ë
Ê̤ÎÄêµÁÃæ¤Ë¤ª¤¤¤Æ»È¤ï¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢
ÄêµÁ¤Ï{ }¤Ë¤è¤Ã¤Æ°Ï¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Flex¤ÈLex¤ÎÈó¾ï¤Ë½ÅÍפÊÁê°ãÅÀ¤Ë¡¢ÄêµÁ¤òŸ³«¤¹¤ë¤È¤¡¢
Flex¤Ï»úµÁ¤É¤ª¤ê¤Ë´Ý¤«¤Ã¤³( )¤Ç°Ï¤à¤Î¤ËÂФ·¤Æ¡¢
Lex¤Ï°Ï¤Þ¤Ê¤¤¤È¤¤¤¦ÅÀ¤¬¤¢¤ê¤Þ¤¹¡£1
¤³¤ì¤Ï¡¢^¡¢<<EOF>>¡¢$¡¢/¤òÄêµÁÃæ¤ËÆþ¤ì¤ë¤³¤È¤¬
¤Ç¤¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¤È¤¤¤¦¤Î¤Ï¡¢Á°½Ò¤Îʸ»ú¤Ï´Ý¤«¤Ã¤³( )¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤ËÆþ¤ì¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤
¤«¤é¤Ç¤¹¡£
¾ÜºÙ¤Ï¡¢Characters¤ª¤è¤ÓFlex and Lex¤Ë¤ª¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢
FUNCTION ^[a-zA-Z_][a-zA-Z0-9_]*"("
%%
{FUNCTION} printf("got a function\n");
¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥ß¥ó¥°¥¹¥¿¥¤¥ë¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Î¡¢ C¤Î´Ø¿ôÀë¸À¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¸«¤¨¤Þ¤¹¡£
int
foo()
{
...
}
¤·¤«¤·¼ÂºÝ¤Ë¤Ï¤¦¤Þ¤¯¤¤¤¤Þ¤»¤ó¡£
¤È¤¤¤¦¤Î¤Ï¡¢{FUNCTION}¤¬Å¸³«¤µ¤ì¤ë¤È¡¢
(^[a-zA-Z_][a-zA-Z0-9_]*)
¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢¤³¤ì¤ÏÉÔÀµ¤À¤«¤é¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤Ê¼ïÎà¤ÎÌäÂê¤Ë´Ø¤¹¤ëÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ Flex and POSIX¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
2¤Ä¤Î¥Ñ¡¼¥»¥ó¥Èµ¹æ¤¬¡¢¥¹¥¥ã¥Êµ½Ò¾ðÊó¤Î¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤ÎÀèÆ¬¤ÈËöÈø
¤ò¼¨¤·¤Þ¤¹¡£
¤¹¤Ù¤Æ¤ÎFlexµ½Ò¾ðÊó¤Ï¡¢¾¯¤Ê¤¯¤È¤â¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤ÎÀèÆ¬¤ò¼¨¤¹
%%¤ò´Þ¤ó¤Ç¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¥ë¡¼¥ë¤ÏFlex¤Î¿´Â¡Éô¤Ç¤¹¡£ ¥ë¡¼¥ë¤ò½ñ¤¯¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢ ¥¹¥¥ã¥Ê¤¬²¿¤ò¼Â¹Ô¤¹¤ë¤Ù¤¤Ç¤¢¤ë¤«¤òFlex¤ËÄÌÃΤ·¤Þ¤¹¡£
Ä̾¥ë¡¼¥ë¤Ï2¤Ä¤ÎÉôʬ¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£
pattern actions
¤³¤Î¤¦¤Ápattern¤¬²¿¤òǧ¼±¤¹¤ë¤Ù¤¤«¤òÄêµÁ¤·¡¢ actions¤¬¤½¤Î²¿¤«¤òǧ¼±¤·¤¿¤È¤¤Ë²¿¤ò¼Â¹Ô¤¹¤ë¤Ù¤¤Ç¤¢¤ë¤« ¤ò¥¹¥¥ã¥Ê¤ËÃΤ餻¤Þ¤¹¡£ pattern¤ÎÉôʬ¤Ï¶õÇò¤Ë¤è¤Ã¤Æ¶èÀÚ¤é¤ì¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢¶õÇò¤ò¥Þ¥Ã¥Á¤µ¤»¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ ¤½¤ì¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¥¹¥¥ã¥Ê¤Ï¡¢¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò2¤Ä°Ê¾å¸«¤Ä¤±¤¿¾ì¹ç¡¢ °Ê²¼¤Î2¤Ä¤Î¥ë¡¼¥ë¤ò»È¤Ã¤Æ¤É¤ì¤ò¼õ¤±Æþ¤ì¤ë¤«¤ò·è¤á¤Þ¤¹¡£
actions¤Ï¡¢
¶õ¡Ê¥³¡¼¥É¤Ê¤·¡Ë¤Ë¤¹¤ë¤«¡¢¤â¤·¤¯¤Ï¡¢1¤Ä°Ê¾å¤ÎC¤Îʸ¤ò´Þ¤àñ°ì¤Î¥³¡¼¥É¹Ô¡¢
{...}¤Þ¤¿¤Ï%{...%}¤Ç°Ï¤Þ¤ì¤¿1¹Ô°Ê¾å¤Î¥³¡¼¥É¡¢
ñ°ì¤Î¿âľËÀ¡Ê|¡Ë¤Î¤¤¤º¤ì¤«¤òµ½Ò¤Ç¤¤Þ¤¹¡£
°Ê²¼¤Ë¤¤¤¯¤Ä¤«Îã¤ò¤¢¤²¤Þ¤¹¡£
hi |
bonjour |
hello printf("hello!\n");
goodbye { printf("goodbye!\n"); }
konnichiwa {
line 1
...
line n
}
sayonara printf("lex will not "); printf("print this\n");
¤É¤Î¹Ô¤âÊ£¿ô¤Îʸ¤ò´Þ¤à¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
|¤Ï¡¢¤½¤Î¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢
¼¡¤Ë¸½¤ì¤ë¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥óÉô¤Ëµ½Ò¤µ¤ì¤Æ¤¤¤ë¥¢¥¯¥·¥ç¥ó¤¬
¼Â¹Ô¤µ¤ì¤ë¤Ù¤¤Ç¤¢¤ë¤³¤È¤òFlex¤ËÄÌÃΤ·¤Þ¤¹¡£
Ãí°Õ¡§¤Û¤È¤ó¤É¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎLex¤Ï¡¢
{¤È}¤Î¥Ú¥¢¤Î³°Éô¤Ç¤Ïñ°ì¤Îʸ¤·¤«µö¤·¤Þ¤»¤ó
¡Ê¤¿¤È¤¨¤Ð¾åµ¤Îsayonara¥ë¡¼¥ë¤Ïµö¤µ¤ì¤Þ¤»¤ó¡Ë¡£
¤Þ¤¿¡¢C°Ê³°¤Î¸À¸ì¤ò¥¿¡¼¥²¥Ã¥È¤Ë¤·¤Æ¤¤¤ëLex¤Ç¤Ï¡¢{¤È}¤Î¥Ú¥¢¤Ï¡¢
¤¿¤È¤¨¤ÐPascal¤Î¾ì¹ç¤Îbegin...end¤Î¤è¤¦¤Ë¡¢
°Û¤Ê¤ë¥·¥ó¥Ü¥ë¤ËÃÖ¤´¹¤¨¤ëɬÍפ¬¤¢¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£
¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤Ê¤«¤Ã¤¿ÆþÎϤËÂФ¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢
¤½¤ì¤òstdout¤Ë½ÐÎϤ¹¤ë¤³¤È¤Ç¤¢¤ê¡¢
°ìÊý¡¢¥Þ¥Ã¥Á¤·¤¿¥Ñ¥¿¡¼¥ó¤ËÂФ¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢
¤½¤ì¤òÇË´þ¤¹¤ë¤³¤È¤Ç¤¢¤ë¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ì¤Ï¡¢¤â¤Ã¤È¤âñ½ã¤ÊFlex¤ÎÄêµÁ¤¬
%%
¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ï¡¢ÆþÎϤòÊѹ¹¤»¤º¤½¤Î¤Þ¤Þstdout¤Ø½ÐÎϤ¹¤ë¤â¤Î¤Ç¤¹¡£
Ê̤Îñ½ã¤ÊÎã¤È¤·¤Æ°Ê²¼¤Î¤è¤¦¤Ê¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£
%% foobar
¤³¤Î¾ì¹ç¡¢ÆþÎϤÎÃæ¤«¤éfoobar¤È¤¤¤¦Ê¸»ú¤ÎʤӤò¤¹¤Ù¤Æ¼è¤ê½ü¤¡¢
¼è¤ê½ü¤¤¤¿·ë²Ì¤òstdout¤Ë½ÐÎϤ·¤Þ¤¹¡£
¥Ñ¥¿¡¼¥ó¥»¥¯¥·¥ç¥ó¤Ï¡¢Àµµ¬É½¸½¤È¸Æ¤Ð¤ì¤ë»ÅÁȤߤò»È¤Ã¤Æ¼ÂºÝ¤Î ¥Þ¥Ã¥Á¥ó¥°½èÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£ Àµµ¬É½¸½¤Ï¡¢Ê¸»úÎó¡¢Ê¸»ú¡¢Ê¸»ú½¸¹ç¡Ê¥¯¥é¥¹¡Ë¡¢ ¤ª¤è¤Ó±é»»»Ò¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ Àµµ¬É½¸½¤ò¹½À®¤¹¤ëÍ×ÁǤˤĤ¤¤Æ¤Ï¼¡Àá°Ê¹ß¤ÇÀâÌÀ¤·¤Þ¤¹¡£ ¤Þ¤¿Àµµ¬É½¸½¼«ÂΤˤĤ¤¤Æ¤Ï¡¢Regular Expressions¤Ë¤ª¤¤¤Æ²òÀ⤷¤Þ¤¹¡£
¤¤¤¯¤Ä¤«¤Îʸ»ú¤ÏFlex¤Ë¤È¤Ã¤ÆÆÃÊ̤ΰÕÌ£¤¬¤¢¤ê¡¢
¤½¤Îʸ»ú¤òñÆÈ¤Ç»È¤Ã¤¿¤Î¤Ç¤Ï¡¢¤½¤Îʸ»ú¼«ÂΤòɽ¤¹¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£
°Ê²¼¤Ë¡¢Flex¤Ë¤ª¤±¤ëÆÃ¼ìʸ»ú¤È¤½¤Î°ÕÌ£¤òɽ¤Ë¤·¤Æ¼¨¤·¤Þ¤¹¡£
ʸ»ú- Flex¤Ë¤è¤ë²ò¼á
.- ¥Ô¥ê¥ª¥É¤Ï²þ¹Ô¡Ê
\n¡Ë°Ê³°¤ÎǤ°Õ¤Îʸ»ú¤òɽ¤·¤Þ¤¹¡£\- ¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å¤Ï¥¨¥¹¥±¡¼¥×ʸ»ú¤Ç¤¹¡£ ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ÏANSI C¤Î¤â¤Î¤ÈƱ¤¸¤Ç¤¹¡£
[ ]- ³Ñ¤«¤Ã¤³[ ]¤ÏÊ£¿ô¤Îʸ»ú¤òʸ»ú¥¯¥é¥¹¤Ë¥°¥ë¡¼¥×²½¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½¡£
^- ʸ»ú¥¯¥é¥¹¤ÎÆâÉô¤Ç¤Ï¡Ö^¡×¤ÏÈÝÄê¤ò°ÕÌ£¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½¡£ ʸ»ú¥¯¥é¥¹¤Î³°Éô¤Ç¤Ï¡¢¡Ö^¡×¤Ï¹Ô¤ÎÀèÆ¬¤ò°ÕÌ£¤·¡¢ ¥ë¡¼¥ë¤ÎÀèÆ¬¤Ë¤Î¤ßÃÖ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ Îã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
[^AB]- ÈÝÄꥯ¥é¥¹¤Ç¤¹¡£
^foo- ¹Ô¤ÎÀèÆ¬¤Ë¤¢¤ë
foo¤È¤¤¤¦Ê¸»ú¤ÎʤӤˤΤߥޥåÁ¤·¤Þ¤¹¡£foo^- ¤³¤Î¾ì¹ç¡¢
^¤ÏÉáÄ̤Îʸ»ú¤Ç¤¢¤ë¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¤È¤¤Ë¤Ï¡¢´õ˾¤É¤ª¤ê¤Î·ë²Ì¤¬³Î¼Â¤ËÆÀ¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢ ÆÃÊ̤ʰÕÌ£¤ò»ý¤Äʸ»ú¤ÎÁ°¤Ë¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å\¤òÃÖ¤¯¤Î¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£ ¤³¤Î¤è¤¦¤Êʸ»ú¤ÎʤӤò¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤È¸Æ¤Ó¤Þ¤¹¡£ ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤Ë¤Ä¤¤¤Æ¤Ï¤³¤ÎÀá¤ÎºÇ¸å¤ÇÀâÌÀ¤·¤Þ¤¹¡£-- ¥Ï¥¤¥Õ¥ó¤Ïʸ»ú¥¯¥é¥¹¤ÎÆâÉô¤Ë¤ª¤¤¤ÆÊ¸»ú¤ÎÈϰϤòɽ¤·¤Þ¤¹¡£ ʸ»ú¥¯¥é¥¹¤Î³°Éô¤Ç¤Ï¡¢¥Ï¥¤¥Õ¥ó¤Ï¤½¤ì¼«¿È¤òɽ¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½¡£
{ }- Ãæ¤«¤Ã¤³{ }¤Ï¡¢ÄêµÁ¤Î»²¾È¡¢Ê£¿ô¹Ô¤Î¥¢¥¯¥·¥ç¥ó¤Î°Ï¤ß¡¢ ¤Þ¤¿¤Ï¤¢¤ëÈϰϤˤ錄¤ë·«¤êÊÖ¤·¤ÎÄêµÁ¤ò¹Ô¤¤¤Þ¤¹¡£ Îã¤ò¤¢¤²¤ë¤È¡¢ÄêµÁ
FOO¤¬¤¢¤Ã¤Æ¡¢ ¤½¤ì¤ò¥ë¡¼¥ë¤ÎÃæ¤Ç»²¾È¤·¤¿¤¤¾ì¹ç¤Ë{FOO}¤ò»È¤¤¤Þ¤¹¡£Í¿¤¨¤é¤ì¤¿¥Ñ¥¿¡¼¥ó¤Î¤¢¤ëÈϰϤˤ錄¤ë·«¤êÊÖ¤·¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¢ °Ê²¼¤Î¤è¤¦¤Ê
{ repetition list }¤ò»È¤¤¤Þ¤¹¡£%% f{2,5} /* f¤Î2²ó°Ê¾å5²ó°Ê²¼¤Î·«¤êÊÖ¤· */ /* ¤Ë¥Þ¥Ã¥Á */ f{2,} /* f¤Î2²ó°Ê¾å¤Î·«¤êÊÖ¤·¤Ë¥Þ¥Ã¥Á */ f{2} /* f¤Î2²ó¤Î·«¤êÊÖ¤·¤Ë¥Þ¥Ã¥Á */¤³¤ÎÍÑË¡¤Î²ò¼á¤Ë¤ª¤¤¤Æ¡¢ Flex¤ÈLex¤Î´Ö¤Ë¤Ï¤¤¤¯¤Ä¤«¤ÎÁê°ãÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and POSIX¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
( )- ´Ý¤«¤Ã¤³( )¤ò»È¤Ã¤ÆÍ¥Àè½ç°Ì¤òÊѹ¹¤Ç¤¤Þ¤¹¡£ ¤Þ¤¿¡¢ÄêµÁ¤¬Å¸³«¤µ¤ì¤ë¤È¤¤Ë¤Ï¡¢¤½¤ÎÄêµÁ¤Ï°ÅÌۤΤ¦¤Á¤Ë ´Ý¤«¤Ã¤³( )¤Ç°Ï¤Þ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£2 ¤³¤Î¤¿¤á¡¢Lex¤È¤ÏÈó¸ß´¹¤Ê¤È¤³¤í¤¬¤Ç¤Æ¤¤Þ¤¹¡£ ¤³¤ÎÅÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and POSIX¤ÈDefinitions¤ÇÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£
""- Æó½Å°úÍÑÉäµ¹æ¤Ïʸ»úÎó¤òɽ¤·¤Þ¤¹¡£ °úÍÑÉä¤ÎÆâ¦¤Îʸ»úÎó¤À¤±¤¬¥Þ¥Ã¥Á¤ÎÂоݤˤʤê¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢
%% "string"¤Ï
"string"¤Ë¤Ç¤Ï¤Ê¤¯¡¢string¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£/- ¥¹¥é¥Ã¥·¥å¤Ï¸å³¥³¥ó¥Æ¥¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢¤¢¤ë¥Ñ¥¿¡¼¥ó¤Î¸å¤í¤ËÆÃÄê¤Îʸ»ú¤ÎʤӤ¬Â³¤¯¾ì¹ç¤Î¤ß¡¢ ¤½¤Î¥Ñ¥¿¡¼¥ó¤òǧ¼±¤·¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢¥¹¥é¥Ã¥·¥å
/¤Ï¡Ö¥ë¥Ã¥¯¥¢¥Ø¥Ã¥É¡ÊÀèÆÉ¤ß¡Ë¡×±é»»»Ò¤È¤·¤Æ µ¡Ç½¤·¤Þ¤¹¡£ Îã¤ò¤¢¤²¤ë¤È¡¢
abcDEFabcDEF¤òǧ¼±¤·¤Þ¤¹¡£abc/DEFabc¤Î¸å¤í¤ËDEF¤¬Â³¤¯¾ì¹ç¤Ë¸Â¤ê¡¢abc¤òǧ¼±¤·¤Þ¤¹¡£DEF¤ÎÉôʬ¤Ï¡¢¤Þ¤ÀÆÉ¤Þ¤ì¤Æ¤Ï¤¤¤Ê¤¤¤«¤Î¤è¤¦¤Ë°·¤ï¤ì¡¢ ¥Þ¥Ã¥Á¤ÎÂоݤˤʤê¤Þ¤»¤ó¡£Ãí°Õ¡§1¤Ä¤Î¥ë¡¼¥ë¤ÎÃæ¤Ç¤Ï
/¤Ï1¤Ä¤À¤±µö¤µ¤ì¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢abc/def/hijkl¤ÏÉÔÀµ¤Ç¤¹¡£
< >- »³¤«¤Ã¤³< >¤Ï¥¹¥¿¡¼¥È¾õÂÖ¤ò»²¾È¤·¤Þ¤¹¡£ ¤Þ¤¿¡¢EOF¥·¥ó¥Ü¥ë¡Ê
<<EOF>>¡Ë¤Ë¤â»È¤ï¤ì¤Þ¤¹¡£ ´°Á´¤ÊÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ Start States¤ÈEnd-Of-File Rules¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£? + *?¡¢+¡¢*¤Ï¡¢ ¤¢¤ëÀµµ¬É½¸½¤¬½Ð¸½¤Ç¤¤ë²ó¿ô¤òÀßÄꤷ¤Þ¤¹¡£?¤Ï0²ó¤â¤·¤¯¤Ï1²ó¡Ê¤½¤ÎÀµµ¬É½¸½¤¬¸½¤ì¤ë¤³¤È¤¬É¬¿Ü¤Ç¤Ï¤Ê¤¤¤È¤¤¤¦¤³¤È¡Ë ¤ò°ÕÌ£¤·¤Þ¤¹¡£+¤Ï1²ó°Ê¾å¤ò°ÕÌ£¤·¤Þ¤¹¡£*¤Ï0²ó°Ê¾å¤ò°ÕÌ£¤·¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢
a?- 0¸Ä¤â¤·¤¯¤Ï1¸Ä¤Î
a¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£a+- 1¸Ä°Ê¾å¤Î
a¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£a*- 0¸Ä°Ê¾å¤Î
a¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£(ABC)+ABC¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬1²ó°Ê¾å³¤¯¤â¤Î¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£[abQrS]?- 0¸Ä¤â¤·¤¯¤Ï1¸Ä¤Î¡¢¡Ê5¤Ä¤Îʸ»ú
abQrS¤«¤é¹½À®¤µ¤ì¤ë¡Ë ¤³¤Îʸ»ú¥¯¥é¥¹¤Î¥á¥ó¥Ð¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ ʸ»ú¥¯¥é¥¹¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£{NUM}*- 0¸Ä°Ê¾å¤Î
NUM¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ ¤³¤³¤Ç¤ÎNUM¤ÏÄêµÁ¤Ç¤¹¡£ ÄêµÁ¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Definitions¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£|- OR±é»»»Ò¤ª¤è¤ÓÆÃÊ̤ʥ¢¥¯¥·¥ç¥ó¤òɽ¤·¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢
apples|oranges¤Ï
apples¤â¤·¤¯¤Ïoranges¤Î¤¤¤º¤ì¤«¤Ë¥Þ¥Ã¥Á¤·¡¢apples | oranges printf("fruit!\n");¤Ï¡¢
apples¤Èoranges¤ÎξÊý¤ËÂФ·¤ÆÆ±°ì¤Î¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£$- ¥É¥ëµ¹æ¤Ï¹ÔËö¤ò°ÕÌ£¤·¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢
end$¤Ï¤½¤Îľ¸å¤¬¹ÔËö¤Ç¤¢¤ë¾ì¹ç¤Ë¤Î¤ß
end¤È¤¤¤¦Ê¸»ú¤ÎʤӤ˥ޥåÁ¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢¸å¤í¤Ë³¤¯¤Î¤¬¹ÔËö¤Î¥Þ¡¼¥«¤Ç¤¢¤ë¾ì¹ç¤Î¤ßend¤Ë¥Þ¥Ã¥Á¤¹¤ëend/\n¤È¤Þ¤Ã¤¿¤¯Æ±¤¸¤Ç¤¹¡£
¤³¤¦¤·¤¿Ê¸»ú¤Î¤¤¤º¤ì¤«¤ò¤½¤Îʸ»ú¼«¿È¤È¤·¤ÆÉ½¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ °úÍÑÉä¤Ç°Ï¤à¤«¡¢¡Ê¸å¤Ë¼¨¤¹É½¤ÇÀâÌÀ¤¹¤ë¡Ë ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤È¤·¤ÆÉ½¤µ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Flex¤Ë¤Ï3¼ïÎà¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬¤¢¤ê¤Þ¤¹¡£
¤½¤ì¤Ï¡¢¥Ð¥Ã¥¯¥¹¥é¥Ã¥·¥å\¤Ë³¤±¤Æ8¿Ê¿ô¤ò»È¤¦¤â¤Î¡¢\x¤Ë³¤±¤Æ
16¿Ê¿ô¤ò»È¤¦¤â¤Î¡¢\letter¤È¤¤¤¦É½µË¡¤Ë¤è¤Ã¤Æ¤¢¤ë1ʸ»ú¤Þ¤¿¤Ï
ÆÃÊ̤Êɽ¼¨ÉԲĤÎʸ»ú¤òɽ¤¹¤â¤Î¤Î3¤Ä¤Ç¤¹¡£
C¤ò¤è¤¯ÃΤäƤ¤¤ë¿Í¤Ç¤¢¤ì¤Ð¡¢¤³¤Î3¤Ä¤¬ANSI C¤Î¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤Ç¤¢¤ë¤³¤È
¤Ëµ¤¤¬¤Ä¤¯¤Ç¤·¤ç¤¦¡£
¿ôÃͤˤè¤ë¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤Ï¡¢100¥Ñ¡¼¥»¥ó¥È°Ü¿¢À¤¬¤¢¤ë¤ï¤±¤Ç¤Ï¤Ê¤¯¡¢
Êݼé¤òº¤Æñ¤Ë¤¹¤ë¤Î¤ÇÈò¤±¤ë¤Ù¤¤Ç¤¹¡£
°Ê²¼¤Ë¡¢Ê¸»ú¤Î»ÈÍѤ˴ؤ¹¤ëÍ×Ìó¤ò¼¨¤·¤Þ¤¹¡£
¤³¤³¤Ç¤Ï¡¢c¤¬Ã±°ì¤Îʸ»ú¤ò¡¢NNN¤¬8¿ÊÄê¿ô¤ò¡¢
HH¤¬16¿ÊÄê¿ô¤òɽ¤·¤Þ¤¹¡£
Ãí°Õ¡§¤¤¤¯¤Ä¤«¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎLex¤Ç¤Ï¡¢\0¤òÀµ¤·¤¯Ç§¼±
¤Þ¤¿¤Ï¥Þ¥Ã¥Á¤·¤Þ¤»¤ó¡£
¤³¤ì¤Ï¡¢\0¤¬NUL¡¢¤Ä¤Þ¤êCʸ»úÎó¤Î½ªÃ¼Ê¸»ú¤À¤«¤é¤Ç¤¹¡£
Flex¤Ç¤Ï¡¢NUL¤ò¥Þ¥Ã¥Á¤ÎÂоݤˤ·¤Æ¤âÌäÂê¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢
Àǽ¤Ë¤Ï¼ã´³±Æ¶Á¤·¤Þ¤¹¡£
¤µ¤é¤ËÉÕ¤±²Ã¤¨¤ë¤È¡¢^±é»»»Ò¤È<<EOF>>¤Ï¥ë¡¼¥ë¤ÎÀèÆ¬¤Ë¤Î¤ß
ÃÖ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤Þ¤¿¡¢¤³¤ì¤é¤È$¡¢/¤Ï´Ý¤«¤Ã¤³( )¤ÎÆâÉô¤ËÃÖ¤¯¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
¤³¤Î¤³¤È¤Ï¤Þ¤¿¡¢ÄêµÁ¤ÎÀµÅöÀ¤Ë¤â±Æ¶Á¤òµÚ¤Ü¤·¤Þ¤¹¡£
¤È¤¤¤¦¤Î¤Ï¡¢Å¸³«¤µ¤ì¤ë¤È¤¤ËÄêµÁ¤Ï»úµÁ¤É¤ª¤ê¤Ë´Ý¤«¤Ã¤³( )¤Ç°Ï¤Þ¤ì¤ë¤«¤é¤Ç¤¹¡£
3
¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Definitions¤ÈFlex and POSIX¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
ʸ»úÎó¤È¤Ï¡¢¡Ê¾ï¤Ë¡¢¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡Ë ¿¤¯¤Î¾ì¹ç¡¢°úÍÑÉä¤Ë¤è¤Ã¤Æ°Ï¤Þ¤ì¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ç¤¹¡£ ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬»È¤ï¤ì¤Ê¤¤¤«¤®¤ê¡¢ ʸ»úÎó¤Ë¤Ï²þ¹Ô¤äɽ¼¨ÉԲĤÎʸ»ú¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
-i ¥ª¥×¥·¥ç¥ó¡Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Case Insensitive Scanners¡Ë
¤ò»È¤ï¤Ê¤¤¤«¤®¤ê¡¢Âçʸ»ú¡¿¾®Ê¸»ú¤Î¶èÊ̤â´Þ¤á¤¿»úµÁ¤É¤ª¤ê¤Îʸ»úÎó
¤ËÂФ·¤Æ¥Þ¥Ã¥Á¤¬¹Ô¤ï¤ì¤Þ¤¹¡£
°úÍÑÉäÉÕ¤¤Îʸ»úÎó¤Ë¤Ä¤¤¤Æ¤Ï¡¢°úÍÑÉä¤Ïǧ¼±¤µ¤ì¤ëʸ»úÎó¤Ë¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£
¤¿¤È¤¨¤Ð¡¢
string StrING "STRING" \"string\"
¤Ï¤¹¤Ù¤ÆÀµÅö¤Êʸ»úÎó¤Ç¤¢¤ê¡¢ºÇ¸å¤Î¤â¤Î¤Ï°úÍÑÉä¤â´Þ¤á¤Æ¥Þ¥Ã¥Á¤µ¤ì¤Þ¤¹¡£ Flex¤Ë¤ª¤¤¤Æ¤Ïʸ»úÎó¤Ë¤Ï°úÍÑÉä¤Ïɬ¿Ü¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥¡¼¥ï¡¼¥É¤Î¥°¥ë¡¼¥×¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¾ì¹ç¡¢
begin end pointer ...
¤È
"begin" "end" "pointer" ...
¤Î¤¤¤º¤ì¤âÀµÅö¤Ç¤¹¡£
Flex¤Ç¤Ï¡¢Ê¸»ú¤ò¥°¥ë¡¼¥×²½¤·¤ÆÊ¸»ú¥¯¥é¥¹¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
ʸ»ú¥¯¥é¥¹¤Ï¡¢Ê¸»ú¤Î¥°¥ë¡¼¥×¤ò³Ñ¤«¤Ã¤³[ ]¤Ç°Ï¤à¤³¤È¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤Þ¤¹¡£
¤É¤Î¤è¤¦¤Êʸ»ú¤Ç¤âÀµÅö¤Ç¤¹¡Êɽ¼¨ÉԲĤÎʸ»ú¤Ë¤Ä¤¤¤Æ¤Ï¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹
¤ò»È¤¤¤Þ¤¹¡Ë¡£
¤Þ¤¿¡¢Ê¸»ú¤ÎÈϰϤò¥Ï¥¤¥Õ¥ó-¤ò»È¤Ã¤Æ»ØÄê¤Ç¤¤Þ¤¹¡£
ʸ»ú¥¯¥é¥¹¤¬¥ë¡¼¥ë¤ÎÃæ¤Ç»È¤ï¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢
Flex¤Ï¤½¤Î¥¯¥é¥¹¤ÎǤ°Õ¤Î¥á¥ó¥Ð¤È¥Þ¥Ã¥Á¤µ¤»¡¢
¤¢¤¿¤«¤âñ°ìʸ»ú¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ë¿¶¤ëÉñ¤¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢
[a-z] [A-Z]*
¤Ë¤ª¤¤¤Æ¡¢ºÇ½é¤ÎÎã¤Ïa¤«¤éz¤Þ¤Ç¤ÎǤ°Õ¤Îñ°ìʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
Âè2¤ÎÎã¤ÏA¤«¤éZ¤Þ¤Ç¤ÎǤ°Õ¤Îʸ»ú¤¬0¸Ä°Ê¾åʤó¤À¤â¤Î¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
ÈÝÄêʸ»ú¥¯¥é¥¹¤òɽ¤¹Àµµ¬É½¸½¤ò½ñ¤¯¤³¤È¤â¤Ç¤¤Þ¤¹¡£
ÈÝÄêʸ»ú¥¯¥é¥¹¤Ï¡¢¡Ê\n¤â´Þ¤á¤Æ¡Ëʸ»ú¥¯¥é¥¹¤Î¥á¥ó¥Ð°Ê³°
¤Ç¤¢¤ì¤Ð¤Ê¤ó¤Ë¤Ç¤â¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ÈÝÄꤹ¤Ù¤¥¯¥é¥¹¤ÎÀèÆ¬¤Ë^¤òÃÖ¤¤Þ¤¹¡Ê¥¯¥é¥¹¤Î³°Éô¤Ç¤Ï
^¤Ï°Û¤Ê¤ë°ÕÌ£¤ò»ý¤Ä¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡Ë¡£
°Ê²¼¤Ë¡¢ÀµÅö¤Ê¥¯¥é¥¹¤ÎÎã¤ò¤¤¤¯¤Ä¤«¤¢¤²¤Þ¤¹¡£
[abc]
a¡¢b¡¢c¤Î¤¤¤º¤ì¤«¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[abc\n]
a¡¢b¡¢c¡¢\n¤Î¤¤¤º¤ì¤«¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[a-z]
a¤«¤éz¤Þ¤Ç¤ÎÈϰϤˤ¢¤ëǤ°Õ¤Îʸ»ú¡¢
¤¹¤Ê¤ï¤Á¡¢Ç¤°Õ¤Î±Ñ¾®Ê¸»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[^a-z]
a¤«¤éz¤Þ¤Ç¤ÎÈϰϤˤ¢¤ëʸ»ú°Ê³°¤ÎǤ°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[ABcd]
A¡¢B¡¢c¡¢d¤Î¤¤¤º¤ì¤«¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
Ãí°Õ¡§Flex¡¢¤ª¤è¤Ó¤¤¤¯¤Ä¤«¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎLex¤Ï¡¢ ¥¯¥é¥¹Æâ¤Ë¤ª¤±¤ëµÕÊý¸þ¤ÎÈϰϤò°·¤¦¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢
%% [z-a9-0]
¤Ï¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ µÕÊý¸þ¤ÎÈϰϤϻØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£
Flex 2.5¤Ç¤Ï¡¢Ê¸»ú¥¯¥é¥¹¤ÎÃæ¤Ëʸ»ú¥¯¥é¥¹¼°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
ʸ»ú¥¯¥é¥¹¼°¤Ï¡¢·Á¼°Åª¤Ë¤Ï¡¢¤¢¤ëʸ»ú½¸¹ç¤ò¼±Ê̤¹¤ë̾Á°¤ò
[:¤È:]¤Ç°Ï¤ó¤À¤â¤Î¤Ç¤¹¡£
Flex 2.5¤Ç¤Ï¡¢°Ê²¼¤Îʸ»ú¥¯¥é¥¹¼°¤¬Í¸ú¤Ç¤¹¡£
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]
ʸ»ú¥¯¥é¥¹¼°[:XXX:]¤Ï¡¢ANSI C¤ÎisXXX()´Ø¿ô
¤¬¥¼¥í°Ê³°¤ÎÃͤòÊÖ¤¹Ê¸»ú¤Î½¸¹ç¤ËÂбþ¤·¤Þ¤¹¡£
Í£°ì¤ÎÎã³°¤Ï[:blank:]¤Ç¡¢isblank¤Ï¡ÊPOSIX¤Ç¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤Î¡Ë
ANSI C¤Ç¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡¢Flex¤Ç¤Ï¡¢¥Þ¥¯¥íIS_BLANK¤ò
#define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
¤Î¤è¤¦¤ËÄêµÁ¤·¤Æ¡¢¤³¤ì¤¬¿¿¤È¤Ê¤ëʸ»ú¤Î½¸¹ç¡Ê¤¹¤Ê¤ï¤Á¡¢¥¹¥Ú¡¼¥¹¤È¥¿¥Ö¡Ë ¤òʸ»ú¥¯¥é¥¹¼°[:blank:]¤ËÂбþ¤µ¤»¤Æ¤¤¤Þ¤¹¡£
ʸ»ú¥¯¥é¥¹¼°¤ò»È¤¨¤Ð¡¢
[a-zA-Z] [0-9]
¤ò
[[:alpha:]] [[:digit:]]
¤È½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤Þ¤¿¡¢Ê¸»ú¥¯¥é¥¹¤ÎÃæ¤ËÊ£¿ô¤Îʸ»ú¥¯¥é¥¹¼°¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤¤ë¤Î¤Ç¡¢
[a-zA-Z0-9]
¤ò¡¢
[[:alpha:][:digit:]]
¤È½ñ¤¯¤³¤È¤â¤Ç¤¤Þ¤¹¡Ê¤â¤Ã¤È¤â¡¢¤³¤ÎÎã¤Î¾ì¹ç¤Ï¡¢[[:alnum:]]¤È ½ñ¤¯¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡Ë¡£
Flex¤Îʸ»ú¡¢Ê¸»úÎó¡¢¥¯¥é¥¹¡¢ÄêµÁ¡¢¤ª¤è¤Ó±é»»»Ò¤òÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ç¡¢
Àµµ¬É½¸½¤È¤·¤ÆÃΤé¤ì¤Æ¤¤¤ë¤â¤Î¤¬ºî¤é¤ì¤Þ¤¹¡£
¡Ê´ðËÜñ°Ì¤¬¿ô¤È±é»»»Ò¤Ç¤¢¤ë¡Ë¿ô³ØÉ½¸½¤ÈƱ¤¸¤è¤¦¤Ë¡¢´ðËÜŪ¤ÊÍ×ÁǤÏñ½ã¤Ê¤â¤Î
¡Êʸ»ú¡¢±é»»»Ò¡¢Ê¸»úÎó¡¢¥¯¥é¥¹¡¢¤ª¤è¤ÓÄêµÁ¡Ë¤Ç¤¹¤¬¡¢
Í×ÁǤòÁȤ߹ç¤ï¤»¤ë¤³¤È¤Ç¤è¤êÊ£»¨¤Êɽ¸½¼°¤òºî¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢c¤Ïñ°ìʸ»ú¤ÎÀµµ¬É½¸½¤Ç¡¢c¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
cc¤Ï2¤Ä¤ÎÀµµ¬É½¸½¤ò¤Ä¤Ê¤¤¤À¤â¤Î¤ò´Þ¤àÀµµ¬É½¸½¤Ç¡¢
cc¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
c*¤Ï¡¢Ã±°ìʸ»ú¤ÎÀµµ¬É½¸½c¤È¡¢¤½¤ì¤Ë³¤¯±é»»»Ò*
¤«¤é¹½À®¤µ¤ì¤ëÀµµ¬É½¸½¤Ç¡¢0¸Ä°Ê¾å¤Îc¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
Àµµ¬É½¸½¤Î¿¿¤Î¥Ñ¥ï¡¼¤Ï¡¢¸Ä¡¹¤ÎÍ×ÁǤè¤ê¤â¤à¤·¤í¡¢
ÁȤ߹ç¤ï¤»²Äǽ¤ÊÊýË¡¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹¡£
¼¡¤Îɽ¤Ï¡¢Flex¤ÇÍøÍѲÄǽ¤ÊÀµµ¬É½¸½¤ò¤¹¤Ù¤Æ¼¨¤·¤¿¤â¤Î¤Ç¤¹¡£
¤³¤³¤Ç¡¢c¤Ï¡Ê¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ò´Þ¤à¡ËǤ°Õ¤Îñ°ìʸ»ú¤ò¡¢
r¤ÏǤ°Õ¤ÎÀµµ¬É½¸½¤ò¡¢s¤Ïʸ»úÎó¤òɽ¤·¤Þ¤¹¡£
ɽ¤Ï¥°¥ë¡¼¥×Ê̤ËÊÔÀ®¤·¤Æ¤¢¤ê¡¢Í¥ÀèÅ٤Τâ¤Ã¤È¤â¹â¤¤¤â¤Î¤¬¤¤¤Á¤Ð¤ó¾å¤Ë¤¢¤ê¤Þ¤¹¡£
Unix¤Ë¤ª¤¤¤Æ¥Ñ¥¿¡¼¥ó¸¡º÷¤¬É¬Íפʾì¹ç¤Ë¤ÏÀµµ¬É½¸½¤¬¤è¤¯»È¤ï¤ì¤Þ¤¹¤¬¡¢
¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬°Û¤Ê¤ë¤È¡¢
Àµµ¬É½¸½¤â¤è¤¯»÷¤Æ¤Ï¤¤¤ë¤â¤Î¤Î¤Þ¤Ã¤¿¤¯Æ±°ì¤Ç¤Ï¤Ê¤¤¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤¿¤È¤¨¤Ð¡¢Flex¡¢egrep¡¢Emacs¤Ï¤¤¤º¤ì¤â¥Ñ¥¿¡¼¥ó¸¡º÷¤Î¥Æ¥ó¥×¥ì¡¼¥È
¤È¤·¤ÆÀµµ¬É½¸½¤ò»È¤¤¤Þ¤¹¤¬¡¢¤½¤ì¤¾¤ì¤¬Íý²ò¤¹¤ëÀµµ¬É½¸½¤Ï¾¯¤·¤º¤Ä°Û¤Ê¤ê¤Þ¤¹¡£
ÆÃ¤Ë¡¢Flex¤Ç¤ÏÄêµÁ¤¬»È¤ï¤ì¤Þ¤¹¤¬¡¢egrep¤äEmacs¤Ç¤Ï»È¤¨¤Þ¤»¤ó¤·¡¢
egrep¤äEmacs¤Ïñ¸ì¤ÎÀèÆ¬¤ÈËöÈø¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Î\<¤È
\>¤È¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¤¬¡¢Flex¤ÏÄ󶡤·¤Æ¤¤¤Þ¤»¤ó¡£
¤µ¤é¤Ë¡¢Emacs¤Ï¥Ð¥Ã¥Õ¥¡¤ÎÀèÆ¬¤ËÂФ¹¤ë¥Þ¥Ã¥Á¥ó¥°¤ä¡Ö¥Õ¥¡¥¸¡¼¡×¤Ê¥Þ¥Ã¥Á¥ó¥°
¤Ê¤É¤ò¹Ô¤¦¤¿¤á¤Î¡¢
ÆÃÊ̤Ê\letter¥·¡¼¥±¥ó¥¹¤ò¤Û¤«¤Ë¤â¿ô¿¤¯Ä󶡤·¤Æ¤¤¤Þ¤¹¡£
¤Ê¤ó¤é¤«¤Î¾ò·ï¤Ë´ð¤Å¤¤¤Æ¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°½èÍý¤Î¥ë¡¼¥ë¤ò³èÀ²½¤¹¤ë¤³¤È¤¬ ÊØÍø¤Ê¤È¤¤¬¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¤¤¤¯¤Ä¤«¤Î¥³¥ó¥Ô¥å¡¼¥¿¸À¸ì¤Ç¤Ï¡¢½ÅÊ£¤·¤Æ¤¤¤ë¥¹¥¥ã¥ó¥ë¡¼¥ë¤Î ¤¢¤¤¤Þ¤¤¤µ¤ò¼è¤ê½ü¤¯¤Î¤ò»Ù±ç¤¹¤ë¤¿¤á¤Ë¡¢¥Ñ¡¼¥¹¾õÂÖ¤ò»È¤¤¤Þ¤¹¡£ ¤Þ¤¿¡¢¤¢¤ëÆÃÄê¤ÎÆþÎϤ¬¸«¤Ä¤«¤Ã¤¿¸å¤Ç¤À¤±¡¢¤¢¤ë¥ë¡¼¥ë¤ò³èÀ²½¤·¤¿¤¤¤È¤¤¤¦ ¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¾õ¶·¤ËÂн褹¤ë¤¿¤á¤Ë¡¢Flex¤Ï¥¹¥¿¡¼¥È¾ò·ï¤Þ¤¿¤Ï ¥¹¥¿¡¼¥È¾õÂ֤ȸƤФì¤ëñ½ã¤Ê¥·¥¹¥Æ¥à¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤ϡ¢¤¢¤ë¥ë¡¼¥ë¤¬¥¢¥¯¥Æ¥£¥Ö¤Ë¤Ê¤ë¤Î¤Ï¤¤¤Ä¤Ç¤¢¤ë¤«¤òFlex¤ËÄÌÃΤ¹¤ë
¥Ö¡¼¥ëÃͤΤ褦¤Ê¤â¤Î¤Ç¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤ϡ¢ÄêµÁ¥»¥¯¥·¥ç¥ó¤Ë¤ª¤¤¤Æ¡ÊÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂ֤ξì¹ç¡Ë%x ¡¢
¤Þ¤¿¤Ï¡ÊÊñ´ÞŪ¥¹¥¿¡¼¥È¾õÂ֤ξì¹ç¡Ë%s¤ò»È¤Ã¤ÆÀë¸À¤µ¤ì¤Þ¤¹¡£
%x start_state_name %s start_state_name
start_state_name¤Ï°ì°Õ¤Ê̾Á°¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤Ä¤Þ¤ê¡¢Â¾¤Î¥¹¥¿¡¼¥È¾õÂÖ¤äÄêµÁ¤¬Æ±¤¸Ì¾Á°¤ò»ý¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ ¥¹¥¿¡¼¥È¾õÂ֤ϡ¢1¤Ä¤Î¾õÂÖ¤Î̾Á°¡¢¤Þ¤¿¤Ï¡¢ ¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿Ê£¿ô¤Î¾õÂÖ¤Î̾Á°¤ò»³¤«¤Ã¤³< >¤Ç°Ï¤à¤³¤È¤Ë¤è¤Ã¤Æ¡¢ ¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤Ç»²¾È¤µ¤ì¤Þ¤¹¡£ ¥¹¥¿¡¼¥È¾õÂ֤λ²¾È¤Ï¥ë¡¼¥ë¤ÎÀèÆ¬¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢ 1¤Ä¤Î¥ë¡¼¥ëÃæ¤Ë¤Ï1ÂФ볤«¤Ã¤³< >¤Î¤ßµö¤µ¤ì¤Þ¤¹¡£ ¤³¤Î¤³¤È¤Ï¡¢
%x state1 %s state2 %x state3 state4 %% <state1>"foo" <state2,state3,state4>"bar"
¤¬ÀµÅö¤Ç¤¢¤ê¡¢
integer [-+]?[0-9]* %x integer %s state1,state2,state3 %% <integer>"foo" "bar"<state1> <state1>"bar"<state2,state3>
¤Ï¤¹¤Ù¤ÆÉÔÅö¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
integer¤Ë¤Ä¤¤¤Æ¤ÏƱ¤¸Ì¾Á°¤ò»ý¤ÄÄêµÁ¤¬Â¸ºß¤·¡¢¤½¤ì°Ê³°¤Î¤â¤Î¤Ë¤Ä¤¤¤Æ¤Ï
¥¹¥¿¡¼¥È¾õÂ֤λ²¾È¤Î°ÌÃÖ¤¬Àµ¤·¤¯¤Ê¤¤¤«¡¢Ê£¿ô¤Î»²¾È¤¬Â¸ºß¤¹¤ë¤«¤é¤Ç¤¹¡£
¤³¤ì¤Þ¤Ç¤Î¤È¤³¤í¤Ç¤Ï¡¢Flex¤¬°Û¤Ê¤ë2¼ïÎà¤Î¥¹¥¿¡¼¥È¾õÂÖ¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë»ö¼Â
¤«¤éÌܤò¤½¤é¤·¤Æ¤¤Þ¤·¤¿¡£
2¤Ä¤Î¥¹¥¿¡¼¥È¾õÂ֤Ȥϡ¢Êñ´ÞŪ¥¹¥¿¡¼¥È¾õÂÖ¡Ê%s¡Ë¤È
ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¡Ê%x¡Ë¤Î¤³¤È¤Ç¤¹¡£
¤³¤ì¤é2¤Ä¤ÎÁê°ãÅÀ¤Ï¡¢ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤¬³èÀ²½¤µ¤ì¤¿¾ì¹ç¤Ï¡¢
¤½¤Î¾õÂ֤˰¤¹¤ë¥ë¡¼¥ë¤À¤±¤¬³èÀ²½¤µ¤ì¤ë¤Î¤ËÂФ·¤Æ¡¢
Êñ´ÞŪ¥¹¥¿¡¼¥È¾õÂ֤ξì¹ç¤Ï¡¢¤½¤Î¾õÂ֤˰¤¹¤ë¥ë¡¼¥ë¤È¥¹¥¿¡¼¥È¾õÂ֤ؤλ²¾È
¤ò»ý¤¿¤Ê¤¤¥ë¡¼¥ë¤ÎξÊý¤¬³èÀ²½¤µ¤ì¤ë¤È¤¤¤¦ÅÀ¤Ë¤¢¤ê¤Þ¤¹¡£
¤³¤Î°ã¤¤¤ò¼¨¤¹Îã¤ò¤¢¤²¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
%s state1
%%
<state1>"one" printf("two");
"three" printf("four");
¤³¤Î¾ì¹ç¡¢state1¾õÂÖ¤¬³èÀ²½¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ïone¤òtwo
¤ËÃÖ¤´¹¤¨¡¢state1¾õÂÖ¤¬³èÀ²½¤µ¤ì¤Æ¤¤¤ë¤«Èݤ«¤Ë¤«¤«¤ï¤é¤º
three¤òfour¤ËÃÖ¤´¹¤¨¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë¤è¤ê¡¢¤½¤Î¾¤Î¥Æ¥¥¹¥È¤Ïstdout¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¤³¤ì¤ËÂФ·¤Æ¡¢
%x state1
%%
<state1>"one" printf("two");
"three" printf("four");
¤Ï¡¢state1¾õÂÖ¤¬³èÀ²½¤µ¤ì¤Æ¤¤¤ë¤È¤¤Ïone¤òtwo¤ËÃÖ¤´¹¤¨¡¢
state1¾õÂÖ¤¬³èÀ²½¤µ¤ì¤Æ¤¤¤Ê¤¤¤È¤¤Î¤ßthree¤òfour
¤ËÃÖ¤´¹¤¨¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë¤è¤ê¡¢¤½¤Î¾¤Î¥Æ¥¥¹¥È¤Ïstdout¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¤³¤Î¤³¤È¤Ï¡¢ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤¬»È¤ï¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¥Þ¥Ã¥Á¤·¤Ê¤¤¥Æ¥¥¹¥È¤¬
stdout¤Ë½ÐÎϤµ¤ì¤Æ¤Ï¤Ê¤é¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢¤¹¤Ù¤Æ¤Î²Äǽ¤ÊÆþÎϤ˥ޥåÁ¤¹¤ë
¥ë¡¼¥ë¤ò¡¢¸Ä¡¹¤ÎÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤¬»ý¤¿¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ò°ÕÌ£
¤·¤Æ¤¤¤Þ¤¹¡£
Êñ´ÞŪ¥¹¥¿¡¼¥È¾õÂ֤ξì¹ç¤Ï¡¢¤¢¤é¤æ¤ë¾õÂ֤ˤª¤¤¤ÆÍ¸ú¤Ê¡¢
¥¹¥¿¡¼¥È¾õÂ֤ؤλ²¾È¤ò»ý¤¿¤Ê¤¤¥ë¡¼¥ë¤ò1¤Ä»ý¤ÄɬÍפ¬¤¢¤ê¤Þ¤¹¡£
Ãí°Õ¡§ ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤ÏPOSIX¤Î°ìÉô¤Ç¤¢¤ë¤Ë¤â¤«¤«¤ï¤é¤º¡¢ Lex¤Ç¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó¡£
¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¤òʤ٤¿¤À¤±¤Ç¤Ï¤¢¤Þ¤êÌò¤ËΩ¤Á¤Þ¤»¤ó¡£
¤Ä¤Þ¤ê¡¢¥¹¥¿¡¼¥È¾õÂÖ¤¬¤¤¤Ä³èÀ²½¤µ¤ì¤ë¤Î¤«¤È¤¤¤¦¤³¤È¤âÀ©¸æ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
³èÀ²½¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ÎÃæ¡¢¤Þ¤¿¤Ï¡¢µ½Ò¾ðÊóÆâ¤ÎÄɲäÎC¥³¡¼¥É¤òµ½Ò¤¹¤ëÎΰè
¤ÎÃæ¤Ë¤ª¤¤¤Æ¡¢BEGIN¤ò»È¤¦¤³¤È¤Ç¼Â¸½¤µ¤ì¤Þ¤¹¡£
»È¤¤Êý¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£
BEGIN(start_state_name);
Îã¤ò¤¢¤²¤ë¤È¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
%x COMMENT
%%
"{" BEGIN(COMMENT);
<COMMENT>"$R"
<COMMENT>"$I"
<COMMENT>"$M"
...
<COMMENT>"}" BEGIN(INITIAL);
¤³¤Î¾ì¹ç¡¢Pascal¤Î¥³¥á¥ó¥È¤ÎÀèÆ¬Éôʬ¤ò¸«¤Ä¤±¤ë¤ÈCOMMENT¾õÂ֤˰ܹԤ·¡¢
¥³¥ó¥Ñ¥¤¥é¥ª¥×¥·¥ç¥ó¤òǧ¼±¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
BEGIN¤ÏºÇ½é¤Î%%¤Îľ¸å¡ÊºÇ½é¤Î¥ë¡¼¥ë¤ÎÁ°¡Ë¤Ë¤ª¤¤¤Æ»È¤¦¤³¤È¤â¤Ç¤¡¢
¤³¤Î¾ì¹ç¤Ïyylex()¤Ï¾ï¤Ë»ØÄꤵ¤ì¤¿¾õÂ֤dz«»Ï¤µ¤ì¤Þ¤¹¡£
¾å¤ÎÎã¤Ë¤ª¤¤¤Æ¤Ï¡¢
ÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤INITIAL¤È¤¤¤¦¾õÂÖ¤¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤Î¾õÂ֤Ͼï¤ËÍøÍѲÄǽ¤Ç¡¢
³èÀ²½¤µ¤ì¤¿¾õÂÖ¤¬1¤Ä¤â¸ºß¤·¤Ê¤¤»þ¤Î¥¹¥¥ã¥Ê¤Î½é´ü¾õÂÖ¤òɽ¤·¤Þ¤¹¡£
¤Ä¤Þ¤ê¡¢BEGIN(INITIAL)¤Ë¤è¤Ã¤Æ¡¢¥¹¥¥ã¥Ê¤Î¾õÂÖ¤¬¸ú²ÌŪ¤Ë
¡Ê¤â¤Á¤í¤ó¡¢¤½¤Î»þÅÀ¤Ë¤ª¤¤¤Æ¥¹¥¥ã¥ó¤·¤Æ¤¤¤ë²Õ½ê¤ò°Ý»ý¤·¤¿¤Þ¤Þ¡Ë
¥ê¥»¥Ã¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
°Ê²¼¤Ë¡¢¥¹¥¿¡¼¥È¾õÂ֤λÈÍѤ˴ؤ¹¤ëÃí°Õ¤ò¤¤¤¯¤Ä¤«¼¨¤·¤Þ¤¹¡£
1¤Ä¤Î¥ë¡¼¥ë¤Ë¤ª¤¤¤Æ¤Ï¡¢Ã±°ì¤Î¥¹¥¿¡¼¥È¾õÂÖ¡¢¤Þ¤¿¤Ï¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿ ¥¹¥¿¡¼¥È¾õÂ֤Υꥹ¥È¤Î¤ß¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ¤Þ¤¿¡¢¤³¤¦¤·¤¿¥¹¥¿¡¼¥È¾õÂ֤λØÄê¤Ï¥ë¡¼¥ë¤ÎÀèÆ¬¤Ë¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¼¡¤Ë¼¨¤¹¤â¤Î¤ÏÀµÅö¤Ç¤¹¡£
%x state1 %s state2 %% <state1> "something" <state2> "another thing" <state, state2> "something else"
¤·¤«¤·¡¢ ¼¡¤Ë¼¨¤¹¤â¤Î¤ÏÉÔÅö¤Ç¤¹¡£
%x state1 %s state2 %% wrong<state1> <state1><state2>"wrong" <state2>"wrong"<state1>
ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂ֤ϡ¢Â¾¤Î¤¹¤Ù¤Æ¤Î¾õÂÖ¤ò¡Ö̵¸ú¡×¤Ë¤¹¤ë¤Î¤Ç¶¯ÎϤǤ¹¡£ ¤³¤ì¤Ï¡¢¥¹¥¥ã¥Ê¤ÎÆâÉô¤Ë¤ª¤¤¤Æ¤â¤¦1¤Ä¤Î¥¹¥¥ã¥Ê¤ò¸ú²ÌŪ¤ËÄêµÁ¤Ç¤¤ë¤³¤È¤ò °ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤Ë¤è¤ê¤¿¤È¤¨¤Ð¡¢¥¹¥¿¡¼¥È¾õÂÖ¤·¤À¤¤¤Ç¡¢C¤ÈPascal¤ÎξÊý¤ò¥¹¥¥ã¥ó¤¹¤ë ¥¹¥¥ã¥Ê¤òÄêµÁ¤¹¤ë¤³¤È¤¬ÍýÏÀŪ¤Ë¤Ï²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ °Ê²¼¤Î¤è¤¦¤Ê¥³¡¼¥É¤¬»ý¤Ä¸ú²Ì¤òÁÛÁü¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
%x PASCAL
%x C
%%
<PASCAL>begin return(OPEN_BLOCK);
<PASCAL>end return(CLOSE_BLOCK);
<C>{ return(OPEN_BLOCK);
<C>} return(CLOSE_BLOCK);
Á°½Ò¤Î¤È¤ª¤ê¡¢¥¹¥¿¡¼¥È¾õÂ֤Ϥ½¤ì¼«¿È¤Î̾Á°¶õ´Ö¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó¡£
¤½¤ÎÍýͳ¤Ï¡¢¥¹¥¿¡¼¥È¾õÂÖ¤¬#define¤È¤Û¤È¤ó¤ÉƱ¤¸ÊýË¡¤ÇÀ°¿ôÃͤȤ·¤Æ
ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£
¤³¤Î¤³¤È¤Ï¡¢À°¿ôÃÍ¤ÈÆ±ÍÍ¡¢¥¹¥¿¡¼¥È¾õÂ֤Ρ֥¹¥¿¥Ã¥¯¡×¤Î¤è¤¦¤Ê¤â¤Î¤òºîÀ®²Äǽ
¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢
%{
int last_state[MAX_STATES]
int state_count = 0;
%}
%x FOO BAR baz
%%
FOO {
last_state[state_count] = FOO;
state_count++;
BEGIN(baz);
}
BAR {
last_state[state_count] = BAR;
state_count++;
BEGIN(baz);
}
<baz>rule 1
...
<baz>rule n
<baz>END {
statecount--;
BEGIN(last_state[statecount]);
}
¤ÏFOO¤ÈBAR¤ÎξÊý¤Ë¤è¤Ã¤Æbaz¾õÂÖ¤ò³èÀ²½¤µ¤»¡¢
<baz>END¤È¤¤¤¦¥ë¡¼¥ë¤Ë¤è¤Ã¤Æ1¤ÄÁ°¤Î¾õÂÖ¤ËÌᤷ¤Þ¤¹¡£
¤³¤¦¤·¤¿¡Ö¾õÂÖ¥¹¥¿¥Ã¥¯¡×¤Ï¾Íè¡¢Flex¤ÎÆÃħŪ¤Êµ¡Ç½¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£
4
Flex 2.5¤Ç¤Ï¡¢°Ê²¼¤Î¿·µ¡Ç½¤òÍøÍѤǤ¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂÖ<*>¤Ë¤ÏÆÃ¼ì¤Ê°ÕÌ£¤¬¤¢¤ê¡¢¤¹¤Ù¤Æ¤Î¥¹¥¿¡¼¥È¾õÂ֤˥ޥåÁ¤·¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢
%x state1
%%
<state1>"one" printf("two");
<*>"three" printf("four");
¤Ï¡¢
%s state1
%%
<state1>"one" printf("two");
"three" printf("four");
¤ÈƱ¤¸°ÕÌ£¤Ë¤Ê¤ê¤Þ¤¹¡£
¥Þ¥¯¥íYY_START¤Ë¤è¤ê¡¢¸½ºß¤Î¥¹¥¿¡¼¥È¾õÂÖ¤ò»²¾È¤Ç¤¤Þ¤¹¡£
Á°Àá¡ÊStart State Notes¡Ë¤Î¡Ö¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¡×¤Ë¼¨¤·¤¿Îã¤Ç¤Ï¡¢
¸½ºß¤Î¥¹¥¿¡¼¥È¾õÂÖ¤òÇÛÎólast_state¤Ë³ÊǼ¤¹¤ë½èÍý¤ò°Ê²¼¤Î¤è¤¦¤Ë
µ½Ò¤·¤Æ¤¤¤Þ¤¹¤¬¡¢
FOO {
last_state[state_count] = FOO;
...
}
¤³¤ÎÂåÆþ¤Ï¡¢
last_state[state_count] = YY_START;
¤Î¤è¤¦¤Ë½ñ¤´¹¤¨¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Lex¤È¤Î¸ß´¹À¤Î¤¿¤á¤Ë¡¢YYSTATE¤¬¡¢
YY_START¤ÎÊÌ̾¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤Υ¹¥³¡¼¥×¤òÄêµÁ¤Ç¤¤Þ¤¹¡£ ¤³¤ì¤Ë¤è¤ê¡¢Æ±¤¸¥¹¥¿¡¼¥È¾õÂ֤ˤª¤¤¤ÆÊ£¿ô¤Î¥ë¡¼¥ë¤¬Â¸ºß¤¹¤ë¤È¤¤Ë¡¢ ¤½¤Î¸Ä¡¹¤Î¥ë¡¼¥ë¤Ë¥¹¥¿¡¼¥È¾õÂÖ¤ò»ØÄꤹ¤ëɬÍפ¬¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤Υ¹¥³¡¼¥×¤Î·Á¼°¤Ï¡¢°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£
<start_states>{
...
}
¤³¤³¤Ç¡¢start_states¤Ï¡¢Ã±°ì¤Î¥¹¥¿¡¼¥È¾õÂÖ¡¢¤Þ¤¿¤Ï¡¢
¥«¥ó¥Þ¤Ç¶èÀÚ¤é¤ì¤¿¥¹¥¿¡¼¥È¾õÂ֤Υꥹ¥È¤Ç¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤Υ¹¥³¡¼¥×¤Î¶³¦¤Ï¡¢{¤È}¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂ֤Υ¹¥³¡¼¥×¤òÆþ¤ì»Ò¤Ë¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£
Activating States¤Ë¼¨¤·¤¿Îã¤ò¡¢¥¹¥¿¡¼¥È¾õÂ֤Υ¹¥³¡¼¥×¤ò»È¤Ã¤Æ½ñ¤Ä¾¤¹¤È
°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
%x COMMENT
%%
"{" BEGIN(COMMENT);
<COMMENT>{
"$R"
"$I"
"$M"
...
"}" BEGIN(INITIAL);
}
¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤Ç%option stack¤ò»ØÄꤹ¤ë¤È¡¢
¥¹¥¿¡¼¥È¾õÂÖ¥¹¥¿¥Ã¥¯¤òÍøÍѤǤ¤Þ¤¹¡£
¥¹¥¿¡¼¥È¾õÂÖ¥¹¥¿¥Ã¥¯¤òÁàºî¤¹¤ë¤¿¤á¤Ë¡¢°Ê²¼¤Î´Ø¿ô¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£
void yy_push_state(int new_state)
void yy_pop_state()
int yy_top_state()
Á°Àá¡ÊStart State Notes¡Ë¤Î¡Ö¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¡×¤Ë¼¨¤·¤¿Îã¤ò¡¢ ¥¹¥¿¡¼¥È¾õÂÖ¥¹¥¿¥Ã¥¯¤ò»È¤Ã¤Æ½ñ¤Ä¾¤¹¤È°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
%option stack
%x FOO BAR baz
%%
FOO {
yy_push_state(baz);
}
BAR {
yy_push_state(baz);
}
<baz>rule 1
...
<baz>rule n
<baz>END {
yy_pop_state();
}
¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ª¤¤¤Æ¡¢²¿¤«¤ò¤¹¤ëÊýË¡¤ò³Ø¤Ö¤Î¤ËºÇÎɤÎÊýË¡¤Ï¡¢ ¼ÂºÝ¤Ë¤½¤ì¤ò¤ä¤Ã¤Æ¤ß¤ë¤³¤È¤Ç¤¹¡£ ¤½¤Î¤³¤È¤Ëα°Õ¤·¡¢¥¹¥¿¡¼¥È¾õÂÖ¤ò¤É¤Î¤è¤¦¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤ë¤«¤ò¼¨¤¹Îã¤ò °Ê²¼¤Ë¤¢¤²¤Þ¤¹¡£
/*
* dates.lex: ÆüÉդΰۤʤë·Á¼°¤ò¼±Ê̤¹¤ë¤¿¤á¤Ë
* ¥¹¥¿¡¼¥È¾õÂÖ¤ò»ÈÍѤ¹¤ëÎã
*/
%{
#include <ctype.h>
char month[20],dow[20],day[20],year[20];
%}
skip of|the|[ \t,]* /* ¤³¤Îʸ»ú¤ÎʤӤò̵»ë¤¹¤ë */
mon (mon(day)?) /* ÍËÆü¤Î̾Á°¤ÎŤ¤·Á¼°¤Èû¤¤·Á¼°¤Î */
tue (tue(sday)?) /* ¤É¤Á¤é¤Ë¤â¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤ËÀßÄꤹ¤ë */
wed (wed(nesday)?)
thu (thu(rsday)?)
fri (fri(day)?)
sat (sat(urday)?)
sun (sun(day)?)
/* °Ê²¼¤Ï¤¹¤Ù¤Æ¤Î²Äǽ¤ÊÍËÆü¤òɽ¤¹ */
day_of_the_week ({mon}|{tue}|{wed}|{thu}|{fri}|{sat}|{sun})
jan (jan(uary)?) /* ¤¹¤Ù¤Æ¤Î·î¤Ë¤Ä¤¤¤ÆÆ±ÍͤΤ³¤È¤ò¹Ô¤¦ */
feb (feb(ruary)?)
mar (mar(ch)?)
apr (apr(il)?)
may (may)
jun (jun(e)?)
jul (jul(y)?)
aug (aug(ust)?)
sep (sep(tember)?)
oct (oct(ober)?)
nov (nov(ember)?)
dec (dec(ember)?)
/* °Ê²¼¤Ï¤¹¤Ù¤Æ¤Î²Äǽ¤Ê·î¤Î̾Á°¤òɽ¤¹ */
first_half ({jan}|{feb}|{mar}|{apr}|{may}|{jun})
second_half ({jul}|{aug}|{sep}|{oct}|{nov}|{dec})
month {first_half}|{second_half}
/*
* Æü¡¢·î¡¢Ç¯¤Î¿ôÃÍ·Á¼°
* ¤³¤ì¤é¤Ï½ÅÊ£¤·¤Æ¤¤¤ë¤¿¤á¡¢Àµ¤·¤¯¥Ñ¡¼¥¹¤¹¤ë¤Ë¤Ï¡¢
* ¥¹¥¿¡¼¥È¾õÂÖ¤ÈÆüÉդηÁ¼°¤Ë´Ø¤¹¤ë¤¢¤ëÄøÅÙ¤ÎÃμ±
* ¤¬É¬ÍפǤ¢¤ë¤³¤È¤ËÃí°Õ
*/
nday [1-9]|[1-2][0-9]|3[0-1]
nmonth [1-9]|1[0-2]
nyear [0-9]{1,4}
/* ǯ¤ÈÆü¤Î¤¿¤á¤Î³ÈÄ¥»Ò */
year_ext (ad|AD|bc|BC)?
day_ext (st|nd|rd|th)?
/*
* ¤³¤Î¥×¥í¥°¥é¥à¤ÎºÇ¸å¤Ë¤¢¤ë¥ë¡¼¥ë¤ò»È¤Ã¤Æ¤¹¤Ù¤Æ¤Î̵´Ø·¸¤Ê
* ¥Æ¥¥¹¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¡¢ÈóÇÓ¾Ū¤Ê¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¦¡£
* ¤³¤¦¤·¤Ê¤¤¤È¡¢¸Ä¡¹¤Î¥¹¥¿¡¼¥È¾õÂ֤Υ֥í¥Ã¥¯¤Ë¥ë¡¼¥ë¤òÄɲÃ
* ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¯¤Ê¤ë¡£µ¬ÌϤÎÂ礤¤¥¹¥¥ã¥Ê¤Ë¤ª¤¤¤Æ¤Ï¡¢
* ¤³¤ì¤Ï¼Â¹Ô²Äǽ¤ÊÁªÂò»è¤Ç¤¢¤ë¤³¤È¤¬Â¿¤¤¡£¤Ê¤¼¤Ê¤é¡¢¥ë¡¼¥ë
* ¤ÎÄɲäϥ¹¥¥ã¥Ê¤Î¥¹¥Ô¡¼¥É¤Ë±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¤«¤é¤Ç¤¢¤ë¡£
* ¤³¤³¤Ç¤Ï¡¢´Ê·é¤µ¤òÍ¥À褵¤»¤ë¤³¤È¤Ë¤¹¤ë
*/
%s LONG SHORT
%s DAY MONTH /* Ť¤·Á¼°¤ÎÆüÉդΤ¿¤á¤ËÄɲä·¤¿¾õÂÖ */
%s YEAR_FIRST YEAR_LAST YFMONTH YLMONTH
%%
/*
* ÍËÆü¤Ï¾ï¤ËºÇ½é¤ËÃÖ¤«¤ì¡¢¸å¤í¤Ë³¤¯ÆüÉդν¤¾þ»Ò¤È¤·¤Æ
* µ¡Ç½¤¹¤ë¤â¤Î¤È²¾Äꤵ¤ì¤ë¡£¤è¤Ã¤Æ¡¢ÍËÆü¤ÏÊ£¿ô¤ÎÆüÉÕ·Á¼°
* ¤Î´Ö¤Ç¶¦ÍѲÄǽ¤Ç¤¢¤ë
*/
<LONG>{day_of_the_week} strcpy(dow,yytext);
/*
* ·î-Æü-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
* ¥Ñ¡¼¥¹¾õÂÖ¤Ï
* LONG->[·î¤Ë¥Þ¥Ã¥Á]->DAY->LONG
* ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
*/
<LONG>{month} strcpy(month,yytext); BEGIN(DAY);
<DAY>{nday}{day_ext} strcpy(day,yytext); BEGIN(LONG);
/*
* Æü-·î-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
* ¥Ñ¡¼¥¹¾õÂÖ¤Ï
* LONG->[Æü¤Ë¥Þ¥Ã¥Á]->MONTH->LONG
* ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
*/
<LONG>{nday}{day_ext} strcpy(day,yytext); BEGIN(MONTH);
<MONTH>{month} strcpy(month,yytext); BEGIN(LONG);
/*
* ÆüÉÕ¤Îǯ¤ÎÉôʬ¤ÏºÇ¸å¤ËÃÖ¤«¤ì¤ë¤â¤Î¤È¹Í¤¨¤é¤ì¤ë¡£¤·¤¿¤¬¤Ã¤Æ¡¢
* ǯ¤ò¸«¤Ä¤±¤¿¤é¥Ñ¡¼¥¹¤µ¤ì¤¿ÆüÉÕ¤òɽ¼¨¤Ç¤¤ë¡£¤â¤Á
* ¤í¤ó¡¢ÆüÉդȤ·¤ÆÉÔÅö¤Ê¤â¤Î¤Ç¤¢¤ì¤Ð¥´¥ß¤¬½ÐÎϤµ¤ì¤ë¤³¤È¤Ë¤Ê¤ë
*/
<LONG>{nyear}{year_ext} {
printf("Long:\n");
printf(" DOW : %s \n",dow);
printf(" Day : %s \n",day);
printf(" Month : %s \n",month);
printf(" Year : %s \n",yytext);
strcpy(dow,"");
strcpy(day,"");
strcpy(month,"");
}
/*
* Æü-·î-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
* SHORT¾õÂ֤ǿôÃÍ·Á¼°¤ÎÆü¤ò¸«¤Ä¤±¤¿¾ì¹ç¤Ï¡¢Ç¯¤¬ÆüÉդκǸå¤ÎÉôʬ
* ¤Ë¤Ê¤ë¤È²¾Äꤹ¤ë
* ¥Ñ¡¼¥¹¾õÂÖ¤Ï
* SHORT->[Æü¤Ë¥Þ¥Ã¥Á]->YEAR_LAST->YLMONTH->SHORT
* ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
*/
<SHORT>{nday} strcpy(day,yytext); BEGIN(YEAR_LAST);
<YEAR_LAST>{nmonth} strcpy(month,yytext);BEGIN(YLMONTH);
<YLMONTH>{nyear} strcpy(year,yytext); BEGIN(SHORT);
/*
* ǯ-·î-Æü¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
* SHORT¾õÂ֤ǿôÃÍ·Á¼°¤Îǯ¤ò¸«¤Ä¤±¤¿¾ì¹ç¤Ï¡¢Æü¤¬ÆüÉդκǸå¤ÎÉôʬ
* ¤Ë¤Ê¤ë¤È²¾Äꤹ¤ë
* ¥Ñ¡¼¥¹¾õÂÖ¤Ï
* SHORT->[ǯ¤Ë¥Þ¥Ã¥Á]->YEAR_FIRST->YFMONTH->SHORT
* ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
*/
<SHORT>{nyear} strcpy(year,yytext); BEGIN(YEAR_FIRST);
<YEAR_FIRST>{nmonth} strcpy(month,yytext);BEGIN(YFMONTH);
<YFMONTH>{nday} strcpy(day,yytext); BEGIN(SHORT);
/*
* ¿ôÃÍ·Á¼°¤ÎÆüÉդǤϡ¢Ç¯¤ÏºÇ½é¤Ë¤Ê¤ë¤³¤È¤âºÇ¸å¤Ë¤Ê¤ë¤³¤È¤â²Äǽ¡£
* ¤·¤¿¤¬¤Ã¤Æ¡¢¥Ñ¡¼¥¹¤·¤¿¤â¤Î¤ò¤¤¤Äɽ¼¨¤¹¤Ù¤¤«¤ò¼¨¤¹¤Î¤Ë²þ¹Ô¤ò»È¤¦
*/
<SHORT>\n {
printf("Short:\n");
printf(" Day : %s \n",day);
printf(" Month : %s \n",month);
printf(" Year : %s \n",year);
strcpy(year,"");
strcpy(day,"");
strcpy(month,"");
}
/*
* °Ê²¼¤Ë¤è¤ê¡¢Ã»¤¤¡Ê¿ô»ú¡Ë·Á¼°¤ÈŤ¤¡Ê±Ñ¿ô»ú¡Ë·Á¼°¤È¤òÀڤ괹¤¨¤ë
*/
long\n BEGIN(LONG);
short\n BEGIN(SHORT);
/*
* °Ê²¼¤Î¥ë¡¼¥ë¤Ï¡¢Ìµ´Ø·¸¤Ê¥Æ¥¥¹¥È¤ò¸«¤Ä¤±¤ÆÇË´þ¤¹¤ë
* ¡Ê¥Þ¥Ã¥Á¤µ¤ì¤¿¥Æ¥¥¹¥È¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏECHO¤µ¤ì¤Ê¤¤¤¬¡¢
* ¥Þ¥Ã¥Á¤µ¤ì¤Ê¤«¤Ã¤¿¥Æ¥¥¹¥È¤ÏECHO¤µ¤ì¤ë¡£¥Ô¥ê¥ª¥É¤Ï
* ²þ¹Ô°Ê³°¤Î¤¹¤Ù¤Æ¤Îʸ»ú¤ò¸«¤Ä¤±¤ë¡£²þ¹Ô¤Ï\n¤Ë¤è¤Ã¤Æ
* ¸«¤Ä¤±¤é¤ì¤ë¡Ë
*/
{skip}*
\n
.
¤³¤ÎÎã¤Ï¡¢¤µ¤Þ¤¶¤Þ¤Ê·Á¼°¤ÎÆüÉÕ¤ò¥¹¥¥ã¥ó¤·¡¢¹½À®Ã±°Ì¤Ëʬ³ä¤·¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢°Ê²¼¤Î¤â¤Î¤òÀµ¤·¤¯¥¹¥¥ã¥ó¤·¡¢ÆüÉդθġ¹¤ÎÉôʬ¤ò¼±Ê̤·¤Þ¤¹¡£
short 1989:12:23 1989:11:12 23:12:1989 11:12:1989 1989/12/23 1989/11/12 23/12/1989 11/12/1989 1989-12-23 1989-11-12 23-12-1989 11-12-1989 long Friday the 5th of January, 1989 Friday, 5th of January, 1989 Friday, January 5th, 1989 Fri, January 5th, 1989 Fri, Jan 5th, 1989 Fri, Jan 5, 1989 FriJan 5, 1989 FriJan5, 1989 FriJan51989 Jan51989
¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤ÎÉôʬ¤Ç¤Ï¡¢·î¤ª¤è¤ÓÆüÉդΰۤʤëÉôʬ¤Ë»È¤ï¤ì¤ë¿ô»ú·Á¼°¤òñ¤Ë
ÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ÎÎã¤Ç¤Ï¡¢¤¢¤ëÆÃÄê¤ÎÊýË¡¤Ç¥¹¥¥ã¥ó½èÍý¤¬¿Ê¹Ô¤¹¤ë¤è¤¦¶¯À©¤¹¤ë¤¿¤á¤Ë¡¢
¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢¹Ô¤ÎÀèÆ¬¤Ç1989¤ò¸«¤Ä¤±¤ì¤Ð¡¢¤½¤ì¤¬Æü¤È·î¤ÎÁȤ߹ç¤ï¤»
¤Ç¤Ï¤Ê¤¯Ç¯¤Ç¤¢¤ê¡¢¤·¤¿¤¬¤Ã¤Æ¡¢ÆüÉդμ¡¤ÎÉôʬ¤¬·î¤Ë°ã¤¤¤Ê¤¤¤³¤È¤¬¤ï¤«¤ê¡¢
¥¹¥¥ã¥ó½èÍý¤¬¤½¤Î¤È¤ª¤ê¤Ë¿Ê¤à¤è¤¦¶¯À©¤·¤Þ¤¹¡£
¤³¤Î¤³¤È¤Ë¤è¤ê¡¢Èó¾ï¤Ëñ½ã¤Ê¾õÂÖ¶îÆ°¤Î¥Ñ¡¼¥µ¤ò¸ú²ÌŪ¤ËºîÀ®¤·¤¿¤³¤È¤Ë¤Ê¤ê¡¢
ÆüÉÕ¤ò¤½¤Î¹½À®Í×ÁǤˤ¦¤Þ¤¯Ê¬³ä¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡Ê¤³¤Î¥¹¥¥ã¥Ê¤ÎÆâÉô
¤Çµ¯¤³¤Ã¤Æ¤¤¤ë¤³¤È¤ò¥Õ¥í¡¼¥Á¥ã¡¼¥È¤ËÉÁ¤¤¤Æ¤ß¤ì¤Ð¡¢
¤³¤Î¤³¤È¤¬ÌÀÎÆ¤Ë¸«¤Æ¤È¤ì¤ë¤Ç¤·¤ç¤¦¡Ë¡£
ËܽñÃæ¤Î¾¤Î¥×¥í¥°¥é¥àÎã¤ÈƱÍͤˡ¢¤³¤ÎÎã¤â
flex -i dates.lex cc -o dates lex.yy.c -lfl
¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Þ¤¹¡£
¤Þ¤¿¡¢examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤ÆÃ±¤Ëmake dates¤ò
¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£
Flex 2.5¤Ç¤Ï¡¢¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤µ¤Þ¤¶¤Þ¤Ê¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤¤Þ¤¹¡£
¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤Ë¤Ï¡¢¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬
¡ÊºÇ½é¤Î%%¤è¤ê¤âÁ°¤ÎÉôʬ¡Ë¤Ë¡¢%option»Ø¼¨»Ò¤òµ½Ò¤·¤Þ¤¹¡£
¤Û¤È¤ó¤É¤Î%option»Ø¼¨»Ò¤Ï¡¢°Ê²¼¤Î·Á¼°¤Ç»ØÄꤵ¤ì¤Þ¤¹¡£
%option option_name
¥ª¥×¥·¥ç¥óoption_name¤Î»ØÄê¤ò̵¸ú¤Ë¤¹¤ë¤¿¤á¤Ë¤Ï¡¢
¥ª¥×¥·¥ç¥ó̾¤ÎÁ°¤Ëno¤òÉÕ¤±¤Þ¤¹¡£
%option nooption_name
°Ê²¼¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ÈƱÅù¤Î¸ú²Ì¤ò»ý¤Ä%option»Ø¼¨»Ò
¤ò¼¨¤·¤Þ¤¹¡£
³Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Î°ÕÌ£¤Ë¤Ä¤¤¤Æ¤Ï¡¢Command Line Switches¤È
Command Line Switches (Flex 2.5)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
%option 7bit
%option 8bit
%option align
%option backup
%option batch
%option c++
%option caseful
%option case-sensitive
%option case-insensitive
%option caseless
%option debug
%option default
%option ecs
%option fast
%option full
%option interactive
%option lex-compat
%option meta-ecs
%option output="file"
%option perf-report
%option prefix="prefix"
%option read
%option stdout
%option verbose
%option warn
¼¡¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ç¤ÏÂåÂØ¤Ç¤¤Ê¤¤%option»Ø¼¨»Ò¤ò¼¨¤·¤Þ¤¹¡£
%option array
yytext¤òchar¤ÎÇÛÎó¤È¤·¤ÆÄêµÁ¤·¤Þ¤¹¡£
¤³¤ì¤Ï¡¢
%array¤ÈƱ¤¸¤Ç¤¹¡£
%option always-interactive
%option never-interactive¤Î¤É¤Á¤é¤â»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¡¢
À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ï¡¢¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¤¿¤Ó¤Ëisatty()¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢
ÆþÎϤòÂÐÏÃŪ¤Ë¡Ê1ʸ»ú¤º¤Ä¡ËÆÉ¤ß¹þ¤à¤Ù¤¤«Èݤ«¤ò·èÄꤷ¤Þ¤¹¡£
%option main
main()´Ø¿ô¤òÁȤ߹þ¤à¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
int main()
{
yylex();
return 0;
}
¤³¤ì¤Ï¡¢°ÅÌۤΤ¦¤Á¤Ë%option noyywrap¤ò»ØÄꤷ¤Þ¤¹¡£
%option never-interactive
%option always-interactive¤Î¤É¤Á¤é¤â»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¡¢
À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ï¡¢¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¤¿¤Ó¤Ëisatty()¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢
ÆþÎϤòÂÐÏÃŪ¤Ë¡Ê1ʸ»ú¤º¤Ä¡ËÆÉ¤ß¹þ¤à¤Ù¤¤«Èݤ«¤ò·èÄꤷ¤Þ¤¹¡£
%option pointer
yytext¤òchar¤ËÂФ¹¤ë¥Ý¥¤¥ó¥¿¤È¤·¤ÆÄêµÁ¤·¤Þ¤¹¡£
¤³¤ì¤Ï¡¢%pointer¤ÈƱ¤¸¤Ç¤¹¡£
%option reject
REJECT¤¬»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤ò¡¢Flex¤ËÄÌÃΤ·¤Þ¤¹¡£
Flex¤ÏÄ̾ÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÇREJECT¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«Èݤ«¤ò¼«Ê¬¤Ç
Ä´ºº¤·¤Þ¤¹¤¬¡¢¤³¤Î%option»Ø¼¨»Ò¤Î»ØÄê¤Ï¡¢Flex¼«¿È¤Ë¤è¤ëȽÄê·ë²Ì¤Ë
Í¥À褷¤Þ¤¹¡£
%option stack
%option»Ø¼¨»Ò¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
%option stdinit
yyin¤òstdin¤Ç¡¢yyout¤òstdout¤Ç¡¢
¤½¤ì¤¾¤ì½é´ü²½¤·¤Þ¤¹¡£
¤³¤Î%option»Ø¼¨»Ò¤¬»ØÄꤵ¤ì¤Ê¤¤¾ì¹ç¡¢
¤¢¤ë¤¤¤Ï¡¢%option nostdinit¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢
yyin¤Èyyout¤Ï¡¢(FILE *)0¡ÊNULL¥Ý¥¤¥ó¥¿¡Ë¤Ç½é´ü²½¤µ¤ì¤Þ¤¹¡£
%option unput
%option nounput¤¬»ØÄꤵ¤ì¤ë¤È¡¢À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢
´Ø¿ôunput()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
5
%option yy_pop_state
%option noyy_pop_state¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_pop_state()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
¤¿¤À¤·¡¢%option stack¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
%option noyy_pop_state¤Î»ØÄê¤ÎÍ̵¤Ë¤«¤«¤ï¤é¤º¡¢
´Ø¿ôyy_pop_state()¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yy_push_state
%option noyy_push_state¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_push_state()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
¤¿¤À¤·¡¢%option stack¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
%option noyy_push_state¤Î»ØÄê¤ÎÍ̵¤Ë¤«¤«¤ï¤é¤º¡¢
´Ø¿ôyy_push_state()¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yy_scan_buffer
%option noyy_scan_buffer¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_scan_buffer()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yy_scan_bytes
%option noyy_scan_bytes¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_scan_bytes()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yy_scan_string
%option noyy_scan_string¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_scan_string()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yy_top_state
%option noyy_top_state¤¬»ØÄꤵ¤ì¤ë¤È¡¢
À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÃæ¤Ë¡¢´Ø¿ôyy_top_state()¤¬ÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
¤¿¤À¤·¡¢%option stack¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
%option noyy_top_state¤Î»ØÄê¤ÎÍ̵¤Ë¤«¤«¤ï¤é¤º¡¢
´Ø¿ôyy_top_state()¤ÏÁȤ߹þ¤Þ¤ì¤Þ¤»¤ó¡£
%option yyclass="classname"
-+¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¡Ê¤¹¤Ê¤ï¤Á¡¢C++¥¹¥¥ã¥Ê¤ò
À¸À®¤¹¤ë¾ì¹ç¡Ë¤Ë¤Î¤ß͸ú¤Ç¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢classname¤Ë¤è¤Ã¤Æ»ØÄꤵ¤ì¤ë̾Á°¤Î¥¯¥é¥¹¤¬¡¢
yyFlexLexer¤Î¥µ¥Ö¥¯¥é¥¹¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£
¼ÂºÝ¤Ë¥¹¥¥ã¥ó½èÍý¤ò¼Â¹Ô¤¹¤ë¥³¡¼¥É¤Ï¡¢¥¯¥é¥¹classname¤Î
¥á¥ó¥Ð´Ø¿ôyylex()¡Êclassname::yylex()¡Ë¤Ë¼ÂÁõ¤µ¤ì¤Þ¤¹¡£
¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and C++ (Flex 2.5)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
%option yylineno
yylineno¤ËÊÝ»ý¤¹¤ë¥¹¥¥ã¥Ê¤ò
À¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
%option yymore
yymore()¤¬»È¤ï¤ì¤Æ¤¤¤ë¤³¤È¤òFlex¤ËÄÌÃΤ·¤Þ¤¹¡£
Flex¤ÏÄ̾ÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Çyymore()¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«Èݤ«¤ò¼«Ê¬¤ÇÄ´ºº
¤·¤Þ¤¹¤¬¡¢¤³¤Î%option»Ø¼¨»Ò¤Î»ØÄê¤Ï¡¢Flex¼«¿È¤Ë¤è¤ëȽÄê·ë²Ì¤ËÍ¥À褷¤Þ¤¹¡£
%option yywrap
%option noyywrap¤¬»ØÄꤵ¤ì¤ë¤È¡¢yywrap()¤Ï¥Þ¥¯¥í¤È¤·¤Æ¡¢
#define yywrap() 1
¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ¤³¤Î·ë²Ì¡¢¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ò¸¡½Ð¤·¤¿¤È¤¤Ë¡¢¥¹¥¥ã¥Ê¤Ï¡¢ ¤Û¤«¤Ë¥¹¥¥ã¥ó¤¹¤Ù¤¥Õ¥¡¥¤¥ë¤Ï¸ºß¤·¤Ê¤¤¤ÈȽÃǤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤Î¾Ï¤Ç¤ÏC¤ª¤è¤ÓBison¤È°ì½ï¤ËFlex¤ò»È¤¦ÊýË¡¤òÀâÌÀ¤·¤Þ¤¹¡£ 6 C¡¢Bison¤Î¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤ÆÈó¾ï¤ËºÙ¤«¤¤ÀâÌÀ¤¬É¬Íפʤ¿¤á¡¢ ËܾϤÏ2¤Ä¤ÎÉôʬ¤Ëʬ¤«¤ì¤Æ¤¤¤Þ¤¹¡£ ¤½¤ÎξÊý¤Ë¡¢Á´ÈÌŪ¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹³µÇ°¤Ë´Ø¤¹¤ëÀá¤È¥×¥í¥°¥é¥àÎã¤ò ¼¨¤¹À᤬¤¢¤ê¤Þ¤¹¡£
Flex¤ËÂФ¹¤ëC¤Î¼çÍפʥ¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ï¡¢ °Ê²¼¤Ë¤¢¤²¤ë¥ë¡¼¥Á¥ó¤ÈÊÑ¿ô¤Ë¤è¤ë¤â¤Î¤Ç¤¹¡£ °Ê²¼¤ÎÀá¤òÆÉ¤àºÝ¤Ë¤Ï¡¢¤¤¤¯¤Ä¤«¤ÎºÙ¤«¤ÊÉôʬ¤ÇFlex¤ÈLex¤È¤Î´Ö¤ËÁê°ãÅÀ¤¬¤¢¤ë ¤È¤¤¤¦¤³¤È¤ò°Õ¼±¤·¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£ Lex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤´Ø¿ô¤¬¤¤¤¯¤Ä¤«¤¢¤ê¤Þ¤¹¤·¡¢Àë¸À¤ÎÆâÍÆ¤¬°ã¤¦¤â¤Î¤â¤¢¤ê¤Þ¤¹¡£ ¤³¤¦¤·¤¿Áê°ãÅÀ¤Ï¡¢Ä̾ïÂ礤ÊÌäÂê¤Ë¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ ¤È¤¤¤¦¤Î¤Ï¡¢Áê°ã¤Î¤¢¤ë´Ø¿ô¤Ï°ìÈÌŪ¤Ë¤Ï¤¢¤Þ¤ê»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ Áê°ãÅÀ¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and Lex¤ª¤è¤ÓFlex and POSIX ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
´Ø¿ô
yylex()
yylex()¤Ï¼ÂºÝ¤Î¥¹¥¥ã¥ó½èÍý¤ò¹Ô¤¦´Ø¿ô¤Ç¤¹¡£
¥Õ¥¡¥¤¥ë¡Ê¥Ç¥Õ¥©¥ë¥È¤Ïstdin¡Ë¤òÆÉ¤ß¹þ¤ß¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¤¡¢
¥Ñ¥¿¡¼¥ó¤Ë´ØÏ¢ÉÕ¤±¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ÆþÎϤνªÃ¼¤Ë㤹¤ë¤Þ¤Ç¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¤¡¢½ªÃ¼¤Ë㤷¤¿¤È¤³¤í¤Ç
¥¼¥í¤òÊÖ¤·¤Þ¤¹¡Êreturn¤ò»È¤Ã¤Æ¡¢¸Æ¤Ó½Ð¤·Â¦¤Î¥×¥í¥°¥é¥à¤Ë¤Û¤«¤ÎÃͤòÊÖ¤¹
¤³¤È¤Ï²Äǽ¤Ç¤¹¡£
¤³¤ì¤Ï¡¢Flex and Bison¤ÇÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡Ë¡£
¤·¤¿¤¬¤Ã¤Æ¡¢¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤òÄ󶡤¹¤ë´Êñ¤ÊÊýË¡¤Î1¤Ä¤Ï¡¢
¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥ÉÎΰè¤Î1¤Ä¤Ë°Ê²¼¤Î¤è¤¦¤Ê¥³¡¼¥É¤òÄɲ乤뤳¤È¤Ç¤¹¡£
#include <stdio.h>
int main(argc,argv)
int argc;
char *argv;
{
yylex();
}
¤·¤«¤·¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢Flex¥é¥¤¥Ö¥é¥ê¡Ê-lfl¡Ë¤â¤·¤¯¤ÏLex¥é¥¤¥Ö¥é¥ê
¡Ê-ll¡Ë¤Î¤¤¤º¤ì¤«¤ò¥ê¥ó¥¯¤·¤Æ¡¢
¤½¤³¤«¤é¤³¤ì¤ÈƱ¤¸¤è¤¦¤Êmain()´Ø¿ô¤ò¼è¤ê¹þ¤à¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤Î¾ì¹ç¤Ï¡¢¥¹¥¥ã¥Ê¤Ïñ¤Ë¥Õ¥¡¥¤¥ë¤ò¥¹¥¥ã¥ó¤·¤Æ¡¢
¥ë¡¼¥ë¤Ë´ØÏ¢ÉÕ¤±¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤À¤±¤Ç¤¢¤ë¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
yylex()¤Î»È¤¤Êý¤È¤·¤Æ¤â¤¦1¤Ä¤è¤¯¸«¤é¤ì¤ë¤Î¤¬¡¢
¥Þ¥Ã¥Á¤µ¤ì¤¿¤â¤Î¤¬¤Ê¤ó¤Ç¤¢¤ë¤«¤ò¼¨¤¹ÃͤòÊÖ¤µ¤»¤ë¤³¤È¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
¥¢¥¯¥·¥ç¥ó¤Ëreturnʸ¤òÄɲ乤뤳¤È¤Ç¹Ô¤ï¤ì¤Þ¤¹¡£
returnʸ¤ò¸«¤Ä¤±¤ë¤È¡¢
yylex()¤Ï»ØÄꤵ¤ì¤¿ÃͤòÊÖ¤·¤Þ¤¹¡£
¤³¤ì¤¬¡¢
Bison¤Ë¤è¤ë¥Ñ¡¼¥µ¤¬Flex¤Ë¤è¤ë¥¹¥¥ã¥Ê¤«¤é¾ðÊó¤ò³ÍÆÀ¤¹¤ëÊýË¡¤Ç¤¹¡£
¥ë¡¼¥ë¤ÎÃæ¤Ë¡¢¥Þ¥Ã¥Á¤µ¤ì¤¿¥Æ¥¥¹¥È¤¬²¿¤òɽ¤·¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥³¡¼¥É¤òÊÖ¤¹
returnʸ¤¬¤¢¤ì¤Ð¡¢°Ê²¼¤Î¤è¤¦¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
#include <stdio.h>
int main(argc,argv)
int argc;
char *argv;
{
int return_code;
while((return_code = yylex()) != 0){
switch(return_code){
case KEYWORD1:
/* ²¿¤«¤ò¹Ô¤¦ */
break;
case KEYWORD2:
/* ²¿¤«Ê̤Τ³¤È¤ò¹Ô¤¦ */
break;
...
case KEYWORDn:
}
}
}
yylex¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÄêµÁ¤Ïint yylex(void)¤Ç¤¹¤¬¡¢
¤³¤ì¤ÏYY_DECL¥Þ¥¯¥í¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤ÆÊѹ¹¤Ç¤¤Þ¤¹¡£
Îã¤ò¼¨¤¹¤È¡¢°Ê²¼¤Î¥³¡¼¥É¤Ïyylex()¤Î̾Á°¤ògettok()¤Ë¡¢
·¿¤òchar¤ËÂФ¹¤ë¥Ý¥¤¥ó¥¿·¿¤ËÊѹ¹¤·¡¢
¥Ñ¥é¥á¡¼¥¿buffer¤ò¼õ¤±¼è¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£
#undef YY_DECL #define YY_DECL char *gettok(char *buffer)
Ãí°Õ¡§ANSIÂбþ¤Ç¤Ê¤¤C¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
#define YY_DECL char *gettok(buffer) \
char *buffer;
¸À¤¤´¹¤¨¤ë¤È¡¢ºÆÀë¸À¤Ï¥¿¡¼¥²¥Ã¥È¤È¤Ê¤ëC¥³¥ó¥Ñ¥¤¥é¤Ë¤È¤Ã¤ÆÀµÅö¤Ê´Ø¿ôÀë¸À
¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¤µ¤é¤Ë¡¢¤³¤ÎºÆÀë¸À¤Ï¡¢¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥ÉÎΰè
¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
yyin
yyin¤Ï¡¢
yylex()¤¬Ê¸»ú¤òÆÉ¤ß¹þ¤à¸µ¤È¤Ê¤ë¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ïstdin¤Ç¤¹¤¬¡¢fopen()¤ò»È¤Ã¤ÆÊѹ¹¤Ç¤¤Þ¤¹¡£
yyin¤òÆÉ¤ß¹þ¤à¥Ç¥Õ¥©¥ë¥È¤ÎÊýË¡¤Ï¡¢
Ê£¿ôʸ»ú¤«¤éÀ®¤ë¥Ö¥í¥Ã¥¯¤ò°ìÅÙ¤ËÆÉ¤à¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£
¤³¤ì¤Ï¡¢YY_INPUT¥Þ¥¯¥í¤Ë¤è¤Ã¤ÆÊѹ¹¤Ç¤¤Þ¤¹¡£
YY_INPUT¥Þ¥¯¥í¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯Ê¸»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î¥¹¥¥ã¥Ê
¤òÀ¸À®¤¹¤ë¤Î¤ËÊØÍø¤Ç¤¹¡£
YY_INPUT¤òÄêµÁ¤¹¤ëÊýË¡¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£
YY_INPUT(buffer,result,max_size)
¤³¤³¤Ç¡¢buffer¤ÏÆþÎϥХåե¡¡¢result¤ÏÆÉ¤ß¹þ¤Þ¤ì¤¿Ê¸»ú¿ô
¤¬¥»¥Ã¥È¤µ¤ì¤ëÊÑ¿ô¡¢max_size¤Ïbuffer¤Î¥µ¥¤¥º¤Ç¤¹¡£
°Ê²¼¤Ë¡¢°ìÅÙ¤Ë1ʸ»ú¤º¤ÄÆÉ¤ß¹þ¤à¤È¤¤¤¦ÆþÎÏÊýË¡¤ËÊѹ¹¤¹¤ëºÆÄêµÁ¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£
¤³¤ÎÊýË¡¤ò»È¤¦¤È¤«¤Ê¤êÃÙ¤¯¤Ê¤ë¤Î¤Ç¡¢¤ª¤¹¤¹¤á¤Ï¤Ç¤¤Þ¤»¤ó¡£
#undef YY_INPUT
#define YY_INPUT(buffer,result,max_size) \
{\
buffer[0] = getchar();\
if(buffer[0] == EOF)\
result = YY_NULL;\
else\
result = 1;\
}
Ãí°Õ¡§¤³¤ÎºÆÀë¸À¤Ï¡¢¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤Î
C¥³¡¼¥ÉÎΰè¤Ë¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
yyout
yyout¤Ï¥¹¥¥ã¥Ê¤¬ECHO¤Î½ÐÎϤò½ñ¤¹þ¤à¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ïstdout¤Ç¤¹¤¬¡¢
¤³¤ì¤âfopen()¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤ÇÊѹ¹¤Ç¤¤Þ¤¹¡£
yytext
yytext¤ÏºÇ¸å¤Ë¥Þ¥Ã¥Á¤µ¤ì¤¿Ê¸»úÎó¡¢
¤Ä¤Þ¤êºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤ò´Þ¤àÂç°èÊÑ¿ô¤Ç¤¹¡£
yytext¤ÎÀµ¤·¤¤³°ÉôÄêµÁ¤Ï¡¢Lex¤Î¾ì¹ç¤Îchar¤ÎÇÛÎó¤È¤Ï°Û¤Ê¤ê¡¢
char¤ËÂФ¹¤ë¥Ý¥¤¥ó¥¿·¿¤Ç¤¢¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
7
¤Ä¤Þ¤ê¡¢yytext¤Ï
extern char yytext[];
¤Ç¤Ï¤Ê¤¯¡¢¾ï¤Ë
extern char *yytext;
¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¤³¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëÍýͳ¤ÏÀǽ¤Ç¤¹¡£
yytext¤¬ÇÛÎó¤Ç¤¢¤ë¤È¡¢¥¹¥¥ã¥ÊÃæ¤Ç¤½¤ì¤òÁàºî¤¹¤ë¥³¡¼¥É¤Ï¡¢
¥³¥Ô¡¼½èÍý¤ò¤¿¤¯¤µ¤ó¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤ËÂФ·¤Æyytext¤¬¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢
¤³¤Î¤è¤¦¤Ê¤³¤È¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
Ä̾ï¤Ï¡¢yytext¤ÏÊѹ¹¤¹¤Ù¤¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
yytext¤ÎÆâÍÆ¤¬Êѹ¹¤µ¤ì¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢
Âå¤ï¤ê¤Î¥Ð¥Ã¥Õ¥¡¤¬»È¤ï¤ì¤ë¤Ù¤¤Ç¤¹¡Êexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Î
yymore2.lex¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢yytext¤òľÀÜÁàºî¤¹¤ëµ»Ë¡¤¬
¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤¿¤À¤·¡¢¤³¤Î¤è¤¦¤Ê¤ä¤êÊý¤Ï¤ª¤¹¤¹¤á¤Ç¤¤Þ¤»¤ó¡Ë¡£
yyleng
yyleng¤Ï¡¢ºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÝ»ý¤¹¤ëÂç°èÊÑ¿ô¤Ç¤¹¡£
yywrap()
yywrap¤Ï¡¢yyin¤Î½ªÃ¼¤Ë㤷¤¿¤È¤¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô¤Ç¤¹¡£
¤³¤Î´Ø¿ô¤¬TRUE¡Ê¥¼¥í°Ê³°¡Ë¤òÊÖ¤¹¤È¥¹¥¥ã¥Ê¤Ï½ªÎ»¤·¡¢FALSE¡Ê¥¼¥í¡Ë
¤òÊÖ¤¹¤È¡¢yyin¤¬¼¡¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤ËÀßÄꤵ¤ì¤¿¤â¤Î¤È²¾Äꤷ¤Æ¡¢
¥¹¥¥ã¥ó½èÍý¤¬Â³¹Ô¤µ¤ì¤Þ¤¹¡£
¸½ºß¤Î¤È¤³¤íyywrap()¤Ï¡¢¾ï¤Ë1¤òÊÖ¤¹¤è¤¦ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¤³¤Î¤¿¤á¡¢ºÆÄêµÁ¤¹¤ë¤Ë¤Ï¡¢¤Þ¤ººÇ½é¤Ë#undef¤ÇÄêµÁ²ò½ü
¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Lex¤Ç¤Ï¡¢yywrap()¤Ï´Ø¿ô¤Ç¤¹¡£
Flex¤â¾Íè¤Î¤¢¤ë»þÅÀ¤Ç¡¢¤³¤ì¤ò´Ø¿ô¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
8
yymore()
yymore() ¤Ï¡¢
¼¡¤Ëǧ¼±¤µ¤ì¤ë¥È¡¼¥¯¥ó¤Çyytext¤ÎÆâÍÆ¤ò¹¹¿·¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢¤½¤Î»þÅÀ¤Î
yytext¤ÎÆâÍÆ¤Î¸å¤í¤Ë¤½¤Î¥È¡¼¥¯¥ó¤òÄɲ乤ë¤è¤¦Flex¤ËÄÌÃΤ¹¤ë´Ø¿ô¤Ç¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢°Ê²¼¤ÎÎã¤ËÂФ·¤Æfoobar¤È¤¤¤¦Ê¸»ú¤ÎʤӤòÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢
stdout¤Ëfoofoobar¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬½ñ¤¹þ¤Þ¤ì¤Þ¤¹¡£
%% foo ECHO; yymore(); bar ECHO;
¤³¤ì¤Ï¡¢¤Þ¤ºfoo¥ë¡¼¥ë¤Ë¤è¤Ã¤Æfoo¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ç§¼±¤µ¤ì¤Æ
ECHO¤µ¤ì¡¢¼¡¤Ëbar¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ç§¼±¤µ¤ì¤Æyytext¤Î
ÆâÍÆ¤Î¸å¤í¤ËÄɲ䵤줿¸å¤Ë¡¢foobar¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬ECHO
¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£
¤â¤¦¾¯¤·¸½¼ÂŪ¤ÊÎã¤ò¼è¤ê¾å¤²¤Þ¤·¤ç¤¦¡£
°Ê²¼¤Î¥³¡¼¥É¤ÏÊ£¿ô¹Ô¤Îʸ»úÎó¤ò½èÍý¤¹¤ë¤Î¤Ëyymore()¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£
/*
* yymore.lex: yymore()¤ò͸ú¤Ë»È¤¦Îã
*/
%{
#include <memory.h>
void yyerror(char *message)
{
printf("Error: %s\n",message);
}
%}
%x STRING
%%
\" BEGIN(STRING);
<STRING>[^\\\n"]* yymore();
<STRING><<EOF>> {
yyerror("EOF in string.");
BEGIN(INITIAL);
}
<STRING>\n {
yyerror("Unterminated string.");
BEGIN(INITIAL);
}
<STRING>\\\n yymore(); /* Ê£¿ô¹Ô¤Ë¤ï¤¿¤ë
* ʸ»úÎó¤ò½èÍý¤¹¤ë
*/
<STRING>\" {
yytext[yyleng-1] = '\0';
printf("string = \"%s\"",yytext);
BEGIN(INITIAL);
}
%%
¤³¤ÎÎã¤Ç¤Ï¡¢¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ÎÊÑ´¹¤¬¤Þ¤Ã¤¿¤¯¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢
ʸ»úÎó¤ËÂФ·¤Æ¤µ¤é¤Ë½èÍý¤¬É¬ÍפǤ¢¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ÎÎã¤Ï¡¢Ê¸»úÎó¥ê¥Æ¥é¥ë¤Î½èÍý¤Ë¤ª¤¤¤Æ¡¢
¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ò½èÍý¤¹¤ë¡¢¤è¤êÌò¤ËΩ¤Ä·Á¼°¤Ë³ÈÄ¥¤µ¤ì¤Þ¤¹¡£
yyless(n)
yyless()¤Ï¡¢yymore()¤È¤Û¤ÜÈ¿ÂФΤ³¤È¤ò¹Ô¤¦¤â¤Î¤Ç¤¹¡£
¤³¤Î´Ø¿ô¤Ï¡¢ºÇ½é¤Înʸ»ú°Ê³°¤Î¤¹¤Ù¤Æ¤òÌᤷ¤Þ¤¹¡£
Ìᤵ¤ì¤¿Ê¸»ú¤ÎʤӤϡ¢¼¡¤Î¥È¡¼¥¯¥ó¤ò¥Þ¥Ã¥Á¤¹¤ë¤Î¤Ë»È¤ï¤ì¡¢yyleng¤È
yytext¤Ë¤Ï¡¢¤³¤ÎÊѲ½¤òÈ¿±Ç¤·¤¿Ãͤ¬ÀßÄꤵ¤ì¤Þ¤¹¡£
°ú¿ôn¤Ë¥¼¥í¤ò»ØÄꤷ¤Æyyless()¤ò¸Æ¤Ó½Ð¤¹¤È¡¢Á´ÆþÎϥǡ¼¥¿¤¬Ìᤵ¤ì¡¢
¥¹¥¥ã¥Ê¤Ï¡ÊBEGIN¡¢¤Þ¤¿¤Ï¤½¤ì¤ËÎà»÷¤Î¤â¤Î¤Ç¥Ç¥Õ¥©¥ë¥È¤Îưºî¤¬
Êѹ¹¤µ¤ì¤Ê¤¤¤«¤®¤ê¡Ë̵¸Â¥ë¡¼¥×¤ËÆþ¤ê¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢¼¡¤Î¥³¡¼¥É¤Ëfoobar¤È¤¤¤¦Ê¸»ú¤ÎʤӤòÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢
foobarbar¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£
%% foobar ECHO; yyless(3); [a-z]+ ECHO;
¤³¤ì¤Ï¡¢foobar¤¬Ç§¼±¤µ¤ìECHO¤µ¤ì¤¿¸å¤Ë¡¢
bar¤¬Ìᤵ¤ì¤ë¤«¤é¤Ç¤¹¡£
¤È¤Ê¤ë¤È¡¢¼¡¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Î¤Ï¡Ê[a-z]+¤È¤¤¤¦¥ë¡¼¥ë¤Ç¥Þ¥Ã¥Á¤µ¤ì¤ë¡Ë
bar¤À¤±¤Ç¡¢¤³¤ì¤¬¼¡¤ËECHO¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
input()
input()¤Ï¡¢yyin¤«¤é¼¡¤Îʸ»ú¤ò¼è¤Ã¤ÆÊÖ¤¹´Ø¿ô¤Ç¤¹¡£
¤³¤ì¤Ï¡¢É¸½àŪ¤ÊFlex¥ë¡¼¥ë¥·¥¹¥Æ¥à¤ò»È¤Ã¤¿¤Î¤Ç¤Ï¤¦¤Þ¤¯°·¤¨¤Ê¤¤¥±¡¼¥¹¤ò
½èÍý¤¹¤ë¤Î¤Ë¤è¤¯»È¤ï¤ì¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢¤Û¤È¤ó¤É¤Î¸À¸ì¤Ë¤ª¤±¤ë¥³¥á¥ó¥È¤Ï¡¢¤³¤ì¤ò»È¤Ã¤Æ½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤ì¤ò»È¤¦Íýͳ¤Ï¡¢
%% "/*".*"*/"
¤¬¡¢¥Ô¥ê¥ª¥É¤¬²þ¹Ô°Ê³°¤ÎǤ°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¤¿¤á¤Ë Ê£¿ô¹Ô¤Ë¤ï¤¿¤ë¥³¥á¥ó¥È¤ò¤¦¤Þ¤¯½èÍý¤Ç¤¤º¡¢¤Þ¤¿¡¢
%% "/*"[.\n]*"*/"
¤Ï¡¢Ê¸»ú¥¯¥é¥¹¤¬Ç¤°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¤¿¤á¤Ë¡¢¥Ð¥Ã¥Õ¥¡¤ò ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤µ¤»¤ë¤«¡¢¤µ¤â¤Ê¤±¤ì¤Ð¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤ò¤¹¤Ù¤Æ ÆÉ¤ß¹þ¤ó¤Ç¤·¤Þ¤¦¤«¤é¤Ç¤¹¡Ê¼ÂºÝ¤Ë¤Ï¡¢ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¦¤³¤È¤Ç¡¢ ¤³¤¦¤·¤¿¤³¤È¤òÈó¾ï¤Ë¥¨¥ì¥¬¥ó¥È¤ÊÊýË¡¤Ç½èÍý¤Ç¤¤Þ¤¹¡£ ¥×¥í¥°¥é¥àÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Ìò¤ËΩ¤Ä¥³¡¼¥É½¸¤ò »²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤·¤«¤·¡¢POSIX¤Ë¤è¤ê¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤Ë¤â¤«¤«¤ï¤é¤º¡¢¤³¤³¤ÇɬÍ×¤Ë¤Ê¤ë ¤¤¤¯¤Ä¤«¤Îµ¡Ç½¤òLex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤¤¿¤á¤Ë¡¢¤³¤ÎÊýË¡¤Ë¤Ï°Ü¿¢À¤¬¤¢¤ê¤Þ¤»¤ó¡Ë¡£ C¤Î¥³¥á¥ó¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ°Ü¿¢À¤Î¤¢¤ëÊýË¡¤Ç½èÍý¤Ç¤¤Þ¤¹¡£
%%
"/*" {
int a,b;
a = input();
while(a != EOF){
b = input();
if(a == '*' && b == '/'){
break;
}else{
a = b;
}
}
if(a == EOF){
error_message("EOF in comment");
}
}
Ãí°Õ¡§¥¹¥¥ã¥Ê¤¬C++¥³¥ó¥Ñ¥¤¥é¤ò»È¤Ã¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¾ì¹ç¤Ï¡¢
¤³¤Î´Ø¿ôinput¤Ïyyinput¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¡¢input¤È¤¤¤¦Ì¾Á°¤¬Æ±°ì̾¤ÎC++¥¹¥È¥ê¡¼¥à¤È¾×ÆÍ¤¹¤ë¤«¤é¤Ç¤¹¡£
¤Þ¤¿¡¢Flex¤Ç¤Ïinput()¤Ïyytext¤ÎÆâÍÆ¤òÇ˲õ¤·¤Þ¤¹¤¬¡¢
Lex¤Ç¤Ïyytext¤ÏÊѹ¹¤µ¤ì¤º¤½¤Î¤Þ¤Þ»Ä¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¾Íè¤Î¥ê¥ê¡¼¥¹¤Ç½¤Àµ¤µ¤ì¤ëͽÄê¤Ç¤¹¡£
unput(c)
unput()¤Ï¡¢
ʸ»úc¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ë¤è¤¦¤Ë¡¢
ʸ»úc¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÃÖ¤¯´Ø¿ô¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢
%%
foo unput('b');
¤Ïfoo¤òb¤ÇÃÖ¤´¹¤¨¤Þ¤¹¡£
¤³¤ì¤Ï¡¢foo¤Ë¥Þ¥Ã¥Á¤·¤Æb¤òÌᤷ¡¢¤³¤Îb¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ë
ʸ»ú¤Ë¤Ê¤ë¤«¤é¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë¤è¤ê¡¢b¤Ïstdout¤Ë½ñ¤¹þ¤Þ¤ì¤Þ¤¹¡£
1¤Ä¤Îʸ»ú¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ë¤Ï1¤ÄÈù̯¤ÊÅÀ¤¬¤¢¤Ã¤Æ¡¢ ¤½¤ì¤Ï¡¢Ê¸»úÎó¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÃÖ¤¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢µÕ½ç¤Ë ¹Ô¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
foobar {
char *baz = "baz";
int i = strlen(baz)-1;
while(i >= 0){
unput(baz[i]);
i--;
}
}
¤³¤ì¤Ï¡¢foobar¤¬¥Þ¥Ã¥Á¤µ¤ì¤¿¤È¤¤Ë¡¢
ÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ëbaz¤òÃÖ¤¤Þ¤¹¡£
°Ê²¼¤Ï¡¢¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¤³¤È¤ò¼¨¤¹Îã¤Ç¤¹¡£
/*
* unput.l : unput()¤ò»È¤Ã¤Æ¹Ô¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤
* ½èÍý¤ÎÎã
*/
%{
#include <stdio.h>
void putback_yytext(void);
%}
%%
foobar putback_yytext();
raboof putback_yytext();
%%
void putback_yytext(void)
{
int i;
int l = strlen(yytext);
char buffer[YY_BUF_SIZE];
strcpy(buffer,yytext);
printf("Got: %s\n",yytext);
for(i=0; i<l; i++){
unput(buffer[i]);
}
}
¤³¤ÎÎã¤Ëfoobar¤òÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢¤Þ¤ºfoobar¤Ë¥Þ¥Ã¥Á¤·¡¢
¼¡¤Ëraboof¤Ë¥Þ¥Ã¥Á¤¹¤ë̵¸Â¥ë¡¼¥×¤Ë´Ù¤ê¤Þ¤¹¡£
Ãí°Õ¡§input()¤ÈƱÍͤËunput()¤âyytext¤ÎÆâÍÆ¤ò
Ç˲õ¤·¤Þ¤¹¡£9¤Ä¤Þ¤ê¡¢
yytext¤«¤éʸ»ú¾ðÊó¤òÊÖ¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¾å¤ÎÎã¤Ë¼¨¤µ¤ì¤ë¤è¤¦¤Ë¡¢
¤Þ¤ºyytext¤ÎÆâÍÆ¤ò¥³¥Ô¡¼¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
yyterminate()
yyterminate()¤Ï¥¹¥¥ã¥Ê¤Î¼Â¹Ô¤ò½ªÎ»¤µ¤»¡¢
¤½¤Î¸å¤Ëyylex()¤¬0¤òÊÖ¤·¤Þ¤¹¡£
¤³¤Î¸å¤Ï¡¢yyrestart()¤¬¸Æ¤Ó½Ð¤µ¤ì¤Ê¤¤¤«¤®¤ê¡¢
yylex()¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¤¹¤°¤ËÉüµ¢¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
yyrestart(file)
yyrestart()¤Ï¡¢¥¹¥¥ã¥Ê¤Î¼Â¹Ô¤òºÆ³«¤¹¤ë¤è¤¦Flex¤ËÄÌÃΤ¹¤ë´Ø¿ô¤Ç¤¹¡£
¤³¤ì¤Ï°ú¿ô¤ò1¤Ä¤À¤±¡¢¤¹¤Ê¤ï¤Á¡¢¥¹¥¥ã¥ó¤ÎÂоݤȤʤë¥Õ¥¡¥¤¥ë
¡ÊÄ̾ï¤Ïyyin¡Ë¤ò¼è¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¡¢EOF¤ò½èÍý¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤â¤Ç¤¤Þ¤¹¤·¡¢¤Þ¤¿¡¢Flex¤Ë³ä¤ê¹þ¤ß¤ò¤«¤±¡¢
¤½¤Î¸å¤ËºÆ³«¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤â¤Ç¤¤Þ¤¹
¡ÊFlex¥¹¥¥ã¥Ê¤ÏºÆÆþ²Äǽ¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¢¤³¤Î¤è¤¦¤Ê¤³¤È¤¬É¬Íפˤʤê¤Þ¤¹¡Ë¡£
YY_NEW_FILE
yyin¤¬¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦Êѹ¹¤µ¤ì¡¢
½èÍý¤¬·Ñ³¤µ¤ì¤ë¤Ù¤¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤òFlex¤ËÄÌÃΤ¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
10
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
/*
* cat.lex: YY_NEW_FILE¤Î»ÈÍÑÎã
*/
%{
#include <stdio.h>
#define ERRORMESS "Unable to open %s\n"
char **names = NULL;
int current = 1;
%}
%%
<<EOF>> {
current += 1;
if(names[current] != NULL){
yyin = fopen(names[current],"r");
if(yyin == NULL){
fprintf(stderr,ERRORMESS,
names[current]);
yyterminate();
}
YY_NEW_FILE;
} else {
yyterminate();
}
}
%%
int main(int argc, char **argv)
{
if(argc < 2){
fprintf(stderr,"Usage: cat files....\n");
exit(1);
}
names = argv;
yyin = fopen(names[current],"r");
if(yyin == NULL){
fprintf(stderr,ERRORMESS,names[current]);
yyterminate();
}
yylex();
}
ECHO
yytext¤ÎÆâÍÆ¤òyyout¤Ë½ñ¤¹þ¤à¥Þ¥¯¥í¤Ç¤¹¡£
REJECT
REJECT¤Ï¡¢
¤½¤Î»þÅÀ¤Ë¤ª¤¤¤Æ¥Þ¥Ã¥Á¤·¤Æ¤¤¤ë¤â¤Î¤ò¼õ¤±Æþ¤ì¤º¡¢¼¡¤Ë¤â¤Ã¤È¤â¤è¤¯¥Þ¥Ã¥Á¤¹¤ë¤â¤Î
¤ò¼õ¤±Æþ¤ì¤ë¤è¤¦¥¹¥¥ã¥Ê¤ËÄÌÃΤ¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¥¹¥¥ã¥Ê¤Ï¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ÎÃæ¤ÇºÇŤΤâ¤Î¤òõ¤·¡¢¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬2¤Ä¤¢¤Ã¤Æ
¤½¤ÎŤµ¤¬Æ±¤¸¾ì¹ç¤Ï¡¢µ½Ò¥Õ¥¡¥¤¥ë¤Ë¤ª¤¤¤ÆºÇ½é¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤Û¤¦¤òÁªÂò¤·¤Þ¤¹¡£
¤Ä¤Þ¤ê¡¢Ç§¼±¤µ¤ì¤ë¥Æ¥¥¹¥È¤ÎŤµ¤Ï¡¢Æ±°ì¤ÎŤµ¤Ë¤Ê¤ë¤³¤È¤â
û¤¯¤Ê¤ë¤³¤È¤â¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
REJECT¤ò»È¤Ã¤¿¸å¤Ï¡¢yytext¤Èyyleng¤Ï¿·¤·¤¤Ãͤò¼è¤ê¤Þ¤¹¡£
REJECT¤Ë´Ø¤·¤ÆÃΤäƤª¤¯¤Ù¤½ÅÍפÊÅÀ¤¬2¤Ä¤¢¤ê¤Þ¤¹¡£
1¤Ä¤Ï¡¢REJECT¤Ïʬ´ôÌ¿Îá¤Ç¤¢¤ê¡¢·è¤·¤ÆÊ֤äƤ³¤Ê¤¤¤Î¤Ç¡¢
REJECT¤Î¸å¤í¤Ëµ½Ò¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤Ï¼Â¹Ô¤µ¤ì¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¤â¤¦1¤Ä¤Ï¡¢REJECT¤È¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¡Êfast table¡¢-F¡Ë¤Ï°ì½ï¤Ë
»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
°Ê²¼¤Ë´Êñ¤ÊÎã¤ò¼¨¤·¤Þ¤¹¡£
/*
* reject.lex: REJECT¤Èunput()¤ò°ÍѤ¹¤ëÎã
*/
%%
UNIX {
unput('U'); unput('N');
unput('G'); unput('\0');
REJECT;
}
GNU printf("GNU is Not Unix!\n");
%%
¤³¤ÎÎã¤Ï¡¢¿·Êý¼°¤Î¥Æ¥¥¹¥ÈÂåÂØ¤Îµ»Ë¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£
UNIX¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤ë¤È¡¢unput()¤Ë¤è¤Ã¤Æ
GNU¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ìᤵ¤ì¡¢¤½¤Î»þÅÀ¤Ë¤ª¤±¤ë¥¹¥¥ã¥ó¥Ð¥Ã¥Õ¥¡¤Î
ÆâÍÆ¤¬¾å½ñ¤¤µ¤ì¤Þ¤¹¡£
¼¡¤ËREJECT¤Ë¤è¤êʬ´ô¤¬¹Ô¤ï¤ì¡¢Ê̤Τâ¤Î¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¥¹¥¥ã¥Ê
¤ËÂФ·¤ÆÄÌÃΤ¬¹Ô¤ï¤ì¤Þ¤¹¡£
GNU¤¬¥Ð¥Ã¥Õ¥¡¤Ë½ñ¤¹þ¤Þ¤ì¤¿¤Î¤Ç¡¢¤³¤ì¤¬¼¡¤Ë¥Þ¥Ã¥Á¤µ¤ì¡¢
¤½¤Î¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
°Ê²¼¤Ë¡¢µ¯¤³¤ê¤¦¤ë·ë²Ì¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£
UNIX return GNU is Not Unix!
¼ÂºÝ¤Î¤È¤³¤í¤Ï¡¢Flex¤Ë¤ª¤¤¤ÆREJECT¤ÎÍÑÅӤϤۤó¤Î¾¯¤·¤·¤«¤¢¤ê¤Þ¤»¤ó¡£
¾åµ°Ê³°¤Ç¤Ï¡¢½ÅÊ£¤¹¤ë¥Ñ¥¿¡¼¥ó¤ä¾õÂÖ¤ÎÊѹ¹¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Îã¤ò¼¨¤¹¤È¡¢°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
nday [1-9]|[1-2][0-9]|3[0-1]
nmonth [1-9]|1[0-2]
nyear [0-9]{1,4}
%x DAY MONTH YEAR
%%
{nday} BEGIN(DAY); REJECT;
<DAY>{nday}
...
{nmonth} BEGIN(MONTH); REJECT;
<MONTH>{nday}
...
{nyear} BEGIN(YEAR); REJECT;
<YEAR>{nday}
...
¤³¤ÎÎã¤Ç¤Ï¡¢ÆüÉդηÁ¼°¤Ï½ÅÊ£¤·¤Æ¤ª¤ê¡¢ºÇ½é¤Ëǧ¼±¤µ¤ì¤¿¹½À®Í×ÁǤˤè¤Ã¤Æ¡¢
¤É¤Î¤è¤¦¤ËÆüÉÕ¤ò¥Ñ¡¼¥¹¤¹¤ë¤Î¤«¤ò·èÄꤷ¤Þ¤¹¡£
¤·¤«¤·¡¢¤³¤ÎÎã¤Ï¤ä¤äÉÔ¼«Á³¤Ê´¶¤¸¤¬¤·¤Þ¤¹¡£
¤È¤¤¤¦¤Î¤Ï¡¢¤Á¤ç¤Ã¤È¹Í¤¨¤ì¤Ð¡¢REJECT¤ò»È¤ï¤º¤Ë¡¢
¤è¤ê¸úΨŪ¤Ê¥¹¥¥ã¥Ê¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¤«¤é¤Ç¤¹¡£
¤³¤ì¤Ï¡¢¥¹¥¿¡¼¥È¾õÂ֤λÈÍÑÎã¤Ë¼¨¤·¤Æ¤¤¤Þ¤¹¡£
BEGIN
BEGIN¤Ï¡¢
¥¹¥¥ã¥Ê¤ò¤¢¤ëÆÃÄê¤Î¥¹¥¿¡¼¥È¾õÂ֤ˤ¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¤Ç¤¹¡£
BEGIN¤Ë³¤¯Ì¾Á°¤Ï¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢
%x FLOAT
%%
floats BEGIN(FLOAT)
<FLOAT>some_rule some_action
...
¤Ï¡¢
floats¤È¤¤¤¦Ã±¸ì¤¬¥Þ¥Ã¥Á¤·¤¿¤È¤¤Ë¡¢
¥¹¥¿¡¼¥È¾õÂÖ¤òFLOAT¤ËÀßÄꤷ¤Þ¤¹
¡Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢see Start States Explained¡Ë¡£
YY_USER_ACTION
YY_USER_ACTION¤Ï¡¢
¥ë¡¼¥ë¥»¥¯¥·¥ç¥óÃæ¤Î¤É¤Î¥¢¥¯¥·¥ç¥ó¤è¤ê¤âÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¥¢¥¯¥·¥ç¥ó¤ò
ÄêµÁ¤¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¤³¤ì¤Ï¡¢°Ê²¼¤ÎÎã¤Ç¼¨¤¹¤è¤¦¤Ë¡¢yytext¤ÎÆâÍÆ¤Î¾®Ê¸»ú¤«¤éÂçʸ»ú¤Ø¤Î
ÊÑ´¹¤Ê¤É¤ò¹Ô¤¦¤Î¤ËÌò¤ËΩ¤Á¤Þ¤¹¡£
/*
* user_act.lex: YY_USER_ACTION¤ò»È¤¦
* ¥æ¡¼¥¶¡¼¥¢¥¯¥·¥ç¥ó¤ÎÎã
*/
%{
#include <ctype.h>
void user_action(void);
#define YY_USER_ACTION user_action();
%}
%%
.* ECHO;
\n ECHO;
%%
/*
* ¤³¤Î¥æ¡¼¥¶¡¼¥¢¥¯¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Îʸ»ú¤ò
* ñ¤ËÂçʸ»ú¤ËÊÑ´¹¤¹¤ë
*/
void user_action(void)
{
int loop;
for(loop=0; loop<yyleng; loop++){
if(islower(yytext[loop])){
yytext[loop] = toupper(yytext[loop]);
}
}
}
¤³¤ì¤Ï¡¢¤¹¤Ù¤Æ¤ÎÆþÎÏʸ»ú¤òñ¤ËÂçʸ»ú¤ËÊÑ´¹¤·¤ÆECHO¤·¤Þ¤¹¡£
YY_USER_ACTION¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÀßÄê¤Ç¤Ï¡¢²¿¤â¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£
YY_USER_INIT
YY_USER_INIT¤Ï¡¢
¥¹¥¥ã¥ó½èÍý¤¬³«»Ï¤µ¤ì¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
´ðËÜŪ¤Ë¤Ï¡¢main()´Ø¿ô¤ÎÃæ¤Ç¡¢yylex()¤ò¸Æ¤Ó½Ð¤¹Ê¸¤ÎÁ°¤Ë
ƱÍͤΥ³¡¼¥É¤òµ½Ò¤¹¤ë¤Î¤ÈƱ¤¸¤³¤È¤Ç¤¹¡£
°Ê²¼¤Ë´Êñ¤ÊÎã¤ò¼¨¤·¤Þ¤¹¡£
/*
* userinit.lex: YY_USER_INIT¤ò»È¤¦Îã
*/
%{
#define YY_USER_INIT open_input_file()
extern FILE *yyin;
void open_input_file(void)
{
char *file_name,buffer[1024];
yyin = NULL;
while(yyin == NULL){
printf("Input file: ");
file_name = fgets(buffer,1024,stdin);
if(file_name){
file_name[strlen(file_name)-1] = '\0';
yyin = fopen(file_name,"r");
if(yyin == NULL){
printf("Unable to open \"%s\"\n",
file_name);
}
} else {
printf("stdin\n");
yyin = stdin;
break;
}
}
}
%}
%%
¤³¤ì¤Ï¡¢¥Õ¥¡¥¤¥ë¤¬¥ª¡¼¥×¥ó¤µ¤ì¤ë¤«EOF¤¬¸¡½Ð¤µ¤ì¤ë¤Þ¤Ç¡¢
ÆþÎÏ¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ¹¤ë¤è¤¦¥æ¡¼¥¶¡¼¤ËºÅÂ¥¤·¤Þ¤¹¡£
EOF¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢ÆþÎϸµ¤Ï¥Ç¥Õ¥©¥ë¥È¤Çstdin¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤Ï°Ê²¼¤ÈƱ¤¸¤³¤È¤Ç¤¹¡£
/*
* ¤³¤ÎÎã¤Ï¡¢Á°¤ÎÎã¤ÈƱ¤¸¤³¤È¤òYY_USER_INIT¤ò
* »È¤ï¤º¤Ë¹Ô¤¦
*/
%{
void open_input_file(void)
{
char *file_name,buffer[1024];
yyin = NULL;
while(yyin == NULL){
printf("Input file: ");
file_name = fgets(buffer,1024,stdin);
if(file_name){
file_name[strlen(file_name)-1] = '\0';
yyin = fopen(file_name,"r");
if(yyin == NULL){
printf("Unable to open \"%s\"\n",
file_name);
}
} else {
printf("stdin\n");
yyin = stdin;
break;
}
}
}
%}
%%
%%
int main(int argc, char *argv[])
{
open_input_file();
yylex();
}
YY_BREAK
YY_BREAK¤Ï¥Þ¥¯¥í¤Ç¤¹¡£
¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Åª¤Êµ¡Ç½¤È¤¤¤¦¤è¤ê¤â¡¢¤à¤·¤íÀ¸À®¤µ¤ì¤ë¥³¡¼¥É¤òÊѹ¹¤¹¤ë¤¿¤á¤Ë
»È¤¦¤³¤È¤¬¤Ç¤¤ë¤â¤Î¤Ç¤¹¡£
¥¹¥¥ã¥ÊÃæ¤Ë¤ª¤¤¤Æ¡¢¤¹¤Ù¤Æ¤Î¥¢¥¯¥·¥ç¥ó¤Ï1¤Ä¤ÎÂ礤Êswitchʸ¤ÎÍ×ÁÇ
¤Ç¤¢¤ê¡¢¥Ç¥Õ¥©¥ë¥È¤ÇC¤Îbreak;ʸ¤ËÃÖ¤´¹¤¨¤é¤ì¤ëYY_BREAK
¤Ë¤è¤Ã¤Æ¶èÀÚ¤é¤ì¤Þ¤¹¡£
¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥óÉô¤¬Â¿¤¯¤Îreturnʸ¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¡¢¥³¥ó¥Ñ¥¤¥é¤¬
statement not reached¤È¤¤¤¦¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò¤¿¤¯¤µ¤ó½ÐÎÏ
¤¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£
YY_BREAK¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢
¤³¤Î·Ù¹ð¥á¥Ã¥»¡¼¥¸¤Î½ÐÎϤò»ß¤á¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
ºÆÄêµÁ¤Ï¡¢¥»¥ß¥³¥í¥ó¤ò´Þ¤àÀµÅö¤ÊC¤Îʸ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Ãí°Õ¡§YY_BREAK¤òºÆÄêµÁ¤·¤Æ¶õ¤Ë¤¹¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢
¥¢¥¯¥·¥ç¥ó¤ÎºÇ¸å¤Ïɬ¤ºreturn;¤«break;¤Ë¤Ê¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
Flex 2.5¤Ç¤Ï¡¢Á°Àá¡ÊFlex and C¡Ë¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢ °Ê²¼¤Î¥Þ¥¯¥í¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
yy_set_interactive(is_interactive)
yy_set_interactive()¤Ë¤è¤ë»ØÄê¤Ï¡¢%option always-interactive¤ä
%option never-interactive¤Ë¤è¤ë»ØÄê¤ËÍ¥À褷¤Þ¤¹¡£
¤³¤Î¥Þ¥¯¥í¤Ï¡¢¥Ð¥Ã¥Õ¥¡¤«¤é¤Î¥¹¥¥ã¥ó½èÍý¤¬»Ï¤Þ¤ë¤è¤ê¤âÁ°¤Ë
¸Æ¤Ó½Ð¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
yy_set_bol(at_bol)
^¤ò´Þ¤à¥ë¡¼¥ë¤¬Å¬ÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î
¸½ºß°ÌÃÖ¤¬¼ÂºÝ¤Ë¹Ô¤ÎÀèÆ¬¤Ç¤¢¤ë¾ì¹ç¤À¤±¤Ç¤¹¤¬¡¢¸½ºß°ÌÃÖ¤¬¹Ô¤ÎÀèÆ¬¤Ë
¤¢¤ë¤«Èݤ«¤È¤¤¤¦¾ðÊó¤Ï¡¢¥Ð¥Ã¥Õ¥¡¤Î¥³¥ó¥Æ¥¥¹¥È¾ðÊó¤È¤·¤ÆÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¥Þ¥¯¥íyy_set_bol()¤Ï¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃÖ¤¬¹Ô¤ÎÀèÆ¬¤Ë
¤¢¤ë¤«Èݤ«¤òɽ¤¹¥³¥ó¥Æ¥¥¹¥È¾ðÊó¤òÀßÄꤷ¤Þ¤¹¡£
°ú¿ô¤Ë¥¼¥í°Ê³°¤ÎÃͤòÅϤ¹¤È¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃ֤ϹԤÎÀèÆ¬¤Ç¤¢¤ë¡¢
¤È¤¤¤¦¥³¥ó¥Æ¥¥¹¥È¾ðÊ󤬥»¥Ã¥È¤µ¤ì¤Þ¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢¼¡¤Ë¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á½èÍý¤¬¹Ô¤ï¤ì¤ë¤È¤¤Ë¤Ï¡¢
¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤ÎŬÍѤ¬»î¤ß¤é¤ì¤Þ¤¹¡£
µÕ¤Ë¡¢°ú¿ô¤Ë¥¼¥í¤òÅϤ¹¤È¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃ֤ϹԤÎÀèÆ¬¤Ç¤Ï¤Ê¤¤¤³¤È¤Ë¤Ê¤ê¡¢
¼¡¤Ë¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á½èÍý¤¬¹Ô¤ï¤ì¤ë¤È¤¤Ë¤Ï¡¢
¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤ÎŬÍѤ¬»î¤ß¤é¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
YY_AT_BOL()
^¤ò´Þ¤à¥ë¡¼¥ë¤Î
ŬÍѤ¬»î¤ß¤é¤ì¤ë¤è¤¦¤Ê¥³¥ó¥Æ¥¥¹¥È¾ðÊ󤬥»¥Ã¥È¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢
¥¼¥í°Ê³°¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥¼¥í¤òÊÖ¤·¤Þ¤¹¡£
¤¢¤ëñ¸ì¤¬¸½¤ì¤¿¤È¤¤Ë¡¢¤½¤ì¤òÊ̤Îñ¸ì¤ËÃÖ¤´¹¤¨¤ëɬÍפ¬À¸¤¸¤ë¤³¤È ¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¤¢¤ë̾Á°¤¬¸½¤ì¤ë¤¿¤Ó¤Ë¡¢¤½¤ì¤ò¤¢¤ë1¤Ä¤Î´Ä¶ÊÑ¿ô¤ÎÃÍ¤Ç ÃÖ¤´¹¤¨¤Æ¤¯¤ì¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òºî¤ë¤È¤·¤Þ¤·¤ç¤¦¡£ ¤½¤·¤Æ¡¢°Ê²¼¤Î¤è¤¦¤Ê¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¡¢¤½¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤¬¥Õ¥£¥ë¥¿ ¤È¤·¤ÆÆ°ºî¤¹¤ë¤è¤¦¤Ë¤µ¤»¤Þ¤¹¡£
nick% myname < infile | more nick% myname < infile > outfile
°Ê²¼¤Ë¡¢¤³¤¦¤·¤¿¤³¤È¤ò¼Â¸½¤¹¤ëÊýË¡¤ò¼¨¤¹Flex¥Õ¥¡¥¤¥ë¤Î´Êñ¤ÊÎã¤ò¤¢¤²¤Þ¤¹¡£
/*
* myname.lex : ¥È¡¼¥¯¥ó¤ÎÃÖ¤´¹¤¨¤ò¹Ô¤¦Flex¥×¥í¥°¥é¥à
* ¤Î¥µ¥ó¥×¥ë
*/
%%
%NAME { printf("%s",getenv("LOGNAME")); }
%HOST { printf("%s",getenv("HOST")); }
%HOSTTYPE { printf("%s",getenv("HOSTTYPE"));}
%HOME { printf("%s",getenv("HOME")); }
%%
¤³¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ïexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¡¢
¤½¤Î̾Á°¤Ïmyname.lex¤Ç¤¹¡£
¤³¤ì¤ò¥Ó¥ë¥É¤¹¤ë¤Ë¤Ï¡¢examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë°Üư¤·¤Æ
make myname¤ò¼Â¹Ô¤¹¤ë¤«¡¢°Ê²¼¤ò¼Â¹Ô¤·¤Þ¤¹¡£
flex myname.lex cc lex.yy.c -o myname -lfl
¤³¤³¤Ç-lfl¤Ï¡¢¥ê¥ó¥«¤ËÂФ·¤ÆFlex¥é¥¤¥Ö¥é¥ê¤ò¥ê¥ó¥¯¤¹¤ë¤è¤¦ÄÌÃΤ·¤Þ¤¹¡£
¸½ºß¤Î¤È¤³¤í¡¢Flex¥é¥¤¥Ö¥é¥ê¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¤Îmain()´Ø¿ô
¤À¤±¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£
¾Íè¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎFlex¤Ç¤Ï¡¢Â¾¤Î´Ø¿ô¤â´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£
Flex¥é¥¤¥Ö¥é¥ê¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢
¤³¤ÎÉôʬ¤Ï-ll¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¤¤¤º¤ì¤Î¾ì¹ç¤Ç¤â¡¢ºÇ½ªÅª¤Ë¤Ïmyname¤È¤¤¤¦Ì¾Á°¤Î¼Â¹Ô¥Õ¥¡¥¤¥ë¤¬
À¸À®¤µ¤ì¤ë¤Ï¤º¤Ç¤¹¡£
¤³¤ì¤Ï¡¢°Ê²¼¤Î¤è¤¦¤ÊÊÑ´¹½èÍý¤ò¼Â¹Ô¤¹¤ë¥Õ¥£¥ë¥¿¤Ç¤¹¡£
%NAME
%HOST
%HOSTTYPE
%HOME
¤·¤¿¤¬¤Ã¤Æ¡¢°Ê²¼¤Î¤è¤¦¤ÊÆâÍÆ¤ò»ý¤Ä¥Õ¥¡¥¤¥ëmyname.txt¤òºîÀ®¤·¤Æ¡¢
Hello, my name is %NAME. Actually "%NAME" isn't my real name, it is the alias I use when I'm on %HOST, which is the %HOSTTYPE I use. My HOME directory is %HOME.
°Ê²¼¤ò¼Â¹Ô¤¹¤ë¤È¡¢
myname < myname.txt
°Ê²¼¤Î¥Æ¥¥¹¥È¤Ë»÷¤¿¤â¤Î¤¬stdout¤Ø½ñ¤¹þ¤Þ¤ì¤Þ¤¹¡£
Hello, my name is foobar. Actually "foobar" isn't my real name, it is the alias I use when I'm on baz, which is the cray I use. My HOME directory is /home/foo/foobar.
¤³¤Î¥×¥í¥°¥é¥à¤¬¤¦¤Þ¤¯Æ°ºî¤¹¤ë¤Î¤Ï¡¢yyin¤Èyyout¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï
stdin¡¢stdout¤Ë¤½¤ì¤¾¤ì³ä¤êÅö¤Æ¤é¤ì¡¢¤«¤Ä¡¢
¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥¯¥·¥ç¥ó¤¬yyin¤ÎÆâÍÆ¤òyyout¤Ë¥³¥Ô¡¼¤¹¤ë¤«¤é¤Ç¤¹¡£
¤Þ¤¿¡¢¸Ä¡¹¤Î¥ë¡¼¥ë¤ËÂбþ¤¹¤ëÍ£°ì¤Î¥¢¥¯¥·¥ç¥ó¤¬Ã±°ì¹Ô¤Çµ½Ò¤µ¤ì¤Æ¤¤¤ë¤¿¤á¡¢
{ }¤ÏɬÍפǤϤʤ¤¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ò{ }¤Ç°Ï¤à¤«Èݤ«¤Ï¡¢
¸Ä¿ÍŪ¤Ê¹¥¤ß¤ÎÌäÂê¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤¬¡¢°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤Ë¤¢¤ë¤â¤Î¤â´Þ¤á¤Æ¡¢»ØÄꤵ¤ì¤¿Ì¾Á°¤¬¸½¤ì¤ë¤È¤³¤í ¤¹¤Ù¤Æ¤Ë¥Þ¥Ã¥Á¤·¤¿¤³¤È¤Ëµ¤¤¬¤Ä¤¤Þ¤·¤¿¤«¡©¡¡ Flex¤Ë¤ª¤¤¤Æ¤Ï¡¢°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿Éôʬ¤Ë¤¢¤ë¤â¤Î¤Ë¥Þ¥Ã¥Á¤µ¤»¤¿¤¯¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ ¤½¤ì¤ËÂбþ¤¹¤ë¥ë¡¼¥ë¤òºîÀ®¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢ ¤½¤¦¤·¤Ê¤¤¤è¤¦ÌÀ¼¨Åª¤ËFlex¤ËÄÌÃΤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
/*
* myname2.lex : ¥È¡¼¥¯¥ó¤ÎÃÖ¤´¹¤¨¤ò¹Ô¤¦Flex¥×¥í¥°¥é¥à¤ÎÎã
*/
%{
#include <stdio.h>
%}
%x STRING
%%
\" ECHO; BEGIN(STRING);
<STRING>[^\"\n]* ECHO;
<STRING>\" ECHO; BEGIN(INITIAL);
%NAME { printf("%s",getenv("LOGNAME")); }
%HOST { printf("%s",getenv("HOST")); }
%HOSTTYPE { printf("%s",getenv("HOSTTYPE"));}
%HOME { printf("%s",getenv("HOME")); }
¤³¤ÎÎã¤Ç¤Ï¡¢ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤Ã¤Æ¡¢
ʸ»úÎóÃæ¤Î¥Æ¥¥¹¥È¤¬Êѹ¹¤µ¤ì¤ë¤³¤È¤Î¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£
¤³¤ÎÎã¤âexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ë¤â¤Î¤Ç¡¢
¤½¤Î̾Á°¤Ïmyname2.lex¤Ç¤¹¡£
Bison¤Ï¡¢Flex¤ÈƱÍÍ¡¢¤¢¤ëµ½Ò¾ðÊó¤ò¼õ¤±¼è¤Ã¤Æ¡¢ ¤½¤ì¤ò¤â¤È¤ËC¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ë¥×¥í¥°¥é¥à¤Ç¤¹¡£ ξ¼Ô¤Î°ã¤¤¤Ï¡¢ Bison¤¬C¤äPascal¤Î¤è¤¦¤Ê¸À¸ì¤Îʸˡ¤Ë´Ø¤¹¤ëµ½Ò¾ðÊó¤òÆþÎϤȤ·¤Æ¼õ¤±¼è¤ê¡¢ ¤½¤Îµ½Ò¾ðÊ󤫤é¥Ñ¡¼¥µ¤òÀ¸À®¤¹¤ëÅÀ¤Ë¤¢¤ê¤Þ¤¹¡£ Flex¤ÈBison¤ò·ë¹ç¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢¸À¸ì¤Î»ú¶ç²òÀϤȹ½Ê¸²òÀϤÎξÊý¤ò ½èÍý¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡Ê¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¥Ç¥¶¥¤¥ó¤Ë¤ª¤¤¤Æ¤â¤Ã¤È¤â ÍÆ°×¤Ë¼«Æ°²½¤Ç¤¤ëÉôʬ¤Ç¤¹¡Ë¡£
À¸À®¤µ¤ì¤ë¥Ñ¡¼¥µ¤¬µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢
Bison¤Ïyylex()¤È¤¤¤¦´Ø¿ô¤òɬÍפȤ·¤Þ¤¹¡£
¤³¤Î´Ø¿ô¤Ï¥æ¡¼¥¶¡¼¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¡¢¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤¤Ë¡¢
¥Ñ¡¼¥¹¤µ¤ì¤Æ¤¤¤ë¸À¸ì¤Î¤¢¤ëÍ×ÁǤòɽ¤¹À°¿ôÃͤòBison¤ËÊÖ¤·¤Þ¤¹¡£
Flex¤Ë¤ª¤¤¤Æ¥¹¥¥ã¥ó½èÍý¤ò¹Ô¤¦¥ë¡¼¥Á¥ó¤Ïyylex()¤Ç¤¢¤ê¡¢
¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÀ°¿ôÃͤòÊÖ¤·¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢Flex¤ÈBison¤ò°ì½ï¤Ë»È¤¦¤Î¤ÏÈó¾ï¤Ë´Êñ¤Ë¤Ê¤ê¤Þ¤¹¡£
·Ù¹ð¡§ °Ê²¼¤ÎÀá¤Ç¤Ï¡¢ÆÉ¼Ô¤¬Bison¤Î´ðËÜŪ¤Ê¥Ñ¡¼¥µ¤ÎÀë¸À¤ò Íý²ò¤·¤Æ¤¤¤ë¤â¤Î¤È²¾Äꤷ¤Þ¤¹¡£ Bison¤ò»È¤Ã¤¿·Ð¸³¤Î¤Ê¤¤¿Í¤Ë¤Ï¡¢¥Ñ¡¼¥µ¤ÎÄêµÁ¤Ïº®Íð¤ò¤â¤¿¤é¤¹²ÄǽÀ ¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢Àè¤Ë¿Ê¤àÁ°¤Ë¤¼¤ÒBison¤Î¥Þ¥Ë¥å¥¢¥ë11¤òÆÉ¤ó¤Ç¤¯¤À¤µ¤¤¡£ Bison¤Ë¶½Ì£¤Î¤Ê¤¤¿Í¤Ï¡¢¤³¤ÎÀáÁ´ÂΤòÈô¤Ð¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£
Flex¤ÈBison¤Î´Ö¤Ç¾ðÊó¤òÅϤ¹´ðËÜŪ¤ÊÊýË¡¤Ï¡¢´Ø¿ôyylex()¤ò»È¤¦¤³¤È¤Ç¤¹¡£
¤³¤ì¤Ï¡¢Flex¤Ë¤è¤êÀ¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤Ë¤ª¤¤¤Æ¡¢
¥¹¥¥ã¥ó½èÍý¤ò¼Â¹Ô¤¹¤ë´Ø¿ô¤Î̾Á°¤Ç¤¹¡£
Flex¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥·¥ç¥óÉôʬ¤Ë¤ª¤¤¤Æreturnʸ¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢
ñ¤Ê¤ë0¤ä1°Ê³°¤ÎÃͤòÊÖ¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤ÎÊýË¡¤Ç¡¢
yylex()¤ÏºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤òɽ¤¹À°¿ôÃͤòÊÖ¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Bison¤ò-d¥ª¥×¥·¥ç¥óÉÕ¤¤Ç»È¤¦¤È¡¢
Bison¤Ï.tab.h¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢
µ½Ò¾ðÊóÃæ¤Ë¤¢¤ëÀµÅö¤Ê¥È¡¼¥¯¥ó¤Î1¤Ä1¤Ä¤ËÂФ¹¤ë°ì°Õ¤ÊÄêµÁ¾ðÊ󤬴ޤޤì¤Þ¤¹¡£
¤³¤Î½ÐÎϾðÊó¤Ï¡¢ÆÃ¤Ë¥¹¥¥ã¥Ê¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë¤³¤È¤òÁÛÄꤷ¤ÆÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤òFlex¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ë´Þ¤á¤ë¤³¤È¤Ç¡¢
2¤Ä¤Î¥×¥í¥°¥é¥à¤Î´Ö¤ËÈó¾ï¤ËÌÀ³Î¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤òºî¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Îã¤È¤·¤Æ¡¢°Ê²¼¤ËBison¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤Î̾Á°¤òexpr.y¤È¤·¤Þ¤·¤ç¤¦¡£
/*
* expr.y : Bison¥Þ¥Ë¥å¥¢¥ëÃæ¤ÎÎã¤Ë´ð¤Å¤¯
* Bison¤Ë¤è¤ë´Êñ¤Êɽ¸½¼°¥Ñ¡¼¥µ
*/
%{
#include <stdio.h>
#include <math.h>
%}
%union {
float val;
}
%token NUMBER
%token PLUS MINUS MULT DIV EXPON
%token EOL
%token LB RB
%left MINUS PLUS
%left MULT DIV
%right EXPON
%type <val> exp NUMBER
%%
input :
| input line
;
line : EOL
| exp EOL { printf("%g\n",$1);}
exp : NUMBER { $$ = $1; }
| exp PLUS exp { $$ = $1 + $3; }
| exp MINUS exp { $$ = $1 - $3; }
| exp MULT exp { $$ = $1 * $3; }
| exp DIV exp { $$ = $1 / $3; }
| MINUS exp %prec MINUS { $$ = -$2; }
| exp EXPON exp { $$ = pow($1,$3);}
| LB exp RB { $$ = $2; }
;
%%
void yyerror(char *s)
{
printf("%s\n",s);
}
int main()
{
yyparse();
}
¤³¤ì¤ÏÈó¾ï¤Ë´Êñ¤Ê·×»»µ¡¤ÎʸˡÄêµÁ¤Ç¤¹¡£
-y -d¥ª¥×¥·¥ç¥óÉÕ¤¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢
Bison¤Ïy.tab.h¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤ÊÄêµÁ¤¬´Þ¤Þ¤ì¤Þ¤¹¡£
typedef union {
float val;
} YYSTYPE;
extern YYSTYPE yylval;
#define NUMBER 258
#define PLUS 259
#define MINUS 260
#define MULT 261
#define DIV 262
#define EXPON 263
#define EOL 264
#define LB 265
#define RB 266
Flex¤¬¥È¡¼¥¯¥ó¤ÎÃͤòÀµ¤·¤¯Bison¤ËÊÖ¤¹¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¡¢
¡Ê#include¤ò»È¤Ã¤Æ¡Ë¤³¤ì¤ò¥¹¥¥ã¥Ê¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤½¤Î¥³¡¼¥É¤Ï°Ê²¼¤Î¤è¤¦¤Ê¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£
/*
* expr.lex : ´Êñ¤Êɽ¸½¼°¥Ñ¡¼¥µ¤Î¤¿¤á¤Î¥¹¥¥ã¥Ê
*/
%{
#include "y.tab.h"
%}
%%
[0-9]+ { yylval.val = atof(yytext);
return(NUMBER);
}
[0-9]+\.[0-9]+ {
sscanf(yytext,"%f",&yylval.val);
return(NUMBER);
}
"+" return(PLUS);
"-" return(MINUS);
"*" return(MULT);
"/" return(DIV);
"^" return(EXPON);
"(" return(LB);
")" return(RB);
\n return(EOL);
. { yyerror("Illegal character");
return(EOL);
}
%%
¾åµ¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Þ¤¹¡£
bison -d -y expr.y flex -I expr.lex cc -o expr y.tab.c lex.yy.c alloca.c
¤Þ¤¿¡¢¤³¤ÎÎã¤Î¥½¡¼¥¹¤¬¼ê¸µ¤Ë¤¢¤ì¤Ð¡¢examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤Æ
make expr¤ò¼Â¹Ô¤¹¤ë¤À¤±¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Þ¤¹¡£
¤É¤Á¤é¤ÎÊýË¡¤Ç¤â¡¢expr¤È¤¤¤¦Ì¾Á°¤Î´Êñ¤Ê·×»»µ¡¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
¤³¤ì¤Ï°Ê²¼¤Î¤è¤¦¤Êɽ¸½¼°¤ò¥Ñ¡¼¥¹¤·¤Æ¡¢¤½¤Î·ë²Ì¤ò½ÐÎϤ·¤Þ¤¹¡£
1 + 2 * (199*2)
¤³¤ì¤ò¸«¤Æ¤ª¤ï¤«¤ê¤Î¤è¤¦¤Ë¡¢ ¤³¤Î¼ï¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ÏÈó¾ï¤Ë½ÀÆð¤Ç¤¢¤ê¡¢¤«¤Ä¡¢Êݼé¤âÈó¾ï¤ËÍÆ°×¤Ç¤¹¡£ ¡Ê¥È¡¼¥¯¥ó¤òÄêµÁ¤¹¤ë̾Á°¤¬ÊѤï¤é¤Ê¤¤¤«¤®¤ê¡ËBison¤ÈFlex¤Î´Ö¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹ ¤òÊѹ¹¤¹¤ë¤³¤È¤Ê¤¯¡¢Flex¡¢Bison¤¤¤º¤ì¤ÎÆþÎϾðÊó¤Ë¤ª¤¤¤Æ¤â¡¢µ¡Ç½¤ÎÄɲääºï½ü¡¢ ÄêµÁ¤ä¥³¡¼¥É¤ÎÊѹ¹¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤Ç¤¹¡£
¤³¤ÎÎã¤Ç¤Ï¡¢Flex¤ÈBison¤Î´Ö¤Ç¾ðÊó¤òÅϤ¹¤¿¤á¤ÎÊ̤ÎÊýË¡¤òƳÆþ¤·¤Æ¤¤¤ë¤³¤È¤Ë
Ãí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ÎÎã¤Ç¤Ï¡¢¿ô»ú¤ÎÃͤòBison¤ËÊÖ¤¹¤Î¤Ëyylval¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£
¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¼¡¤ÎÀá¤Ç¤è¤ê¾Ü¤·¤¯ÀâÌÀ¤·¤Þ¤¹¡£
¤³¤³¤Ç¤Ï¤È¤ê¤¢¤¨¤º¡¢returnʸ¤Î»È¤¤Êý¤ò³Ð¤¨¤Æ¤¯¤À¤µ¤¤¡£
Ãí°Õ¡§¤³¤ì¤Ïñ½ã¤ÊÎã¤Ç¤¹¡£ ɽ¸½¼°¤Î¥Ñ¡¼¥¹½èÍý¤Ë¤Ä¤¤¤Æ¤è¤ê¾Ü¤·¤¯ÃΤꤿ¤¤Êý¤Ï¡¢ Bison¤Î¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
Flex¤«¤éBison¤ËÂФ·¤Æ¡¢Ã±¤Ê¤ëÀ°¿ôÃͰʾå¤Î¾ðÊó¤òÅϤ¹É¬ÍפÎÀ¸¤¸¤ë¤³¤È ¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥é¤Ë¤ª¤¤¤Æ¤Ï¡¢¤É¤Î¤è¤¦¤Ê¼ïÎà¤Î¥È¡¼¥¯¥ó¤¬Ç§¼±¤µ¤ì¤¿¤« ¤À¤±¤Ç¤Ï¤Ê¤¯¡¢¤½¤Î¥È¡¼¥¯¥ó¤ÎÃͤˤĤ¤¤Æ¤âÃΤëɬÍפΤ¢¤ë¾ì¹ç¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£ ʸ»úÎó¡¢Ê¸»ú¡¢¤ª¤è¤Ó¿ôÃÍÄê¿ô¤Ê¤É¤¬Îɤ¤Îã¤Ç¤¹¡£ ¤³¤³¤ÇÌäÂê¤Ê¤Î¤Ï¡¢¤É¤Î¤è¤¦¤Ë¤·¤ÆFlex¤Ë¤³¤¦¤·¤¿¾ðÊó¤òÊÖ¤µ¤»¤ë¤«¤Ç¤¹¡£
¤½¤ÎÅú¤¨¤Ï¡¢Bison¤¬»ý¤Ã¤Æ¤¤¤ë%unionʸ¤Ç¤¹¡£
¤³¤ì¤Ï¡¢YYSTYPE¤È¤¤¤¦·¿¤òÄêµÁ¤¹¤ë¤â¤Î¤Ç¤¹¡£
YYSTYPE¤Ï¡¢¥Ñ¡¼¥µÄêµÁÃæ¤Ë¤ª¤¤¤Æ»È¤ï¤ì¤ë¤¹¤Ù¤Æ¤ÎÀµÅö¤Ê¥Ç¡¼¥¿·¿¤Î
¶¦ÍÑÂΡÊunion¡Ë¤Ç¤¹¡£
Bison¤¬¸½ºß¤Î¥Ñ¡¼¥¹¾õÂ֤˴ØÏ¢¤Å¤±¤¿¥Ç¡¼¥¿¤òÊݸ¤¹¤ë¤¿¤á¤Ë»È¤¦¡¢
YYSTYPE·¿¤ÎÊÑ¿ôyylval¤È¤¤¤¦¤â¤Î¤¬¤¢¤ê¡¢Flex¤«¤éyylval
¤ËÃͤòÀßÄꤹ¤ë¤³¤È¤¬¤Ç¤¤ë¤Î¤Ç¡¢¥È¡¼¥¯¥ó¤Î·¿¤À¤±¤Ç¤Ê¤¯¡¢¤½¤ì°Ê¾å¤Î¾ðÊó¤ò
Bison¤ËÊÖ¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Bison¤Ë¤ª¤¤¤Æ%union¤òÀë¸À¤·¤Æ-d¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤È¡¢Bison¤Ï
.tab.h¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Æ¡¢¤½¤³¤Ë¥È¡¼¥¯¥ó¤ÎÄêµÁ¾ðÊó
¤À¤±¤Ç¤Ê¤¯¡¢YYSTYPE¤Èyylval¤ÎÀë¸À¤â´Þ¤á¤Þ¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢yylval¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤Ï¡¢
Flex¤ÎÄêµÁ¾ðÊó¤ÎÃæ¤Ë¤³¤Î.tab.h¥Õ¥¡¥¤¥ë¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¤³¤È¤À¤±¤Ç¤¹¡£
¤³¤ì¤Ï¡¢ÄɲäÎC¥³¡¼¥É¥»¥¯¥·¥ç¥ó¤Ë¤ª¤±¤ëÄêµÁ¤ÎÀèÆ¬¤Ç¥¤¥ó¥¯¥ë¡¼¥É
¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡Êsee Interfacing Flex and Bison¡Ë¡£
Ãí°Õ¡§½é´ü¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎBison¤Ï¡¢¼«Æ°Åª¤ËYYSTYPE¤È
yylval¤ÎÀë¸À¤òÀ¸À®¤·¤Þ¤»¤ó¡£
¤³¤Î¾ì¹ç¤Ë¤Ï¡¢¤è¤ê¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤ÎBison¤òÆþ¼ê¤¹¤ë¤«¡¢¤â¤·¤¯¤Ï¡¢Flex¤Î
ÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë¤ª¤¤¤ÆYYSTYPE¤Èyylval¤òÀë¸À¤¹¤ëɬÍ×
¤¬¤¢¤ê¤Þ¤¹¡£
¥³¡¼¥É¤òÆÉ¤à¤Î¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¤Î¤·¤«¤¿¤ò³Ø¤ÖÎɤ¤ÊýË¡¤Ç¤¹¡£ ¤½¤³¤Ç¡¢Flex¡¢Bison¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Îã¤ò¤â¤¦1¤Ä¼¨¤¹¤³¤È¤Ë¤·¤Þ¤¹¡£ ¼¡¤ÎÎã¤Ç¤Ï¡¢³ÈÄ¥¤·¤Æ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÁàºî¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ê¡¢ ¾®µ¬ÌϤʸÀ¸ì¤Î¤¿¤á¤Î´Êñ¤Ê¥Ñ¡¼¥µ¤òºî¤ê¤Þ¤¹¡£
¥Ç¡¼¥¿¥Ù¡¼¥¹¤È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¸À¸ì¤Ï¡¢±Ñ¸ì¤ÎÈó¾ï¤Ë¾®¤µ¤Ê¥µ¥Ö¥»¥Ã¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ ʸˡ¤Ï¤ª¤ª¤è¤½°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
command_list ::= sentence {sentence ...}
sentence ::= verb_phrase noun_phrase position_phrase
adverb period
verb_phrase ::= VERB | adverb VERB
noun_phrase ::= declared_noun | qualified_noun | noun
declared_noun ::= declarator NOUN
declarator ::= THIS | THAT | THE | THOSE
qualified_noun ::= qualifier NOUN
qualifier ::= SOME | MANY | ALL { declarator } NOUN
position_phrase ::= position declarator NOUN | empty
position ::= IN | ON | AT
adverb ::= ADVERB | empty
·ë²Ì¤È¤·¤ÆºîÀ®¤µ¤ì¤ë¥×¥í¥°¥é¥à¤Ï¡¢°Ê²¼¤Î¤è¤¦¤Êʸ¾Ï¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£
FIND MEN QUICKLY FIND MEN FIND ALL MEN ON THE NETWORK QUICKLY FIND ALL MEN ON THE NETWORK FIND ALL MEN ON THE NETWORK QUICKLY
¤³¤ÎÎã¤Ç¤Ï¡¢Bison¤ÈFlex¤Î´Ö¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤¬ÌÀ³Î¤Ë¼¨¤µ¤ì¤ë¤è¤¦¡¢ ʸ¾Ï¤Î´Êñ¤Ê²òÀÏ·ë²Ì¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£ ¤³¤Î¥×¥í¥°¥é¥à¤ò»î¤·¤Ë¼Â¹Ô¤·¤Æ¤ß¤ë¤È¡¢¤½¤Îɽ¼¨·ë²Ì¤ÏÂçÂΰʲ¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
% front FIND MEN I understand that sentence. VP = FIND NP = MEN PP = AD = QUICKLY FIND ALL THE MEN ON THE NETWORK I understand that sentence. VP = QUICKLY FIND NP = ALL THE MEN PP = ON THE NETWORK AD = ^C %
¤³¤ì¤ÏÆÃÊÌÊØÍø¤Ê¤â¤Î¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
¤È¤¤¤¦¤Î¤Ï¡¢¤³¤ì¤Ïʸ¾Ï¤Î¹½À®Í×ÁǤòɽ¼¨¤¹¤ë°Ê³°¤Ë²¿¤â¹Ô¤ï¤Ê¤¤¤«¤é¤Ç¤¹¡£
¤·¤«¤·¡¢¤½¤³¤Ë¤Ï³ÈÄ¥¤Î¤¿¤á¤Î¥Õ¥Ã¥¯¤â¤¢¤ê¤Þ¤¹¤·¡¢°ìÈÌŪ¤Êµ»Ë¡¤â¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤è¤ê°ìÈÌŪ¤Ê·Á¼°¤Îʸ¾Ï¤ò¼õ¤±ÉÕ¤±¤ë¤è¤¦¡¢¤³¤ÎÎã¤ò³ÈÄ¥¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£
¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢Ê¸¾Ï¤Ïư»ì¶ç¡ÊVERB¡Ë¤È̾»ì¶ç¡ÊNOUN¡Ë¤Ë
ʬ³ä¤Ç¤¤Þ¤¹¤¬¡¢½êͳÊ̾»ì¤ä̾»ì¤Î¸å¤í¤Ë̾»ì¤¬Â³¤¯¾ì¹ç¤Ê¤É¡¢
ʸ¾Ï¤ò¹½À®¤¹¤ë¾¤ÎÍ×ÁǤâµöÍÆ¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹
¡ÊFIND ALL JONE'S CAT NAMES¤Î¤è¤¦¤Êʸ¾Ï¤ò¤É¤¦¤ä¤Ã¤Æ¥Ñ¡¼¥¹¤¹¤ë¤«¤òÁÛÁü
¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡Ë¡£
Bison¤Îʸˡ¤ä¤½¤Î»È¤¤Êý¤Ë´Ø¤¹¤ë¾Ü¤·¤¤ÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢Bison¤Î¥Þ¥Ë¥å¥¢¥ë
¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
¤¹¤Ç¤Ë¡¢¾®µ¬ÌϤʸÀ¸ì¤Ë¤Ä¤¤¤Æ¤ÏÀâÌÀ¤·¤Þ¤·¤¿¡£ ¼¡¤Ë¤½¤ì¤ò¼ÂÁõ¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤ç¤¦¡£ °Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤³¤ì¤ò¼Â¸½¤·¤Þ¤¹¡£
Ãí°Õ¡§¤³¤ì¤Ï¤¢¤¯¤Þ¤Ç¤â1¤Ä¤ÎÎã¤È¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£ ÆÃ¤Ëʸˡ¤ÎÉôʬ¤Ï¡¢±Ñ¸ì¤Î¥Ñ¡¼¥¹½èÍý¤È¤·¤Æ¤Ï¤¢¤Þ¤êÎɤ¤Îã¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
°Ê²¼¤ÏBison¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
%union¤ÎÉôʬ¡¢¤ª¤è¤Ó¡¢yylval¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Ë$$¤È
$n¤ò»È¤¦ÊýË¡¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£
/* C¥³¡¼¥É¤Ï¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤ÇÄ󶡤¹¤ë */
%{
#include <stdio.h>
#include <string.h>
extern int yylexlinenum; /* lex.yy.c¤Ë¸ºß¤¹¤ë */
extern char *yytext; /* ¥«¥ì¥ó¥È¥È¡¼¥¯¥ó */
%}
/* ¥¡¼¥ï¡¼¥É¤ÈͽÌó¸ì¤¬¤³¤³¤«¤é»Ï¤Þ¤ë */
%union{ /* ¤³¤ì¤Ï¥Ç¡¼¥¿¤Î¶¦ÍÑÂÎ */
char name[128]; /* ̾Á° */
}
/*------------- ͽÌó¸ì ------------------*/
%token PERIOD
%token NEWLINE
%token POSITIONAL
%token VERB
%token ADVERB
%token PROPER_NOUN
%token NOUN
%token DECLARATIVE
%token CONDITIONAL
%type <name> declarative
%type <name> verb_phrase
%type <name> noun_phrase
%type <name> position_phrase
%type <name> adverb
%type <name> POSITIONAL VERB ADVERB PROPER_NOUN
%type <name> NOUN DECLARATIVE CONDITIONAL
%%
sentence_list : sentence
| sentence_list NEWLINE sentence
;
sentence : verb_phrase noun_phrase position_phrase
adverb period
{
printf("I understand that sentence.\n");
printf("VP = %s \n",$1);
printf("NP = %s \n",$2);
printf("PP = %s \n",$3);
printf("AD = %s \n",$4);
}
| { yyerror("That's a strange sentence!"); }
;
position_phrase : POSITIONAL declarative PROPER_NOUN
{
sprintf($$,"%s %s %s",$1,$2,$3);
}
| /* ¶õ */ { strcpy($$,""); }
;
verb_phrase : VERB { strcpy($$,$1); strcat($$," "); }
| adverb VERB
{
sprintf($$,"%s %s",$1,$2);
}
;
adverb : ADVERB { strcpy($$,$1); }
| /* ¶õ */ { strcpy($$,""); }
;
noun_phrase : DECLARATIVE NOUN
{
sprintf($$,"%s %s",$1,$2);
}
| CONDITIONAL declarative NOUN
{
sprintf($$,"%s %s %s",$1,$2,$3);
}
| NOUN { strcpy($$,$1); strcat($$," "); }
;
declarative : DECLARATIVE { strcpy($$,$1); }
| /* ¶õ */ { strcpy($$,""); }
;
period : /* ¶õ */
| PERIOD
;
%%
/* main()¤ª¤è¤Óyyerror()´Ø¿ô¤òÄ󶡤¹¤ë */
void main(int argc, char **argv)
{
yyparse(); /* ¥Õ¥¡¥¤¥ë¤ò¥Ñ¡¼¥¹¤¹¤ë */
}
int yyerror(char *message)
{
extern FILE *yyout;
fprintf(yyout,"\nError at line %5d. (%s) \n",
yylexlinenum,message);
}
°Ê²¼¤ÏFlex¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ ʸ»úÎó¤¬ÅϤµ¤ì¤ëÊýË¡¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤ì¤ÏºÇŬ²½¤µ¤ì¤¿ÊýË¡¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢¤â¤Ã¤È¤âÍý²ò¤·¤ä¤¹¤¤ÊýË¡¤Ç¤¹¡£
%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h" /* ¤³¤ì¤ÏBison¤Ë¤è¤êÀ¸À®¤µ¤ì¤ë */
#define TRUE 1
#define FALSE 0
#define copy_and_return(token_type) \
{ \
strcpy(yylval.name,yytext);\
return(token_type); \
}
int yylexlinenum = 0; /* ¹Ô¿ô¥«¥¦¥ó¥ÈÍÑ */
%}
%%
/* »ú¶ç²òÀϥ롼¥ë¤¬¤³¤³¤«¤é»Ï¤Þ¤ë */
MEN|WOMEN|STOCKS|TREES copy_and_return(NOUN)
MISTAKES|GNUS|EMPLOYEES copy_and_return(NOUN)
LOSERS|USERS|CARS|WINDOWS copy_and_return(NOUN)
DATABASE|NETWORK|FSF|GNU copy_and_return(PROPER_NOUN)
COMPANY|HOUSE|OFFICE|LPF copy_and_return(PROPER_NOUN)
THE|THIS|THAT|THOSE copy_and_return(DECLARATIVE)
ALL|FIRST|LAST copy_and_return(CONDITIONAL)
FIND|SEARCH|SORT|ERASE|KILL copy_and_return(VERB)
ADD|REMOVE|DELETE|PRINT copy_and_return(VERB)
QUICKLY|SLOWLY|CAREFULLY copy_and_return(ADVERB)
IN|AT|ON|AROUND|INSIDE|ON copy_and_return(POSITIONAL)
"." return(PERIOD);
"\n" yylexlinenum++; return(NEWLINE);
.
%%
¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢ °Ê²¼¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Þ¤¹¡£
% bison -d front.y % flex -I front.lex % cc -o front alloca.c front.tab.c lex.yy.c
¤Þ¤¿¤Ï¡¢
¤³¤ÎÎã¤Î¥½¡¼¥¹¤¬¼ê¸µ¤Ë¤¢¤ì¤Ð¡¢
examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤Æmake front¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¤â¥³¥ó¥Ñ¥¤¥ë¤Ç¤¤Þ¤¹¡£
Ãí°Õ¡§Bison¥Ñ¡¼¥µ¤Ïalloca.c¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤¹¡£
¤³¤Î¥Õ¥¡¥¤¥ë¤Ïexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£
Bison¤ÎÂå¤ï¤ê¤Ëyacc¤ò»È¤¦¤Î¤Ç¤¢¤ì¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
°Ê²¼¤Ë¼ÂÁõ¤Ë´Ø¤¹¤ëÃí°Õ¤ò¼¨¤·¤Þ¤¹¡£
YYSTYPE ¤È yylval yylval¤¬Flex¤«¤é¥¢¥¯¥»¥¹¤µ¤ì¤ëÊýË¡¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£
Bisonʸˡ¤Ë¤ª¤¤¤Æ¥Ñ¡¼¥¹¥Ä¥ê¡¼¤Î¾å°Ì¤Ë¥Ç¡¼¥¿¤òÅϤ¹ÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï¡¢
Bison¤Î¥Þ¥Ë¥å¥¢¥ë¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢
Flex¤ËÂФ·¤Æ¤Ï¤Ê¤ó¤Î±Æ¶Á¤â»ý¤Á¤Þ¤»¤ó¡£
À°¿ôÃÍ¡¢ÉâÆ°¾®¿ôÅÀ¿ôÃÍ¡¢¤ª¤è¤Ó¾¤ÎǤ°Õ¤Î·¿¤Î¥Ç¡¼¥¿¤âƱÍͤÎÊýË¡¤Ç
ÊÖ¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
yylex()¤ò¸Æ¤Ó½Ð¤·¡¢
¥¹¥¥ã¥Ê¤¬¥È¡¼¥¯¥óÄêµÁ¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
Flex 2.5¤Ç¤Ï¡¢Flex¤ËÂФ¹¤ëC++¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£
Flex¤ÎC++¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»È¤¦¤¿¤á¤Ë¤Ï¡¢Flex¼Â¹Ô»þ¤Ë-+¥ª¥×¥·¥ç¥ó
¤ò»ØÄꤹ¤ë¤«¡¢¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç%option c++¤ò»ØÄꤹ¤ë
ɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤Ë¤è¤ê¡¢C++¤Î¥¹¥¥ã¥Ê¥¯¥é¥¹¤ò¼ÂÁõ¤¹¤ëlex.yy.cc¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬
À¸À®¤µ¤ì¤Þ¤¹¡£
lex.yy.cc¤Ï¡¢Flex¤¬Ä󶡤¹¤ëFlexLexer.h¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£
¤³¤ÎFlexLexer.h¤ÎÃæ¤Ë¡¢C++¥¹¥¥ã¥Ê¥¯¥é¥¹¤Î¼ÂÁõ¤ËÍøÍѤµ¤ì¤ë2¤Ä¤ÎC++¥¯¥é¥¹
¡ÊFlexLexer¤ÈyyFlexLexer¡Ë¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
FlexLexer¤Ï¡¢C++¥¹¥¥ã¥Ê¥¯¥é¥¹¤¬¼ÂÁõ¤¹¤Ù¤¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò¹½À®¤¹¤ë
Ãê¾Ý²¾ÁÛ´Ø¿ô¤òÄêµÁ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£
FlexLexer¤Î»ý¤Ä¥á¥ó¥Ð¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
char* yytext
int yyleng
int yylineno
%option yylineno¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ÆþÎϤµ¤ì¤¿¹Ô¿ô¤òÊÝ»ý¤·¤Þ¤¹¡£
¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¸ÇÄêÃÍ1¤ò»ý¤Á¤Þ¤¹¡£
int yy_flex_debug
¼¡¤Ë¡¢FlexLexer¤Î»ý¤Ä¥á¥ó¥Ð´Ø¿ô¤Î¤¦¤Á¡¢
Ãê¾Ý²¾ÁÛ´Ø¿ô¤Ç¤Ï¤Ê¤¤¤â¤Î¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
const char* YYText()
yytext¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int YYLeng()
yyleng¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int yylex(istream* new_in, ostream* new_out = 0)
switch_streams()
¤ò¸Æ¤Ó½Ð¤·¤¿¸å¡¢¥á¥ó¥Ð´Ø¿ôint yylex(void)¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£
int lineno() const
yylineno¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int debug() const
yy_flex_debug¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
void set_debug(int flag)
yy_flex_debug¤ËÂåÆþ¤·¤Þ¤¹¡£12
¼¡¤Ë¡¢FlexLexer¤Î»ý¤ÄÃê¾Ý²¾ÁÛ¥á¥ó¥Ð´Ø¿ô¤òÎóµó¤·¤Þ¤¹¡£
void yy_switch_to_buffer(struct yy_buffer_state* new_buffer) struct yy_buffer_state* yy_create_buffer(istream* s, int size) void yy_delete_buffer(struct yy_buffer_state* b) void yyrestart(istream* s) int yylex() void switch_streams(istream* new_in = 0, ostream* new_out = 0)
ºÇ½é¤Î5¤Ä¤Î¥á¥ó¥Ð´Ø¿ô¤Ï¡¢Flex¤ÎC¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤ª¤±¤ëƱ̾¤Î´Ø¿ô¤ÈƱÅù¤Î
µ¡Ç½¤ò¼Â¸½¤·¤Þ¤¹¡£
C¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ç¤Ï¡¢FILE*¤È¤Ê¤Ã¤Æ¤¤¤¿°ú¿ô¤Î·¿¤¬¡¢
istream*¤È¤Ê¤Ã¤Æ¤¤¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
ºÇ¸å¤Îswitch_streams()¤Ï¡¢Æþ½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ÎÀÚ¤êÂØ¤¨¤ò¹Ô¤¤¤Þ¤¹¡£
¤³¤ì¤é¤ÎÃê¾Ý²¾ÁÛ¥á¥ó¥Ð´Ø¿ô¤ÎÄêµÁ¤Ï¡¢¥µ¥Ö¥¯¥é¥¹yyFlexLexer
¤Ë¤ª¤¤¤ÆÍ¿¤¨¤é¤ì¡¢¤½¤Î¥³¡¼¥É¤Ïlex.yy.cc¤ÎÃæ¤ËÀ¸À®¤µ¤ì¤Þ¤¹¡£
yyFlexLexer¤Ï¡¢
FlexLexer¤Î¥µ¥Ö¥¯¥é¥¹¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Î¾õÂ֤Ǥϡ¢yyFlexLexer¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤·¤Æ¡¢
yylex()¥á¥ó¥Ð´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥¥ã¥Ê¤Î½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
int main( int /* argc */, char** /* argv */ )
{
FlexLexer* lexer = new yyFlexLexer;
while(lexer->yylex() != 0)
;
return 0;
}
¤³¤ì¤Ï¡¢C¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ë¤ª¤±¤ë¡¢°Ê²¼¤Î¥³¡¼¥É¤ËÂбþ¤·¤Þ¤¹¡£
int main( int /* argc */, char** /* argv */ )
{
yylex();
return 0;
}
¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë%option yyclass="classname"¤ò»ØÄꤹ¤ë¤È¡¢
lex.yy.cc¤Ëclassname::yylex()¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
¥¯¥é¥¹classname¤òyyFlexLexer¤Î¥µ¥Ö¥¯¥é¥¹¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È
¤Ë¤è¤Ã¤Æ¡¢classname¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò»È¤Ã¤Æ¥¹¥¥ã¥ó½èÍý¤ò¼Â¹Ô¤Ç¤¤Þ¤¹¡£
¥¯¥é¥¹classname¤òÄêµÁ¤¹¤ëºÝ¡¢°Ê²¼¤Ë¼¨¤¹¡¢yyFlexLexer¤Î»ý¤Ä
protected¥á¥ó¥Ð´Ø¿ô¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥¥ã¥Ê¤Î¿¶¤ëÉñ¤¤¤ò
Êѹ¹¤Ç¤¤Þ¤¹¡£
int LexerInput(char* buf, int max_size)
#ifdef YY_INTERACTIVE¤ò»È¤¤¤Þ¤¹¡£
void LexerOutput(const char* buf, int size)
void LexerError(const char* msg)
¥¹¥¥ã¥ó½èÍý¤Ë´Ø¤ï¤ë¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥¥¹¥È¾ðÊó¤Ï¡¢
yyFlexLexer¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÉô¤ËÊĤ¸¤Æ¤¤¤Þ¤¹¡£
¤³¤Î¤³¤È¤Ï¡¢C++¥¹¥¥ã¥Ê¥¯¥é¥¹¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢
ºÆÆþ²Äǽ¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
Ê£¿ô¤ÎC++¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤·¤Æ¡¢1¤Ä¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤â
²Äǽ¤Ç¤¹¡£
¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢Flexµ¯Æ°»þ¤Ë-Pprefix¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤«¡¢
¥¹¥¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë%option prefix="prefix"¤ò»ØÄꤹ¤ë¤³¤È
¤Ë¤è¤ê¡¢yyFlexLexer¤Î̾Á°¤òprefixFlexLexer¤ËÊѹ¹¤·¤Þ¤¹¡£
prefixFlexLexer¥¯¥é¥¹¤ò»È¤¦¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï¡¢
°Ê²¼¤Î¤è¤¦¤Ë¤·¤ÆFlexLexer.h¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢
prefixFlexLexer¡Ê¼ÂºÝ¤Ë¤ÏyyFlexLexer¡Ë
¤ÎÄêµÁ¤ò»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
#undef yyFlexLexer #define yyFlexLexer prefixFlexLexer #include <FlexLexer.h>
¤³¤³¤Ç¤Ï¡¢Lex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤µ¡Ç½¤ä°ìÈ̤ˤϤ¢¤Þ¤ê»È¤ï¤ì¤Ê¤¤µ¡Ç½¤òÀâÌÀ¤·¤Þ¤¹¡£ Flex¤Ï¤Û¤Ü100¥Ñ¡¼¥»¥ó¥ÈLex¸ß´¹¤Ç¤¹¤¬¡¢Lex¤è¤ê¤â¸å¤Ë¼ÂÁõ¤µ¤ì¤¿¤¿¤á¡¢ ÀǽŪ¤Ë¤è¤êÍ¥¤ì¤Æ¤ª¤ê¡¢ ¤Þ¤¿¡¢¹ÈϤÊÍÑÅӤ˻Ȥ¨¤ë¥¹¥¥ã¥Ê¤ò¤è¤ê´Êñ¤ËºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¤è¤¦¡¢ ÆÃÊ̤ʵ¡Ç½¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
¿¤¯¤Î¸À¸ì¤Ï¡¢¤½¤Î¼±Ê̻Ҥˤª¤¤¤ÆÂçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Þ¤»¤ó¡ÊPascal¡¢ BASIC¡¢FORTRAN¤Ê¤É¡Ë¡£ Lex¤Ë¤â¡¢Âçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤¥¹¥¥ã¥Ê¤ò»ØÄꤹ¤ë¤¿¤á¤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¤¬¡¢ ¤½¤ì¤é¤Ï³µ¤·¤ÆÈþ¤·¤¯¤Ê¤¯¡¢Íý²ò¤¹¤ë¤Î¤âº¤Æñ¤Ç¤¹¡£ ¸Ä¡¹¤Îʸ»ú¤òÃÖ¤´¹¤¨¤Æ¤¯¤ì¤ëÄêµÁ¤ò¡¢Ä¹¤¤¥ê¥¹¥È¤Ë¤·¤ÆºîÀ®¤Ç¤¤Þ¤¹¤·¡¢ ¤¹¤Ù¤Æ¤Î¼±Ê̻Ҥò¼õ¤±ÉÕ¤±¤ë1¤Ä¤Î¥ë¡¼¥ë¤òºîÀ®¤·¡¢¤½¤Î¥ë¡¼¥ë¤Ë¤ª¤¤¤Æ Âçʸ»ú¡¿¾®Ê¸»ú¤òÊÑ´¹¤·¤Æ¤«¤é¡¢¥È¡¼¥¯¥ó¤Î¼ïÎà¤òÊÖ¤¹¤è¤¦¤Ë¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ °Ê²¼¤Î¥³¡¼¥É¤Ï¡¢¤³¤Î2¤Ä¤ÎÊýË¡¤ò¼¨¤¹¤â¤Î¤Ç¤¹¡£ ÄêµÁ¤ò»È¤¦¤Î¤Ç¤¢¤ì¤Ð¡¢¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
A [aA]
B [bB]
...
Z [zZ]
%%
{B}{E}{G}{I}{N} return(BEGIN_SYM);
{E}{N}{D} return(END_SYM);
¤³¤ì¤Ë»÷¤¿Áàºî¤ò¥µ¥Ö¥ë¡¼¥Á¥ó¤Ç¼Â¹Ô¤¹¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢°Ê²¼¤Î¤è¤¦¤Ë¤·¤Þ¤¹¡£
ALPHA [a-zA-Z]
NUM [0-9]
ALPHANUM {ALPHA}|{NUM}
%%
{ALPHA}{ALPHANUM}* return(convert_and_lookup(yytext));
¤â¤Ã¤È¤â¤³¤ì¤Ï¡¢´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎɬÍפ¬¤¢¤ë¤¿¤á¡¢¸úΨ¤¬°¤¯¤Ê¤ê¤Þ¤¹ ¡ÊFlex¤Ç¤Ï¡¢¥Ñ¥¿¡¼¥ó¤ÎÊ£»¨¤µ¤ÏÂ礷¤Æ±Æ¶Á¤·¤Þ¤»¤ó¡Ë¡£
¤Û¤«¤Ë¤â¤³¤ì¤ÈƱ¤¸¤³¤È¤ò¹Ô¤¦ÊýË¡¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¤¤¤º¤ì¤â¥¨¥ì¥¬¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-i¥ª¥×¥·¥ç¥óFlex¤Ï¡¢
¤³¤ÎÌäÂê¤ò´Êñ¤Ë²ò·è¤¹¤ë¤¿¤á¤ÎÊýË¡¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç-i¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢ÆþÎϾðÊó¤Î
Âçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¡¢Flex¤ËÂФ·¤Æ
ÄÌÃΤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤Ä¤Þ¤ê¡¢Flex¤Ç¤Ï¾åµ¤Î¤è¤¦¤Ê¥Æ¥¯¥Ë¥Ã¥¯¤ò»È¤¦É¬Íפ¬¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò
°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð¡¢
%% begin return(BEGIN_SYM); end return(END_SYM);
¤Ï¡¢
-i¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢BEGIN¡¢begin¡¢
BeGiN¡¢¤ª¤è¤Ó¤³¤ì°Ê³°¤Î¤¹¤Ù¤Æ¤ÎÂçʸ»ú¡¿¾®Ê¸»ú¤ÎÁȤ߹ç¤ï¤»¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
¤³¤ì¤Ï¡¢Lex¤Ë¤ª¤¤¤ÆÆ±ÍͤΤ³¤È¤ò¹Ô¤¦¤¿¤á¤ÎÊýË¡¤è¤ê¤â¡¢¤Ï¤ë¤«¤Ë´Êñ¤Ç¤¹¡£
-i¥ª¥×¥·¥ç¥ó¤Ë¤Ï1¤ÄÃí°Õ¤¹¤Ù¤ÅÀ¤¬¤¢¤ê¤Þ¤¹¡£
¤½¤ì¤Ï¡¢¥¹¥¥ã¥Ê¤¬Âçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤¤À¤±¤Ç¡¢¤½¤Î
ÊÑ´¹¤Þ¤Ç¤Ï¤·¤Æ¤¯¤ì¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¤Ä¤Þ¤ê¡¢Pascal¤Ë¤ª¤¤¤Æ¥·¥ó¥Ü¥ë̾¤ò¥Ï¥Ã¥·¥å¤·¤¿¤¤¤è¤¦¤Ê¾ì¹ç¡¢¼«Ê¬¤Ç¥·¥ó¥Ü¥ë̾
¤òÂçʸ»ú¤Þ¤¿¤Ï¾®Ê¸»ú¤ËÊÑ´¹¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
¤½¤¦¤·¤Ê¤¤¤È¡¢FOO¤Èfoo¤Ï°Û¤Ê¤ë¤â¤Î¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£
¤³¤ì¤Ï¡¢¥·¥ó¥Ü¥ë¤òÊݸ¤¹¤ë¥ë¡¼¥Á¥ó¤ÎÃæ¤ÇÂнè¤Ç¤¤Þ¤¹¤·¡¢
YY_USER_ACTION¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤ÆÂн褹¤ë¤³¤È¤â¤Ç¤¤Þ¤¹¡£
¤³¤ì¤ò¼Â¸½¤¹¤ëÊýË¡¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and C¤Ë¤ª¤±¤ë
YY_USER_ACTION¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
-I¥ª¥×¥·¥ç¥ó¡§ÂÐÏ÷¿¥¹¥¥ã¥ÊFlex¤ÎÌäÂê¤È¤·¤Æ¡¢¤É¤Î¥ë¡¼¥ë¤òŬÍѤ¹¤ë¤«¤ò·èÄꤹ¤ëÁ°¤Ë¡¢ ÆþÎϾðÊóÃæ¤Î¼¡¤Î1ʸ»ú¤òÀèÆÉ¤ß¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ÂÐÏÃŪ¤Ç¤Ï¤Ê¤¤»È¤¤Êý¤ò¤¹¤ë¾ì¹ç¤Ë¤ÏÌäÂê¤Ë¤Ê¤ê¤Þ¤»¤ó¤¬¡¢ Flex¤ò»È¤Ã¤Æ¥æ¡¼¥¶¡¼¤«¤éľÀÜÆþÎÏʸ»ú¤ò¼õ¤±¼è¤ë¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢ ÌäÂê¤Ë¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
¤³¤Î¤è¤¦¤ÊÎã¤ò2¤Ä¤¢¤²¤ë¤È¡¢1¤Ä¤Ï¥·¥§¥ë¤È¤ä¤ê¼è¤ê¤¹¤ë¾ì¹ç¡¢ ¤â¤¦1¤Ä¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Õ¥í¥ó¥È¥¨¥ó¥É¤È¤ä¤ê¼è¤ê¤¹¤ë¾ì¹ç¤Ç¤¹¡£ Ä̾ï¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢²þ¹Ô¤¬ÆþÎϤνª¤ï¤ê¤òɽ¤¹¤È¤¤¤¦¤â¤Î¤Ç¡¢ ²þ¹Ô¼«¿È¤Ï°ì¼ï¤Î¡ÖÃæ¿È¤Î¤Ê¤¤Ê¸¡×¤È¤·¤Æ¼õ¤±ÉÕ¤±¤ë¤Î¤¬Ë¾¤Þ¤·¤¤¤Î¤Ç¤¹¤¬¡¢ Ä̾ï¤ÎFlex¥¹¥¥ã¥Ê¤Ç¤Ï¤³¤ì¤Ï²Äǽ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ Flex¤¬¾ï¤ËÀèÆÉ¤ß¤ò¤¹¤ë¤È¤¤¤¦»ö¼Â¤Ï¡¢²þ¹Ô¤¬Ç§¼±¤µ¤ì¤ë¤¿¤á¤Ë¤Ï¥æ¡¼¥¶¡¼¤¬¼¡¤Î¹Ô¤ò ÆþÎϤ·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹ ¡Ê¤¹¤Ê¤ï¤Á¡¢Ã±°ì¤Î²þ¹Ô¤Ï¡¢¤½¤ì¤À¤±¤Ç¤Ïǧ¼±¤µ¤ì¤º¡¢ ¾¤Îʸ»ú¤¬ÆþÎϤµ¤ì¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡Ë¡£ ¤³¤ì¤Ï¥·¥§¥ë¾å¤Ç¤Ï¤Þ¤Ã¤¿¤¯Ë¾¤Þ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£
Flex¤Ë¤Ï¤³¤ì¤ò²óÈò¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£
¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç-I¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤È¡¢Flex¤Ï¡¢
ɬÍפʾì¹ç¤Ë¤·¤«ÀèÆÉ¤ß¤ò¤·¤Ê¤¤ÆÃÊ̤ÊÂÐÏ÷¿¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
¤³¤Î¼ï¤Î¥¹¥¥ã¥Ê¤Ï¡¢¥æ¡¼¥¶¡¼¤«¤é¤ÎÆþÎϤòľÀܼõ¤±¼è¤ë¤Î¤ËŬ¤·¤Æ¤¤¤Þ¤¹¤¬¡¢
¼ã´³¤ÎÀǽÄã²¼¤ò°ú¤µ¯¤³¤¹¤«¤â¤·¤ì¤Þ¤»¤ó¡£
Ãí°Õ¡§-I¥ª¥×¥·¥ç¥ó¤Ï¡¢-f¡¢-F¡¢-Cf¡¢
¤Þ¤¿¤Ï-CF¥Õ¥é¥°¤È°ì½ï¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Þ¤»¤ó¡£
¤Ä¤Þ¤ê¡¢ÀèÆÉ¤ß¤¬¤Ç¤¤Ê¤¤¤³¤È¤«¤é¤¯¤ëÀǽÄã²¼¤Ë²Ã¤¨¤Æ¡¢¥Ñ¡¼¥µ¤â
Àǽ¸þ¾å¤Î¤¿¤á¤ËºÇŬ²½¤¹¤ë¤³¤È¤¬¤Ç¤¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
-I¥ª¥×¥·¥ç¥ó¤Ë¤ª¤±¤ë¥Þ¥¤¥Ê¥¹Ì̤ϡ¢Ä̾ï¤Ï¤´¤¯¤ï¤º¤«¤Ê¤Î¤Ç¡¢
ÆþÎϾðÊ󤬤ɤ³¤«¤é¤¯¤ë¤Î¤«¤¬³Î¤«¤Ç¤Ï¤Ê¤¯¡¢Àǽ¸þ¾å¤Î¤¿¤á¤ÎºÇŬ²½
¤ò»Ü¤¹²ÄǽÀ¤òÄü¤á¤Æ¤â¤«¤Þ¤ï¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç
-I¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤¿¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£
¥Æ¡¼¥Ö¥ë¤Î°µ½Ì¤È¥¹¥Ô¡¼¥É¤ÎÌ̤Ǥϡ¢ Flex¤ÏLex¤ÎǽÎϤò¤Ï¤ë¤«¤Ë¾å²ó¤Ã¤Æ¤¤¤Þ¤¹¡£ Flex¤Ï¡¢»È¤ï¤ì¤ë¥ª¥×¥·¥ç¥ó¤Ë±þ¤¸¤Æ¡¢Lex¤è¤ê¤â¤Ï¤ë¤«¤Ë¹â®¤Ê¥Æ¡¼¥Ö¥ë¡¢ ¤¢¤ë¤¤¤Ï¡¢¤Ï¤ë¤«¤Ë¾®¤µ¤Ê¥Æ¡¼¥Ö¥ë¤òÀ¸À®¤Ç¤¤Þ¤¹¡£ ¤³¤ÎÀá¤Ç¤Ï¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤È³Æ¥ª¥×¥·¥ç¥ó¤¬¥¹¥Ô¡¼¥É¤Ë¤â¤¿¤é¤¹±Æ¶Á ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ °ìÈ̤ˡ¢¥Æ¡¼¥Ö¥ë¤¬°µ½Ì¤µ¤ì¤ë¤Û¤É¡¢¤½¤Î¥¹¥Ô¡¼¥É¤ÏÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£ Flex¤Ç¤Ï¡¢¤³¤¦¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£ ¥ª¥×¥·¥ç¥ó¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£13
REJECT
¤ò»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
Ãí°Õ¡§-f¥Õ¥é¥°¤È-F¥Õ¥é¥°¤Ç¤Ï¡¢
À¸À®¤¹¤ë¥Æ¡¼¥Ö¥ë¤ËÁê°ã¤¬¤¢¤ê¤Þ¤¹¡£
-f¥Õ¥é¥°¤Ï¥Õ¥ë¥Æ¡¼¥Ö¥ë¡Êfull table¡Ë¤òÀ¸À®¤·¡¢
-F¥Õ¥é¥°¤Ï¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¡Êfast table¡Ë¤òÀ¸À®¤·¤Þ¤¹¡£
¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¤È¤Ï¡¢¥¹¥Ô¡¼¥É¤òºÇÂç¸Â¤Ë¤¹¤ë¤è¤¦ºÇŬ²½¤µ¤ì¤¿¥Æ¡¼¥Ö¥ë·Á¼°¤Ç¤¢¤ê¡¢
°ìÊý¡¢¥Õ¥ë¥Æ¡¼¥Ö¥ë¤Ë¤ÏºÇŬ²½¤Ï°ìÀڻܤµ¤ì¤Þ¤»¤ó¡£
·ë²Ì¤Ï¤è¤¯»÷¤Æ¤¤¤Þ¤¹¤¬¡¢¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤ÏÂ礤¯°Û¤Ê¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
-f¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤Ù¤¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢
ALPHA [a-zA-Z]
NUM [0-9]
ALPHANUM {ALPHA}|{NUM}
%%
begin return(BEGIN_SYM);
... rules and actions ...
end return(END_SYM);
{ALPHA}{ALPHANUM}* return(IDENTIFIER);
¤Ï-f¥Õ¥é¥°¤ò»È¤Ã¤Æ½èÍý¤¹¤Ù¤¤Ç¤¢¤ê¡¢
{ALPHA}{ALPHANUM}* {ECHO;
return(lookup(yytext));}
¤Ï-F¥Õ¥é¥°¤ò»È¤Ã¤Æ½èÍý¤¹¤Ù¤¤Ç¤¹¡£
¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢
¥¢¥¯¥·¥ç¥ó¤ÎÉôʬ¤ËREJECT¤ò»È¤¦¤³¤È¤¬¤Ç¤¤Ê¤¤ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
-Ce¤¬»È¤ï¤ì¤ë¤È¡¢
Flex¤ÏƱÅù¥¯¥é¥¹¡Êequivalence classes¡Ë¤òºîÀ®¤·¤Þ¤¹¡£
ƱÅù¥¯¥é¥¹¤È¤Ï¡¢Æ±°ì¤ÎÊýË¡¤Ç»È¤ï¤ì¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ç¤¹¡£
¤¿¤È¤¨¤Ð¡¢»È¤ï¤ì¤ë¿ô»ú¤¬½¸¹ç[0-9]¤ÎÈϰϤ˸ÂÄꤵ¤ì¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢
0¤«¤é9¤Þ¤Ç¤Î¿ô¤ÏƱÅù¥¯¥é¥¹¤ÎÃæ¤ËÃÖ¤«¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
-Cf¤¢¤ë¤¤¤Ï-CF¤ò»ØÄꤷ¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ÈÈæ³Ó¤·¤Æ¡¢
¥µ¥¤¥º¤â¤Ï¤ë¤«¤Ë¾®¤µ¤¯¤Ê¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
¥µ¥¤¥º¤Þ¤¿¤Ï¥¹¥Ô¡¼¥É¤Î°ìÊý¤òÍ¥À褵¤»¤ëɬÍפ¬¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢
¤³¤ì¤ÏÎɤ¤ÁȤ߹ç¤ï¤»¤Ç¤¹¡£
-C¥ª¥×¥·¥ç¥óñÂΤǤϡ¢Æ±Åù¥¯¥é¥¹¤ä¥á¥¿Æ±Åù¥¯¥é¥¹¤ò»È¤ï¤º¤Ë
¥Æ¡¼¥Ö¥ë¤ò°µ½Ì¤·¤Þ¤¹¡£
Ãí°Õ¡§-Cxx¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¾å¤Ë¤Ï1¤Ä¤À¤±
»ØÄꤹ¤Ù¤¤Ç¤¹¡£
¤È¤¤¤¦¤Î¤Ï¡¢¤³¤Î¤¦¤ÁºÇ¸å¤Ë¸«¤Ä¤«¤Ã¤¿¥ª¥×¥·¥ç¥ó¤À¤±¤¬¼ÂºÝ¤Î¸ú²Ì¤ò»ý¤Ä¤«¤é¤Ç¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢
flex -Cf -Cem foo.l
¤Ï¡¢Flex¤Ë-Cem¥ª¥×¥·¥ç¥ó¤ò»È¤ï¤»¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
Flex¤Î¥Ç¥Õ¥