Node:Introduction, Next:, Previous:Top, Up:Top

FlexÆþÌç

¤³¤Î¾Ï¤Ç¤Ï»ú¶ç¥¹¥­¥ã¥ó½èÍý¤Î³µÇ°¤òÀâÌÀ¤·¡¢Flex¤Î¤è¤¦¤Ê¥Ä¡¼¥ë¤Î ɬÍ×À­¤ò¼¨¤·¤Þ¤¹¡£ ËܾϤθåȾ¤Ç¤ÏFlex¤ò»È¤¦¤³¤È¤Î¤Ç¤­¤ë¾õ¶·¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£

Unix¤ª¤è¤ÓC¤ÎÀ¤³¦¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ë¤ÏÄ̾ï¸Ä¡¹¤Î¥Ð¥¤¥È¤¬Ï¢Â³¤·¤¿¤â¤Î¤È¤·¤Æ °·¤ï¤ì¤Þ¤¹¡£ ¸Ä¡¹¤Î¥Ð¥¤¥È¤ò½¸¤á¤Æ¤É¤Î¤è¤¦¤Ë¥°¥ë¡¼¥×²½¤¹¤ë¤«¤È¤¤¤¦ÅÀ¤Ï¡¢ ¥×¥í¥°¥é¥Þ¤¬·è¤á¤ë¤³¤È¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤ÊÃê¾Ý²½¤ÏÈó¾ï¤Ë¶¯ÎϤǤ¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢¤É¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë¤Ç¤¢¤Ã¤Æ¤â¤³¤ÎÃê¾Ý²½ÊýË¡¤Ë¤è¤Ã¤ÆÉ½¸½¤Ç¤­¤ë¤«¤é ¤Ç¤¹¡£ ¤·¤«¤·¤³¤ÎÊýË¡¤Ë¤Ïû½ê¤â¤¢¤ê¡¢¥×¥í¥°¥é¥Þ¤Ï¤Û¤È¤ó¤É¾ï¤ËÀ¸¤Î¥Õ¥¡¥¤¥ë¤ËÂФ·¤Æ ¹½Â¤¤ò¤¢¤Æ¤Ï¤á¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¸À¤¤´¹¤¨¤ë¤È¡¢¥Õ¥¡¥¤¥ë¤ò¤è¤ê°ÕÌ£¤Î¤¢¤ëÉôʬ¤Ëʬ³ä¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È ¤Ç¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¥³¥ó¥Ñ¥¤¥é¤Î¤¢¤ëÉôʬ¤Ï¥Õ¥¡¥¤¥ë¤«¤éϢ³¤·¤¿Ê¸»ú¤ò¼õ¤±¼è¤ê¡¢ ¹½Ê¸¥Á¥§¥Ã¥«¤¬Íý²ò¤¹¤ë¤³¤È¤Î¤Ç¤­¤ë¹½À®Í×ÁÇ¡¢ ¤¿¤È¤¨¤Ð¡¢¿ôÃÍ¡¢¥­¡¼¥ï¡¼¥É¡¢Ê¸»úÎó¤Ê¤É¤Ë¥°¥ë¡¼¥×²½¤·¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦Íýͳ¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¤Î¸À¸ì¥Ñ¡¼¥µ¤¬½èÍý¤ò¹Ô¤¦¤Î¤Ï¡¢Ï¢Â³¤·¤¿ ʸ»ú¤ËÂФ·¤Æ¤Ç¤Ï¤Ê¤¯¡¢¤½¤Î¸À¸ì¤Î¥·¥ó¥Ü¥ë¤¬Ï¢Â³¤·¤¿¤â¤Î¤ËÂФ·¤Æ¤À¤«¤é¤Ç¤¹¡£

¥Ç¡¼¥¿¥Ù¡¼¥¹¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¡¢¥Ð¥¤¥Ê¥ê¥Õ¥¡¥¤¥ë¤ò°·¤¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¡¢ °·¤¦¥Ç¡¼¥¿¤ËÂФ·¤Æ¤¢¤ë¸ÇÄꤵ¤ì¤¿¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¯¡¢ ¤½¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»È¤Ã¤ÆÆþÎϥǡ¼¥¿¤«¤é°ÕÌ£¤òƳ¤­½Ð¤·¤Þ¤¹¡£ ¥Æ¥­¥¹¥È¤òÆþÎϤ¹¤ë¥×¥í¥°¥é¥à¤ÏÄ̾盧¤ì¤È¤ÏÈ¿ÂФǡ¢ÆþÎϤòñ¸ì¤ä¥·¥ó¥Ü¥ë¤Ë ʬ³ä¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Î¤Ç¤¹¤¬¡¢Ä̾盧¤ì¤é¤Îñ¸ì¤ä¥·¥ó¥Ü¥ë¤¬ ¤É¤Î¤è¤¦¤ËÇÛÃÖ¤µ¤ì¤Æ¤¤¤ë¤«¤ò¼¨¤¹·è¤Þ¤Ã¤¿¹½Â¤¤È¤¤¤¦¤â¤Î¤Ï¸ºß¤·¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥Æ¥­¥¹¥È½èÍý¤ò¹Ô¤¦¥×¥í¥°¥é¥à¤Ï¡¢ÆþÎϤµ¤ì¤¿¾ðÊó¤ò°ÕÌ£¤Î¤¢¤ë ¥·¥ó¥Ü¥ë¤Ëʬ³ä¤¹¤ë¤¿¤á¤Ë¡¢»ú¶ç²òÀϤ⤷¤¯¤Ï»ú¶ç¥¹¥­¥ã¥ó¤È¸Æ¤Ð¤ì¤ë ½èÍý¤ò¹Ô¤¦Éôʬ¤ò»ý¤Ã¤Æ¤¤¤ë¤³¤È¤¬Â¿¤¯¡¢¤½¤³¤ÇÆþÎϾðÊó¤Îʬ³ä¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦´Ø¿ô·²¤Î¤³¤È¤ò»ú¶ç¥¢¥Ê¥é¥¤¥¶¤â¤·¤¯¤Ï»ú¶ç¥¹¥­¥ã¥Ê¡¢ ¤¢¤ë¤¤¤Ïû¤¯¡Ö¥¹¥­¥ã¥Ê¡×¤È¸Æ¤Ó¤Þ¤¹¡£

°ìÈÌŪ¤Ë¡¢¥¹¥­¥ã¥Ê¤òºîÀ®¤¹¤ë¤Î¤Ï¡¢ ¥×¥í¥°¥é¥Þ¤Ë¤È¤Ã¤ÆÆñ¤·¤¤¤³¤È¤Ç¤â¤ª¤â¤·¤í¤¤¤³¤È¤Ç¤â¤Ê¤¤¤Î¤Ç¤¹¤¬¡¢ »þ´Ö¤Î¤«¤«¤ëºî¶È¤Ë¤Ê¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤¹¡£ ÉáµÚ¤·¤Æ¤¤¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤Û¤È¤ó¤É¤Ï¡¢ ¥¹¥­¥ã¥Ê¤ÎºîÀ®¤ò»Ù±ç¤¹¤ëµ¡Ç½¤¬ÉÔ½½Ê¬¤Ç¤¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢Ï¢Â³¤·¤¿Ê¸»ú¤òñ¸ì¡¢¥È¡¼¥¯¥ó¡¢¥·¥ó¥Ü¥ë¤Ëʬ³ä¤¹¤ëÁȤ߹þ¤ß¤Îµ¡Ç½ ¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ Ä̾ï¤Ï¤³¤Î¤è¤¦¤Ê»Å»ö¤ò¹Ô¤¦¥é¥¤¥Ö¥é¥ê¥ë¡¼¥Á¥ó¤¬Â¸ºß¤·¤Þ¤¹¤¬¡¢ ½ÀÆð¤Ç¤Ê¤«¤Ã¤¿¤ê¡¢»È¤¤¤Ë¤¯¤«¤Ã¤¿¤ê¡¢¤¢¤ë¤¤¤Ï¡¢ ¥ë¡¼¥Á¥ó¤È¤Î¤ä¤ê¼è¤ê¤Ë¤¢¤Þ¤ê¤Ë¿¤¯¤Î¥³¡¼¥É¤¬É¬Íפˤʤ俤ꤹ¤ë¤³¤È¤¬Â¿¤¤¤¿¤á¤Ë¡¢ ¼ÂÁõ¾å¤ÎºÙ¤«¤ÊÅÀ¤Ë¤è¤Ã¤Æº¬ËÜŪ¤ÊÌäÂ꤬ÉÔÌÀÎÆ¤Ë¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

1¤Ä¤ÎÎɤ¤Î㤬¡¢C¸À¸ì¤Çµö¤µ¤ì¤Æ¤¤¤ë¤¹¤Ù¤Æ¤Î¿ôÃÍ·¿ ¡ÊÉâÆ°¾®¿ôÅÀ¡¢À°¿ô¡¢16¿Ê¿ô¡¢8¿Ê¿ô¡Ë ¤ò½èÍý¤¹¤ë¥¹¥­¥ã¥Ê¤òC¸À¸ì¤Çµ­½Ò¤¹¤ë¾ì¹ç¤Ç¤¹¡£ ¤³¤ì¤ÏÈó¾ï¤ËÆñ¤·¤¤¤È¤¤¤¦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ ¤Ç¤­¾å¤¬¤Ã¤¿¥³¡¼¥É¤ÏÄ̾ïÈþ¤·¤¤¤È¤Ï¤È¤Æ¤â¤¤¤¨¤Ê¤¤¤â¤Î¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤Ç¤·¤ç¤¦¤·¡¢ ¤½¤ÎÊݼé¤ä³ÈÄ¥¤ÏÍÆ°×¤Ç¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Î¤Ç¤¹¡£

¤Û¤È¤ó¤É¤Î¥×¥í¥°¥é¥Þ¤¬Â¨ºÂ¤ËÃǸÀ¤¹¤ë¤è¤¦¤Ë¡¢ ¾¿Í¤Î½ñ¤¤¤¿¥³¡¼¥É¤òÊݼ餹¤ë¤Î¤ÏÄ̾濫¤Þ¤ê³Ú¤·¤¤ºî¶È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¤µ¤é¤Ë¡¢Èþ¤·¤¯¤Ê¤¤¥³¡¼¥É¤òÊݼ餹¤ë¤Î¤Ï¡¢³Ú¤·¤¤¤È¤¤¤¦¤Ë¤Ï¤Û¤É±ó¤¤¤â¤Î¤Ç¤¹¡£ ¤³¤Î¤è¤¦¤Ë¡¢¥¹¥­¥ã¥Ê¤ò½ñ¤¯¤³¤È¤¬Âà¶þ¤Ç¡¢¤½¤ÎÊݼ餬Æñ¤·¤¤¤È¤Ê¤ë¤È¡¢ ¥¹¥­¥ã¥Ê¤ÎºîÀ®¤ò¤è¤êÍÆ°×¤Ë¤·¤Æ¤¯¤ì¤ëÊýË¡¤ò¹Í¤¨¤è¤¦¤È¤·¤¿Íýͳ¤¬ÆÉ¼Ô¤Ë¤â¤ª¤ï¤«¤ê ¤¤¤¿¤À¤±¤ë¤Ç¤·¤ç¤¦¡£


Node:Problem Solving, Next:, Up:Introduction

ÌäÂê²ò·è¼êÃʤȤ·¤Æ¤ÎFlex

Flex¤Ï¥×¥í¥°¥é¥Þ¤ËÂФ·¤Æ¡¢»ú¶ç²òÀϽèÍýÉôʬ¤ò¤­¤ì¤¤¤Ëµ­½Ò¤·¡¢ ¤½¤Îµ­½Ò¤Ë¤·¤¿¤¬¤Ã¤¿¸úΨŪ¤Ê»ú¶ç¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ëÊýË¡¤òÄ󶡤·¤Þ¤¹¡£ ¥×¥í¥°¥é¥Þ¤ÏFlex¤ËÂФ·¤Æ¡¢É¬Íפʥ¹¥­¥ã¥Ê¤Ë´Ø¤¹¤ëµ­½Ò¾ðÊó¤òÄ󶡤·¤Þ¤¹¡£ Flex¤Ï¤½¤Îµ­½Ò¾ðÊó¤ò»È¤Ã¤Æ¡¢C¸À¸ì¤Ç½ñ¤«¤ì¤¿¥¹¥­¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ µ­½Ò¤Ë»È¤ï¤ì¤ë¸À¸ì¤Ï¹âµé¸À¸ì¤Ç¤¢¤ê¡¢ ¥¹¥­¥ã¥Ê¤Îµ­½Ò¤Ë´Ø¤·¤Æ¤ÏC¸À¸ì¤è¤ê¤â¤Ï¤ë¤«¤ËŬ¤·¤Æ¤¤¤Þ¤¹¡£ ¤½¤Î¹âµé¸À¸ì¤ò»È¤¦¤³¤È¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢Ê¸»ú¤ò¤É¤Î¤è¤¦¤Ë¥°¥ë¡¼¥×²½¤·¡¢ ¥°¥ë¡¼¥×²½¤¬´°Î»¤·¤¿¤È¤­¤Ë¤É¤Î¤è¤¦¤Ê¥¢¥¯¥·¥ç¥ó¤òȯÀ¸¤µ¤»¤ë¤«¤ò»ØÄê¤Ç¤­¤Þ¤¹¡£

Ãí°Õ¡§Ëܽñ¤Î¤Û¤È¤ó¤É¤ÎÉôʬ¤ÏFlex¡¢Lex¤ÎξÊý¤òÂоݤˤ·¤Æ¤¤¤Þ¤¹¡£ Lex¤Ï¡ÊFlex¤Ë¤ÏÎô¤ê¤Þ¤¹¤¬¡Ë ¤Û¤È¤ó¤É¤ÎUnix¥·¥¹¥Æ¥à¾å¤Ë¤¢¤ëɸ½à¤Î¥¹¥­¥ã¥ÊÀ¸À®¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¹¡£ ξ¼Ô¤Î´Ö¤Ë°ã¤¤¤¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢Flex¤òÍ¥À褵¤»¤Æ¤¤¤Þ¤¹¡£ Lex¤Ë¤Ä¤¤¤Æ¤Ïɸ½àLex¤Ç´Êñ¤ËÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£

¤³¤³¤Ç¤â1¤Ä¤ÎÎɤ¤Î㤬¥³¥ó¥Ñ¥¤¥é¤Ç¤¹¡£ Á°½Ò¤Î¤è¤¦¤Ë¡¢¥³¥ó¥Ñ¥¤¥é¤Î¹½Ê¸¥Á¥§¥Ã¥«¤Ï¡¢Ê¸»ú¤¬Ï¢Â³¤·¤¿¤â¤Î¤Ç¤Ï¤Ê¤¯¡¢ ¸À¸ìʸˡ¤Î¹½À®Í×ÁǤòɽ¤¹¥È¡¼¥¯¥ó¤¬Ï¢Â³¤·¤¿¤â¤Î¤ò¡¢ ÆþÎϤȤ·¤Æ¼õ¤±¼è¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ Flex¤Ï¤³¤Î¤è¤¦¤Ê¾ì¹ç¤ËºÇŬ¤Ç¤¹¡£ Flex¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤¬¹½Ê¸¥Á¥§¥Ã¥«¤È¥Õ¥¡¥¤¥ë¤ÎÃç²ðÌò¤È¤Ê¤ê¡¢ ¹½Ê¸¥Á¥§¥Ã¥«¤¬¼¡¤Î°ÕÌ£¤Î¤¢¤ë¥È¡¼¥¯¥ó¤òÍ׵᤹¤ë¤Î¤òÂÔ¤Á¤Þ¤¹¡£ Flex¤Ï¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¡¢¥×¥í¥°¥é¥Þ¤¬Í¿¤¨¤ëµ­½Ò¤Ë¤·¤¿¤¬¤Ã¤ÆÊ¸»ú¤ò¥°¥ë¡¼¥×²½¤·¤Æ¡¢ ¥Þ¥Ã¥Á¤·¤¿¥È¡¼¥¯¥ó¤òÊÖ¤·¤Þ¤¹¡£ ¤³¤Î½èÍý¤Ï¡¢¥¹¥­¥ã¥Ê¤â¤·¤¯¤Ï¥Ñ¡¼¥µ¤¬½ªÎ»¤¹¤ë¤Þ¤Ç³¤­¤Þ¤¹¡£

C¤Î¥³¥ó¥Ñ¥¤¥é¤òºîÀ®¤¹¤ë¾ì¹ç¡¢ ¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¹Ô¤¦¤¿¤á¤ËɬÍפȤʤëFlex¤Îµ­½Ò¾ðÊó¤Ï¡¢ ¥³¡¼¥É¤Î¹Ô¿ô¤Ë¤·¤Æ100¡Á300¹Ô¤°¤é¤¤¤Ë¤Ê¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ ¤³¤Îµ­½Ò¾ðÊó¤Î¤Û¤È¤ó¤É¤Ï¡¢ ¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î´ÉÍý¡¢¼±Ê̻Ҥθ¡º÷¡¢·¿¤Î¥Þ¥Ã¥Ô¥ó¥°¡¢¤¢¤ë¿ô¤ÎÃͤʤɤÎÄɲþðÊó¤ÎÊֵѤò¹Ô¤¦¤¿¤á¤ÎÊä½õŪ¤ÊC¥³¡¼¥É¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£ ¤³¤¦¤·¤¿¥³¡¼¥É¼«ÂΤϵ­½Ò¾ðÊó¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ Ä̾¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÉ¬ÍפȤµ¤ì¤ë¤â¤Î¤Ç¤¹¡£

³µÇ°Åª¤Ë¤ÏFlex¤Ï¡¢¸¶ºàÎÁ¡Êʸ»ú¡Ë¤ò¼è¤ê¹þ¤ß¡¢ ¾ÃÈñ¼Ô¡Ê¥Ñ¡¼¥µÅù¡Ë¤¬¤¹¤°¤Ë»È¤¦¤³¤È¤¬¤Ç¤­¤ë´°À®Éʡʥȡ¼¥¯¥ó¡Ë¤òÀ½Â¤¤¹¤ë¹©¾ì¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£


Node:General Programming, Previous:Problem Solving, Up:Introduction

°ìÈÌŪ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¥Ä¡¼¥ë¤È¤·¤Æ¤ÎFlex

Flex¤Ï¥³¥ó¥Ñ¥¤¥é¤Ë¤·¤«»È¤¨¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ÆÉ¼Ô¤Î¥³¥ó¥Ô¥å¡¼¥¿¾å¤Ë¤¢¤ë¡¢¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ó¤À¤ê¡¢ ¤Ê¤ó¤é¤«¤Î·Á¤Çʸ»ú¤Î¥°¥ë¡¼¥×¤ò½èÍý¤¹¤ëɬÍפΤ¢¤ë¤¹¤Ù¤Æ¤Î¥×¥í¥°¥é¥à¡¢ ÆÃ¤Ë¡¢ÊÑ´¹¥Õ¥£¥ë¥¿¤ä¸À¸ì¥Ä¡¼¥ë¤Î¤³¤È¤ò¹Í¤¨¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤¦¤·¤¿¥×¥í¥°¥é¥à¤Î¤Û¤È¤ó¤É¤¹¤Ù¤Æ¤ò¡¢ FlexñÂΡ¢¤â¤·¤¯¤ÏFlex¤È¾¤Î¥Ä¡¼¥ë¤ÎÁȤ߹ç¤ï¤»¤Ë¤è¤Ã¤ÆºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

Îɤ¤Îã¤Î1¤Ä¤¬Ê¸»ú¿ô¤Î¥«¥¦¥ó¥È¤Ç¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¥Õ¥¡¥¤¥ë¤ÎÃæ¤ÎÁ´¹Ô¿ô¡¢¸Ä¡¹¤Îʸ»ú¤Î½Ð¸½²ó¿ô¡¢ foo¤È¤¤¤¦Ã±¸ì¤Î½Ð¸½²ó¿ô¤òÄ´¤Ù¤ë¥×¥í¥°¥é¥à¤òºîÀ®¤·¤¿¤¤¾ì¹ç¤Ç¤¹¡£ ɸ½àŪ¤Ê¥Ä¡¼¥ë¡Êgrep¡¢sed¡¢awk¡¢perlÅù¡Ë ¤ÇºîÀ®¤¹¤ë¤³¤È¤â¡¢C¸À¸ì¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤ÆºîÀ®¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¤¬¡¢ Flex¤ÇºîÀ®¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ ¤â¤¦1¤Ä¤ÎÎã¤È¤·¤Æ¡¢ÆÃÄê¤Î¥­¡¼¥ï¡¼¥É¤òõ¤¹É¬ÍפΤ¢¤ë¡¢¥á¡¼¥ë¥ê¡¼¥À¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¾ì¹ç¤Ç¤â¡¢É¸½à¥Ä¡¼¥ë¤Ç¼Â¸½¤¹¤ë¤³¤È¤â¡¢Flex¤ÈC¸À¸ì¤Ç¼Â¸½¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£

Flex¤ò»È¤¦¤³¤È¤Ç¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢ ¥¹¥­¥ã¥Ê¤Î³«È¯¤ä¥Õ¥¡¥¤¥ë¤ò¹½À®¤¹¤ëʸ»ú¤Î½èÍý¤Ë¤«¤«¤ë»þ´Ö¤òÂçÉý¤Ë¸º¤é¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¤Û¤È¤ó¤É¤Î¾ì¹ç¡¢Flex¤ËÂФ¹¤ëÆþÎϾðÊó¤Ï¡¢ ´û¸¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Çµ­½Ò¤µ¤ì¤¿¥³¡¼¥É¤ÈÈæ³Ó¤·¤Æ¡¢ ¤è¤êÍý²ò¤·¤ä¤¹¤¯¡¢¾¯¤Ê¤¯¤È¤âÆ±ÄøÅ٤ΰܿ¢À­¤¬¤¢¤ê¡¢Êݼé¤â¤è¤ê´Êñ¤Ç¤¹¡£ ¤½¤ì¤À¤±¤Ç¤Ê¤¯¡¢Flex¤Ç¥¹¥­¥ã¥Ê¤ò³«È¯¤¹¤ë¤Î¤Ë¤«¤«¤ë»þ´Ö¤Ï¡¢ ´û¸¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÇƱÅù¤Î¥¹¥­¥ã¥Ê¤ò³«È¯¤¹¤ë¾ì¹ç¤ÈÈæ¤Ù¤­¤ï¤á¤ÆÃ»¤¯¤Æ¤¹¤à¤Î¤Ç¡¢ Flex¤Ï¡¢¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤ä¡¢ °ìÅÙ¤·¤«»È¤ï¤Ê¤¤¥×¥í¥°¥é¥à¤ä¥Õ¥£¥ë¥¿¤Î³«È¯¤ËºÇŬ¤Ç¤¹¡£


Node:Invoking Flex, Next:, Previous:Introduction, Up:Top

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¤Ë½ÐÎϤ·¤Þ¤¹¡£


Node:Command Line Switches, Next:, Up:Invoking Flex

¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó

Flex¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ï°Ê²¼¤Î¤è¤¦¤Ê°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£

-b
-b¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤Èlex.backtrack¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¥¹¥­¥ã¥Ê¤Îµ­½Ò¾ðÊó¤òºÇŬ²½¤¹¤ëºÝ¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Optimizing for Speed¡£
-c
¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏPOSIX¤È¤Î¸ß´¹À­¤Î¤¿¤á¤ËÄ󶡤µ¤ì¤Æ¤¤¤ë¤À¤±¤Ç¡¢ ¼ÂºÝ¤Ë¤Ï²¿¤â¤·¤Þ¤»¤ó¡£ POSIX¤Ç¤Ï¡¢ -c¥ª¥×¥·¥ç¥ó¤ÏC¸À¸ì¤Ë¤è¤ë¥¢¥¯¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
-d
¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¥Ç¥Ð¥Ã¥°¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤³¤ì¤Ë¤è¤êÀ¸À®¤µ¤ì¤ë¥¹¥­¥ã¥Ê¤Ï¡¢ ¼Â¹ÔÃæ¤Ë¥¹¥­¥ã¥Ê¤Î¾õÂÖ¾ðÊó¤òstderr¤Ë½ÐÎϤ·¤Þ¤¹¡£
-f
Flex¤ËÂФ·¤Æ¥Õ¥¡¥¹¥È¥¹¥­¥ã¥Ê¡Êfast scanner¡Ë¤È¥Õ¥ë¥¹¥­¥ã¥Ê¡Êfull scanner¡Ë¤Î¤É¤Á¤é¤òÀ¸À®¤¹¤ë¤«¤ò»Ø¼¨¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Table Compression and Scanner Speed¡£ -f¡Ê¾®Ê¸»ú¡Ë¥ª¥×¥·¥ç¥ó¤È-F¡ÊÂçʸ»ú¡Ë¥ª¥×¥·¥ç¥ó¤È¤Ï°Û¤Ê¤ë¸ú²Ì¤ò»ý¤ÄÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
-i
Flex¤ËÂФ·¤ÆÂçʸ»ú¡¢¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Case Insensitive Scanners¡£
-n
¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏFlex¤Ë¤È¤Ã¤Æ¤Ï¤Ê¤ó¤Î°ÕÌ£¤â»ý¤¿¤º¡¢ POSIX¤È¤Î¸ß´¹À­¤Î¤¿¤á¤Ë¤Î¤ßÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ POSIX¤Ç¤Ï¡¢ ¤³¤Î¥Õ¥é¥°¤Ï-v¥ª¥×¥·¥ç¥ó¤Ë¤è¤ë½ÐÎϤòÍÞÀ©¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ POSIX¤Ç¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¡¢ ¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤¬»ØÄꤵ¤ì¤Ê¤¤¤«¤®¤ê¤³¤Î¤è¤¦¤Ê½ÐÎϤòÍÞÀ©¤·¤Þ¤¹¡£ Flex¤Ç¤Ï¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤Ï°ÕÌ£¤ò»ý¤¿¤Ê¤¤¤Î¤Ç¡¢¤³¤Î¥Õ¥é¥°¤Ï¾éŤǤ¹¡£
-p
-p¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤ë¤È¡¢ Flex¤ÏÀ­Ç½¥ì¥Ý¡¼¥È¤òstderr¤Ë½ÐÎϤ·¤Þ¤¹¡£ ¥¹¥­¥ã¥Ê¤ÎÀ­Ç½¤ò¸þ¾å¤µ¤»¤ëÊýË¡¤Ë´Ø¤¹¤ë²òÀâ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ See Optimizing for Speed¡£
-s
Flex¥¹¥­¥ã¥Ê¤¬¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò¸«¤Ä¤±¤é¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Î¥Ç¥Õ¥©¥ë¥È¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ ¤½¤Î¥Þ¥Ã¥Á¤µ¤ì¤Ê¤«¤Ã¤¿ÆþÎϾðÊó¤òstdout¤Ë½ÐÎϤ¹¤ë¤³¤È¤Ç¤¹¡£ -s¥ª¥×¥·¥ç¥ó¤Ï¤³¤Î¤è¤¦¤Ê¥¢¥¯¥·¥ç¥ó¤òÍÞÀ©¤·¡¢ ¤½¤ÎÂå¤ï¤ê¤ËÆþÎϾðÊ󤬥ޥåÁ¤·¤Ê¤«¤Ã¤¿»þÅÀ¤Ç¥¹¥­¥ã¥Ê¤ò°Û¾ï½ªÎ»¤µ¤»¤Þ¤¹¡£
-t
¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢ Flex¤ÏÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤ò¥Õ¥¡¥¤¥ëlex.yy.c¤Ë¤Ç¤Ï¤Ê¤¯stdout¤Ë½ÐÎϤ·¤Þ¤¹¡£
-v
Flex¤ËÂФ·¤Æ¾éĹ¥â¡¼¥É¤Çưºî¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
-F
Flex¤ËÂФ·¤Æ¥Õ¥¡¥¹¥È¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See ¥¹¥­¥ã¥Ê¤ÎºÇŬ²½¡£ -F¡ÊÂçʸ»ú¡Ë¤Ï-f¡Ê¾®Ê¸»ú¡Ë¤È¤Ï°Û¤Ê¤ë¸ú²Ì¤ò»ý¤ÄÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ -f¤È-F¤ÎÁê°ãÅÀ¤Ë´Ø¤¹¤ë¾ðÊó¤Ë¤Ä¤¤¤Æ¤Ï¡¢ See Table Compression and Scanner Speed¡£
-I
¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏFlex¤ËÂФ·¤ÆÂÐÏ÷¿¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Interactive Scanners¡£
-L
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥Ç¥Ð¥Ã¥°¤ò»Ù±ç¤¹¤ë¤¿¤á¤Ë¡¢ Flex¤ÏÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤Î¥³¡¼¥ÉÃæ¤Ë#line»Ø¼¨»Ò¤ò½ñ¤­¹þ¤ß¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤Æ#line»Ø¼¨»Ò¤Î½ñ¤­¹þ¤ß¤Ï¹Ô¤ï¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£
-T
Flex¤ËÂФ·¤Æ¥È¥ì¡¼¥¹¥â¡¼¥É¤Çưºî¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ Flex¤Ï¿¤¯¤Î¥á¥Ã¥»¡¼¥¸¤òstderr¤Ë½ÐÎϤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤³¤¦¤·¤¿¥á¥Ã¥»¡¼¥¸¤Ï¡¢ Flex¤òÈó¾ï¤Ë¤è¤¯Íý²ò¤·¤Æ¤¤¤ë¥æ¡¼¥¶¡¼°Ê³°¤Ë¤Ï̵°ÕÌ£¤Ç¤·¤ç¤¦¡£
-8
¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ Flex¤ËÂФ·¤Æ8¥Ó¥Ã¥ÈÆþÎϤò¼õ¤±ÉÕ¤±¤ë¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
-C[efmF]
¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ ¥¹¥­¥ã¥ó½èÍýÍѤΥơ¼¥Ö¥ë¤ò¤É¤Î¤è¤¦¤Ë°µ½Ì¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See ¥¹¥­¥ã¥Ê¤ÎºÇŬ²½¡£
-Sskeleton_file
Flex¤ËÂФ·¤Æ¡¢ À¸À®¤¹¤ë¥¹¥­¥ã¥Ê¤Î¥Ù¡¼¥¹¤È¤·¤Æskeleton_file¤Ë¤è¤ê»ØÄꤵ¤ì¤ë¥¹¥±¥ë¥È¥ó¥Õ¥¡¥¤¥ë¤ò»ÈÍѤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¼ç¤Ë¡¢Flex¼«ÂΤò¥Ç¥Ð¥Ã¥°¤¹¤ë¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£


Node:Command Line Switches (Flex 2.5), Previous:Command Line Switches, Up:Invoking Flex

¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

Flex 2.5¤Ç¤Ï¡¢Á°Àá¡ÊCommand Line Switches¡Ë¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢ °Ê²¼¤Î¥ª¥×¥·¥ç¥ó¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

-h
Flex¤ËÂФ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ÎÍ×Ìó¾ðÊó¤ò½ÐÎϤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
-l
AT&T¤Ë¤è¤ê¼ÂÁõ¤µ¤ì¤¿lex¤È¤Î¸ß´¹À­¤òºÇÂç¸Â¤ËÄ󶡤·¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢À­Ç½Ì̤Ǥ«¤Ê¤ê¤Î°­±Æ¶Á¤òµÚ¤Ü¤·¤Þ¤¹¡£ ¤Þ¤¿¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ò¡¢-f¡¢-F¡¢-Cf¡¢-CF¡¢ -+¥ª¥×¥·¥ç¥ó¤ÈƱ»þ¤Ë»ØÄꤹ¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ Flex¤ÈLex¤Î¡ÊÈó¡Ë¸ß´¹À­¤ÎÌäÂê¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and Lex¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
-w
¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤ë¤È¡¢Flex¤Ï·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤»¤ó¡£
-B
Flex¤ËÂФ·¤Æ¥Ð¥Ã¥Á¥¹¥­¥ã¥Ê¡Êbatch scanner¡Ë¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢ÂÐÏ÷¿¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤¹¤ë-I¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê¤Ç¤¹¡£
-V
Flex¤ËÂФ·¤Æ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò½ÐÎϤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£
-7
Flex¤ËÂФ·¤Æ7¥Ó¥Ã¥È¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¤³¤ì¤Ï-8¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê¤Ç¤¹¡£ ÆâÉôŪ¤ËÀ¸À®¤µ¤ì¤ë¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤Ï-8¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¤È Èæ³Ó¤·¤ÆÈ¾Ê¬¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢À¸À®¤µ¤ì¤ë¥¹¥­¥ã¥Ê¤Ï¡¢8¥Ó¥Ã¥Èʸ»ú¤ò´Þ¤àÆþÎϤò½èÍý ¤Ç¤­¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ -Cf¡¢-CF¤¬»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢ ÌÀ¼¨Åª¤Ë-7¤ò»ØÄꤷ¤Ê¤¤¤«¤®¤ê¡¢8¥Ó¥Ã¥È¥¹¥­¥ã¥Ê¤¬À¸À®¤µ¤ì¤Þ¤¹¡£
-+
Flex¤ËÂФ·¤ÆC++¥¹¥­¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ C++¥¹¥­¥ã¥Ê¤Ë¤Ä¤¤¤Æ¤Ï¡¢Flex and C++ (Flex 2.5)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
-?
Flex¤ËÂФ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ÎÍ×Ìó¾ðÊó¤ò½ÐÎϤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹ ¡Ê-h¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£
-Ca
¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢¥¹¥­¥ã¥ó½èÍýÍѤΥơ¼¥Ö¥ë¤òlong int¤ÎÇÛÎó¤È¤·¤ÆÄêµÁ ¤¹¤ë¤è¤¦Flex¤ËÄÌÃΤ·¤Þ¤¹¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïshort int·¿¤ÎÇÛÎó¤È¤Ê¤ê¤Þ¤¹¡Ë¡£ RISC¥Þ¥·¥ó¤Ë¤è¤Ã¤Æ¤Ï¡¢long int¤Î¤Û¤¦¤¬¹â®¤Ë½èÍý¤µ¤ì¤ë¤¿¤á¡¢¥¹¥­¥ã¥Ê ¤ÎÀ­Ç½¸þ¾å¤¬´üÂԤǤ­¤Þ¤¹¤¬¡¢¤½¤ÎÈ¿ÌÌ¡¢¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤ÏÂ礭¤¯¤Ê¤ê¤Þ¤¹¡£
-Cr
¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤Ï¡¢ ÆþÎϤËread()¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»È¤¤¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ÂÐÏ÷¿¥¹¥­¥ã¥Ê¤Î¾ì¹ç¤Ïgetc()¤¬¡¢ ¥Ð¥Ã¥Á¡ÊÈóÂÐÏ÷¿¡Ë¥¹¥­¥ã¥Ê¤Î¾ì¹ç¤Ïfread()¤¬»È¤ï¤ì¤Þ¤¹¡£
-ofile
¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤ë¤È¡¢Flex¤ÏÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤òfile¤Ë¤è¤Ã¤Æ »ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢¥¹¥­¥ã¥Ê¤Ï¥Õ¥¡¥¤¥ëlex.yy.c¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
-Pprefix
Flex¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¥¹¥­¥ã¥Ê¤Î¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï¡¢ Âç°èÊÑ¿ô¤äÂç°è´Ø¿ô¤Î̾Á°¤ÎÀèÆ¬¤ËÀÜÆ¬¼­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)¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

--help
Flex¤ËÂФ·¤Æ¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤ÎÍ×Ìó¾ðÊó¤ò½ÐÎϤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹ ¡Ê-h¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£
--version
Flex¤ËÂФ·¤Æ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò½ÐÎϤ¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹ ¡Ê-V¥ª¥×¥·¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¡Ë¡£


Node:Flex Descriptions, Next:, Previous:Invoking Flex, Up:Top

Flexµ­½Ò¸À¸ì

¤³¤Î¾Ï¤Ç¤Ï¡¢¥¹¥­¥ã¥ÊÄêµÁ¤Î¹½À®Í×ÁǤòÀâÌÀ¤·¡¢¤½¤Î»ÈÍÑÎã¤ò¼¨¤·¤Þ¤¹¡£ Flex¤ò¸úΨŪ¤Ë»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢ ÄêµÁ¤Î¸Ä¡¹¤ÎÍ×ÁǤò´°Á´¤ËÍý²ò¤¹¤ë¤³¤È¤¬Èó¾ï¤Ë½ÅÍפǤ¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢½é¤á¤ÆFlex¤ò»È¤¦¥æ¡¼¥¶¡¼¤Ï¡¢ »þ´Ö¤ò¤«¤±¤ÆËܾϤòÆÉ¤à¤³¤È¤ò¤ª¤¹¤¹¤á¤·¤Þ¤¹¡£

Flex¥¹¥­¥ã¥ÊÄêµÁ¤Î¤Û¤È¤ó¤É¤ÎÍ×ÁǤϡ¢Ç¤°Õ¤Ç¤¹¡£ Á´ÂÎŪ¤ÊÄêµÁ¥Õ¥©¡¼¥Þ¥Ã¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

ÄêµÁ¤È½é´üC¥³¡¼¥É
%%
¥ë¡¼¥ë
%%
¾¤ÎC¥³¡¼¥É

¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤Æ¡¢°Ê²¼¤Ë¤ª¤¤¤Æ¾ÜºÙ¤ËÀâÌÀ¤·¤Þ¤¹¡£


Node:Comments, Next:, Up:Flex Descriptions

¥³¥á¥ó¥È

C¤Î¥³¡¼¥É¤òµ­½Ò¤Ç¤­¤ë¤È¤³¤í¤Ë¤Ï¡¢¤É¤³¤Ë¤Ç¤â¥³¥á¥ó¥È¤òµ­½Ò¤Ç¤­¤Þ¤¹¡£ ¥³¥á¥ó¥È¤Î½ñ¼°¤Ï¡¢C¤Î¥³¥á¥ó¥È¤Îµ¬Â§¤Ë½¾¤¤¤Þ¤¹¡£ ¥³¥á¥ó¥È¤Ï¡¢µ­½Ò¾ðÊó¤Ë±Æ¶Á¤òµÚ¤Ü¤¹¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£ C¥¹¥¿¥¤¥ë¤Î¥³¥á¥ó¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

/*
...
*/

¤³¤ì¤Ë²Ã¤¨¤Æ¡¢Flex¤Ç¤Ï#¤Ç»Ï¤Þ¤ë¥³¥á¥ó¥È¤âµö¤µ¤ì¤Þ¤¹¡£ ¤·¤«¤·¡¢¤³¤Î¤è¤¦¤Ê¥³¥á¥ó¥È¤Ïlex.yy.c¤Ë¤Ï¥³¥Ô¡¼¤µ¤ì¤Ê¤¤¤Î¤Ç¡¢ ¤³¤Î·Á¼°¤Î¥³¥á¥ó¥È¤Î»ÈÍѤϤª¤¹¤¹¤á¤Ç¤­¤Þ¤»¤ó¡£

Ãí°Õ¡§C°Ê³°¤Î¸À¸ì¡Ê¤¿¤È¤¨¤ÐPascal¡Ë ¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ëLex¤â¸ºß¤·¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤ÊLex¤Ç¤Ï¥³¥á¥ó¥È¤Î½ñ¼°¤Ï¤ª¤½¤é¤¯°Û¤Ê¤ë¤Ç¤·¤ç¤¦¡£ Flex¤Î¾ì¹ç¤ÏC¤Î¥³¡¼¥É¤·¤«À¸À®¤·¤Þ¤»¤ó¡£


Node:Optional C Code, Next:, Previous:Comments, Up:Flex Descriptions

¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥É

¥×¥í¥°¥é¥Þ¤Ï¡¢2¤Ä¤Î°Û¤Ê¤ëÊýË¡¤òÍѤ¤¤Æ¡¢ ¥¹¥­¥ã¥Ê¤ÎÃæ¤ËľÀÜC¤Î¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ Âè1¤ÎÊýË¡¤Ï¡¢¡ÖÄêµÁ¤È½é´üC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó ¡ÊºÇ½é¤Î%%¤è¤êÁ°¤ÎÉôʬ¡Ë¤Ë¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤Ç¤¹¡£ Âè2¤ÎÊýË¡¤Ï¡¢¡Ö¾¤ÎC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó ¡Ê2ÈÖÌܤÎ%%¤è¤ê¸å¤í¤ÎÉôʬ¡Ë¤Ë¥³¡¼¥É¤ò´Þ¤á¤ë¤³¤È¤Ç¤¹¡£ ¤É¤Á¤é¤Î¾ì¹ç¤â¡¢¥³¡¼¥É¤Ï¤½¤Î¤Þ¤Þlex.yy.c¤Ë¥³¥Ô¡¼¤µ¤ì¤ë¤Î¤Ç¡¢ ÀµÅö¤Ê¥³¡¼¥É¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£

Âè1¤Î¥»¥¯¥·¥ç¥óÃæ¤ÎC¥³¡¼¥É¤Ï°Ê²¼¤Î·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£

%{
   C¥³¡¼¥É
   ...
%}

¤³¤³¤Ç%{...%}¤È¤¤¤¦¥Ú¥¢¤¬¡¢ C¥³¡¼¥É¥Ö¥í¥Ã¥¯¤ÎÀèÆ¬¤ÈËöÈø¤ò¼¨¤¹¤¿¤á¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î·Á¼°¤Î¥³¡¼¥É¤ÈÄêµÁ¤Ï¡¢¡ÖÄêµÁ¤È½é´üC¥³¡¼¥É¡×¥»¥¯¥·¥ç¥ó¤Î¤É¤³¤Ë¤Ç¤â ¼«Í³¤Ëµ­½Ò¤Ç¤­¤Þ¤¹¡£ ÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ï¼¡¤ÎÀá¤ÇÀâÌÀ¤·¤Þ¤¹¡£

C¤Î¥³¡¼¥É¤¬ºÇ½é¤Î¥«¥é¥à¤«¤é»Ï¤Þ¤ë¤Î¤Ç¤Ê¤±¤ì¤Ð¡¢ %{...%}¤È¤¤¤¦¥Ú¥¢¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£ ¤·¤«¤·ÉáÄ̤ϡ¢¤ï¤«¤ê¤ä¤¹¤¯¤¹¤ë¤¿¤á¤Ëµ­½Ò¤·¤Æ¤ª¤¤¤¿¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£ ¤â¤¦1¤Ä¤Î¥Ý¥¤¥ó¥È¤Ï¡¢#ifdef¤Ê¤É¤Î¤è¤¦¤ËºÇº¸Ã¼¤Î¥«¥é¥à¤«¤é»Ï¤Þ¤é¤Ê¤±¤ì¤Ð ¤Ê¤é¤º¡¢¤«¤Ä¡¢Ä̾ï¤Ï¥¹¥­¥ã¥Êµ­½Ò¾ðÊó¤ÎÀèÆ¬¤ËÃÖ¤«¤ì¤ëɬÍפΤ¢¤ë¤â¤Î¤¬Â¸ºß¤¹¤ë ¤È¤¤¤¦ÅÀ¤Ç¤¹¡£ ¤³¤¦¤·¤¿¾ì¹ç¡¢%{...%}¤Ë°Ï¤Þ¤ì¤Æ¤¤¤Ê¤¤¤È¡¢ Flex¤Ï¤½¤ì¤òÄêµÁ¤Î°ìÉô¤Ç¤¢¤ë¤È¤ß¤Ê¤¹¤Ç¤·¤ç¤¦¡£ ¤³¤ì¤¬¡¢¾ï¤Ë%{...%}¤ò»È¤¦¤â¤¦1¤Ä¤ÎÍýͳ¤Ç¤¹¡£

ºÇ¸å¤Î¡Ê¡Ö¾¤ÎC¥³¡¼¥É¡×¡Ë¥»¥¯¥·¥ç¥óÆâ¤Î¥³¡¼¥É¤Ï¡¢¤½¤Î¤Þ¤Þ¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ¤³¤³¤Ë¤ÏÆÃÊ̤ÊÀë¸À¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£


Node:Definitions, Next:, Previous:Optional C Code, Up:Flex Descriptions

ÄêµÁ

ÄêµÁ¥»¥¯¥·¥ç¥ó¤Ë¤ª¤¤¤Æ¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢¤¢¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ë°ì°Õ¤Ê¼±Ê̻ҤòÍ¿¤¨¡¢ ¤½¤Î¼±Ê̻Ҥ¬¤½¤Îʸ»ú¥°¥ë¡¼¥×¤ËÃÖ¤­´¹¤¨¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ÄêµÁ¤Ï°Ê²¼¤Î¤è¤¦¤Ê·Á¼°¤Ë¤Ê¤ê¤Þ¤¹¡£

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¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:%%, Next:, Previous:Definitions, Up:Flex Descriptions

%%

2¤Ä¤Î¥Ñ¡¼¥»¥ó¥Èµ­¹æ¤¬¡¢¥¹¥­¥ã¥Êµ­½Ò¾ðÊó¤Î¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤ÎÀèÆ¬¤ÈËöÈø ¤ò¼¨¤·¤Þ¤¹¡£ ¤¹¤Ù¤Æ¤ÎFlexµ­½Ò¾ðÊó¤Ï¡¢¾¯¤Ê¤¯¤È¤â¥ë¡¼¥ë¥»¥¯¥·¥ç¥ó¤ÎÀèÆ¬¤ò¼¨¤¹ %%¤ò´Þ¤ó¤Ç¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£


Node:Rules, Next:, Previous:%%, Up:Flex Descriptions

¥ë¡¼¥ë

¥ë¡¼¥ë¤ÏFlex¤Î¿´Â¡Éô¤Ç¤¹¡£ ¥ë¡¼¥ë¤ò½ñ¤¯¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥×¥í¥°¥é¥Þ¤Ï¡¢ ¥¹¥­¥ã¥Ê¤¬²¿¤ò¼Â¹Ô¤¹¤ë¤Ù¤­¤Ç¤¢¤ë¤«¤òFlex¤ËÄÌÃΤ·¤Þ¤¹¡£

Ä̾¥ë¡¼¥ë¤Ï2¤Ä¤ÎÉôʬ¤«¤é¹½À®¤µ¤ì¤Þ¤¹¡£

pattern       actions

¤³¤Î¤¦¤Ápattern¤¬²¿¤òǧ¼±¤¹¤ë¤Ù¤­¤«¤òÄêµÁ¤·¡¢ actions¤¬¤½¤Î²¿¤«¤òǧ¼±¤·¤¿¤È¤­¤Ë²¿¤ò¼Â¹Ô¤¹¤ë¤Ù¤­¤Ç¤¢¤ë¤« ¤ò¥¹¥­¥ã¥Ê¤ËÃΤ餻¤Þ¤¹¡£ pattern¤ÎÉôʬ¤Ï¶õÇò¤Ë¤è¤Ã¤Æ¶èÀÚ¤é¤ì¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢¶õÇò¤ò¥Þ¥Ã¥Á¤µ¤»¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ ¤½¤ì¤ò°úÍÑÉä¤Ç°Ï¤àɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£

¥¹¥­¥ã¥Ê¤Ï¡¢¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò2¤Ä°Ê¾å¸«¤Ä¤±¤¿¾ì¹ç¡¢ °Ê²¼¤Î2¤Ä¤Î¥ë¡¼¥ë¤ò»È¤Ã¤Æ¤É¤ì¤ò¼õ¤±Æþ¤ì¤ë¤«¤ò·è¤á¤Þ¤¹¡£

  1. ¸å³¥³¥ó¥Æ¥­¥¹¥È¡Êtrailing context¡Ë¤â´Þ¤á¤Æ¤â¤Ã¤È¤âŤ¤¤â¤Î¤ò¼õ¤±Æþ¤ì¤ë¡£
  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¤Ë½ÐÎϤ·¤Þ¤¹¡£


Node:Pattern Matching, Next:, Previous:Rules, Up:Flex Descriptions

¥Ñ¥¿¡¼¥ó¥»¥¯¥·¥ç¥ó

¥Ñ¥¿¡¼¥ó¥»¥¯¥·¥ç¥ó¤Ï¡¢Àµµ¬É½¸½¤È¸Æ¤Ð¤ì¤ë»ÅÁȤߤò»È¤Ã¤Æ¼ÂºÝ¤Î ¥Þ¥Ã¥Á¥ó¥°½èÍý¤ò¼Â¹Ô¤·¤Þ¤¹¡£ Àµµ¬É½¸½¤Ï¡¢Ê¸»úÎó¡¢Ê¸»ú¡¢Ê¸»ú½¸¹ç¡Ê¥¯¥é¥¹¡Ë¡¢ ¤ª¤è¤Ó±é»»»Ò¤«¤é¹½À®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ Àµµ¬É½¸½¤ò¹½À®¤¹¤ëÍ×ÁǤˤĤ¤¤Æ¤Ï¼¡Àá°Ê¹ß¤ÇÀâÌÀ¤·¤Þ¤¹¡£ ¤Þ¤¿Àµµ¬É½¸½¼«ÂΤˤĤ¤¤Æ¤Ï¡¢Regular Expressions¤Ë¤ª¤¤¤Æ²òÀ⤷¤Þ¤¹¡£


Node:Characters, Next:, Up:Pattern Matching

ʸ»ú

¤¤¤¯¤Ä¤«¤Îʸ»ú¤Ï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¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£

/
¥¹¥é¥Ã¥·¥å¤Ï¸å³¥³¥ó¥Æ¥­¥¹¥È¤òÀßÄꤷ¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢¤¢¤ë¥Ñ¥¿¡¼¥ó¤Î¸å¤í¤ËÆÃÄê¤Îʸ»ú¤ÎʤӤ¬Â³¤¯¾ì¹ç¤Î¤ß¡¢ ¤½¤Î¥Ñ¥¿¡¼¥ó¤òǧ¼±¤·¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢¥¹¥é¥Ã¥·¥å/¤Ï¡Ö¥ë¥Ã¥¯¥¢¥Ø¥Ã¥É¡ÊÀèÆÉ¤ß¡Ë¡×±é»»»Ò¤È¤·¤Æ µ¡Ç½¤·¤Þ¤¹¡£ Îã¤ò¤¢¤²¤ë¤È¡¢
abcDEF
abcDEF ¤òǧ¼±¤·¤Þ¤¹¡£
abc/DEF
abc¤Î¸å¤í¤Ë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¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:Strings, Next:, Previous:Characters, Up:Pattern Matching

Flex¤Ë¤ª¤±¤ëʸ»úÎó

ʸ»úÎó¤È¤Ï¡¢¡Ê¾ï¤Ë¡¢¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡Ë ¿¤¯¤Î¾ì¹ç¡¢°úÍÑÉä¤Ë¤è¤Ã¤Æ°Ï¤Þ¤ì¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ç¤¹¡£ ¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤¬»È¤ï¤ì¤Ê¤¤¤«¤®¤ê¡¢ ʸ»úÎó¤Ë¤Ï²þ¹Ô¤äɽ¼¨ÉԲĤÎʸ»ú¤ò´Þ¤á¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£

-i ¥ª¥×¥·¥ç¥ó¡Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢See Case Insensitive Scanners¡Ë ¤ò»È¤ï¤Ê¤¤¤«¤®¤ê¡¢Âçʸ»ú¡¿¾®Ê¸»ú¤Î¶èÊ̤â´Þ¤á¤¿»úµÁ¤É¤ª¤ê¤Îʸ»úÎó ¤ËÂФ·¤Æ¥Þ¥Ã¥Á¤¬¹Ô¤ï¤ì¤Þ¤¹¡£ °úÍÑÉäÉÕ¤­¤Îʸ»úÎó¤Ë¤Ä¤¤¤Æ¤Ï¡¢°úÍÑÉä¤Ïǧ¼±¤µ¤ì¤ëʸ»úÎó¤Ë¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó¡£

¤¿¤È¤¨¤Ð¡¢

string
StrING
"STRING"
\"string\"

¤Ï¤¹¤Ù¤ÆÀµÅö¤Êʸ»úÎó¤Ç¤¢¤ê¡¢ºÇ¸å¤Î¤â¤Î¤Ï°úÍÑÉä¤â´Þ¤á¤Æ¥Þ¥Ã¥Á¤µ¤ì¤Þ¤¹¡£ Flex¤Ë¤ª¤¤¤Æ¤Ïʸ»úÎó¤Ë¤Ï°úÍÑÉä¤Ïɬ¿Ü¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¥­¡¼¥ï¡¼¥É¤Î¥°¥ë¡¼¥×¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¾ì¹ç¡¢

begin
end
pointer
 ...

¤È

"begin"
"end"
"pointer"
 ...

¤Î¤¤¤º¤ì¤âÀµÅö¤Ç¤¹¡£


Node:Character Classes, Next:, Previous:Strings, Up:Pattern Matching

Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½

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]
ASCIIÃͤ¬a¤«¤éz¤Þ¤Ç¤ÎÈϰϤˤ¢¤ëǤ°Õ¤Îʸ»ú¡¢ ¤¹¤Ê¤ï¤Á¡¢Ç¤°Õ¤Î±Ñ¾®Ê¸»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[^a-z]
a¤«¤éz¤Þ¤Ç¤ÎÈϰϤˤ¢¤ëʸ»ú°Ê³°¤ÎǤ°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
[ABcd]
A¡¢B¡¢c¡¢d¤Î¤¤¤º¤ì¤«¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£

Ãí°Õ¡§Flex¡¢¤ª¤è¤Ó¤¤¤¯¤Ä¤«¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎLex¤Ï¡¢ ¥¯¥é¥¹Æâ¤Ë¤ª¤±¤ëµÕÊý¸þ¤ÎÈϰϤò°·¤¦¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢

%%
[z-a9-0]

¤Ï¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ µÕÊý¸þ¤ÎÈϰϤϻØÄꤷ¤Ê¤¤¤Ç¤¯¤À¤µ¤¤¡£


Node:Character Class Expressions (Flex 2.5), Previous:Character Classes, Up:Pattern Matching

Flex¤Ë¤ª¤±¤ëʸ»ú¤Î¥°¥ë¡¼¥×²½¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

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:]]¤È ½ñ¤¯¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡Ë¡£


Node:Regular Expressions, Next:, Previous:Pattern Matching, Up:Flex Descriptions

Àµµ¬É½¸½

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¥·¡¼¥±¥ó¥¹¤ò¤Û¤«¤Ë¤â¿ô¿¤¯Ä󶡤·¤Æ¤¤¤Þ¤¹¡£


Node:Start States, Next:, Previous:Regular Expressions, Up:Flex Descriptions

¥¹¥¿¡¼¥È¾õÂÖ

¤Ê¤ó¤é¤«¤Î¾ò·ï¤Ë´ð¤Å¤¤¤Æ¡¢¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°½èÍý¤Î¥ë¡¼¥ë¤ò³èÀ­²½¤¹¤ë¤³¤È¤¬ ÊØÍø¤Ê¤È¤­¤¬¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¤¤¤¯¤Ä¤«¤Î¥³¥ó¥Ô¥å¡¼¥¿¸À¸ì¤Ç¤Ï¡¢½ÅÊ£¤·¤Æ¤¤¤ë¥¹¥­¥ã¥ó¥ë¡¼¥ë¤Î ¤¢¤¤¤Þ¤¤¤µ¤ò¼è¤ê½ü¤¯¤Î¤ò»Ù±ç¤¹¤ë¤¿¤á¤Ë¡¢¥Ñ¡¼¥¹¾õÂÖ¤ò»È¤¤¤Þ¤¹¡£ ¤Þ¤¿¡¢¤¢¤ëÆÃÄê¤ÎÆþÎϤ¬¸«¤Ä¤«¤Ã¤¿¸å¤Ç¤À¤±¡¢¤¢¤ë¥ë¡¼¥ë¤ò³èÀ­²½¤·¤¿¤¤¤È¤¤¤¦ ¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¤è¤¦¤Ê¾õ¶·¤ËÂн褹¤ë¤¿¤á¤Ë¡¢Flex¤Ï¥¹¥¿¡¼¥È¾ò·ï¤Þ¤¿¤Ï ¥¹¥¿¡¼¥È¾õÂ֤ȸƤФì¤ëñ½ã¤Ê¥·¥¹¥Æ¥à¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£


Node:Start States Explained, Next:, Up:Start States

¥¹¥¿¡¼¥È¾õÂÖ¤ÎÀâÌÀ

¥¹¥¿¡¼¥È¾õÂ֤ϡ¢¤¢¤ë¥ë¡¼¥ë¤¬¥¢¥¯¥Æ¥£¥Ö¤Ë¤Ê¤ë¤Î¤Ï¤¤¤Ä¤Ç¤¢¤ë¤«¤ò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¤Ç¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó¡£


Node:Activating States, Next:, Previous:Start States Explained, Up:Start States

¾õÂ֤γèÀ­²½

¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¤òʤ٤¿¤À¤±¤Ç¤Ï¤¢¤Þ¤êÌò¤ËΩ¤Á¤Þ¤»¤ó¡£ ¤Ä¤Þ¤ê¡¢¥¹¥¿¡¼¥È¾õÂÖ¤¬¤¤¤Ä³èÀ­²½¤µ¤ì¤ë¤Î¤«¤È¤¤¤¦¤³¤È¤âÀ©¸æ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ³èÀ­²½¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ÎÃæ¡¢¤Þ¤¿¤Ï¡¢µ­½Ò¾ðÊóÆâ¤ÎÄɲäÎ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)¤Ë¤è¤Ã¤Æ¡¢¥¹¥­¥ã¥Ê¤Î¾õÂÖ¤¬¸ú²ÌŪ¤Ë ¡Ê¤â¤Á¤í¤ó¡¢¤½¤Î»þÅÀ¤Ë¤ª¤¤¤Æ¥¹¥­¥ã¥ó¤·¤Æ¤¤¤ë²Õ½ê¤ò°Ý»ý¤·¤¿¤Þ¤Þ¡Ë ¥ê¥»¥Ã¥È¤µ¤ì¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£


Node:Start State Notes, Next:, Previous:Activating States, Up:Start States

¥¹¥¿¡¼¥È¾õÂ֤˴ؤ¹¤ëÃí°Õ

°Ê²¼¤Ë¡¢¥¹¥¿¡¼¥È¾õÂ֤λÈÍѤ˴ؤ¹¤ëÃí°Õ¤ò¤¤¤¯¤Ä¤«¼¨¤·¤Þ¤¹¡£


Node:Start State Notes (Flex 2.5), Next:, Previous:Start State Notes, Up:Start States

¥¹¥¿¡¼¥È¾õÂ֤˴ؤ¹¤ëÃí°Õ¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

Flex 2.5¤Ç¤Ï¡¢°Ê²¼¤Î¿·µ¡Ç½¤òÍøÍѤǤ­¤Þ¤¹¡£


Node:Start State Example, Previous:Start State Notes (Flex 2.5), Up:Start States

¥¹¥¿¡¼¥È¾õÂ֤λÈÍÑÎã

¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ª¤¤¤Æ¡¢²¿¤«¤ò¤¹¤ëÊýË¡¤ò³Ø¤Ö¤Î¤ËºÇÎɤÎÊýË¡¤Ï¡¢ ¼ÂºÝ¤Ë¤½¤ì¤ò¤ä¤Ã¤Æ¤ß¤ë¤³¤È¤Ç¤¹¡£ ¤½¤Î¤³¤È¤Ëα°Õ¤·¡¢¥¹¥¿¡¼¥È¾õÂÖ¤ò¤É¤Î¤è¤¦¤Ë»È¤¦¤³¤È¤¬¤Ç¤­¤ë¤«¤ò¼¨¤¹Îã¤ò °Ê²¼¤Ë¤¢¤²¤Þ¤¹¡£

/*
 * 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¤ò ¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£


Node:%option (Flex 2.5), Previous:Start States, Up:Flex Descriptions

%option¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

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
-7¥ª¥×¥·¥ç¥ó
%option 8bit
-8¥ª¥×¥·¥ç¥ó
%option align
-Ca¥ª¥×¥·¥ç¥ó
%option backup
-b¥ª¥×¥·¥ç¥ó
%option batch
-B¥ª¥×¥·¥ç¥ó
%option c++
-+¥ª¥×¥·¥ç¥ó
%option caseful
-i¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê
%option case-sensitive
-i¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê
%option case-insensitive
-i¥ª¥×¥·¥ç¥ó
%option caseless
-i¥ª¥×¥·¥ç¥ó
%option debug
-d¥ª¥×¥·¥ç¥ó
%option default
-s¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê
%option ecs
-Ce¥ª¥×¥·¥ç¥ó
%option fast
-F¥ª¥×¥·¥ç¥ó
%option full
-f¥ª¥×¥·¥ç¥ó
%option interactive
-I¥ª¥×¥·¥ç¥ó
%option lex-compat
-l¥ª¥×¥·¥ç¥ó
%option meta-ecs
-Cm¥ª¥×¥·¥ç¥ó
%option output="file"
-ofile¥ª¥×¥·¥ç¥ó
%option perf-report
-p¥ª¥×¥·¥ç¥ó
%option prefix="prefix"
-Pprefix¥ª¥×¥·¥ç¥ó
%option read
-Cr¥ª¥×¥·¥ç¥ó
%option stdout
-t¥ª¥×¥·¥ç¥ó
%option verbose
-v¥ª¥×¥·¥ç¥ó
%option warn
-w¥ª¥×¥·¥ç¥ó¤ÎÈÝÄê

¼¡¤Ë¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤Ç¤ÏÂåÂØ¤Ç¤­¤Ê¤¤%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
¥¹¥¿¡¼¥È¾õÂÖ¥¹¥¿¥Ã¥¯¡ÊStart State Notes (Flex 2.5)¤ò»²¾È¡Ë ¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¤³¤Î%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

¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Þ¤¹¡£ ¤³¤Î·ë²Ì¡¢¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤ò¸¡½Ð¤·¤¿¤È¤­¤Ë¡¢¥¹¥­¥ã¥Ê¤Ï¡¢ ¤Û¤«¤Ë¥¹¥­¥ã¥ó¤¹¤Ù¤­¥Õ¥¡¥¤¥ë¤Ï¸ºß¤·¤Ê¤¤¤ÈȽÃǤ¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£


Node:Interfacing to Flex, Next:, Previous:Flex Descriptions, Up:Top

Flex¤È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹

¤³¤Î¾Ï¤Ç¤ÏC¤ª¤è¤ÓBison¤È°ì½ï¤ËFlex¤ò»È¤¦ÊýË¡¤òÀâÌÀ¤·¤Þ¤¹¡£ 6 C¡¢Bison¤Î¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤ÆÈó¾ï¤ËºÙ¤«¤¤ÀâÌÀ¤¬É¬Íפʤ¿¤á¡¢ ËܾϤÏ2¤Ä¤ÎÉôʬ¤Ëʬ¤«¤ì¤Æ¤¤¤Þ¤¹¡£ ¤½¤ÎξÊý¤Ë¡¢Á´ÈÌŪ¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹³µÇ°¤Ë´Ø¤¹¤ëÀá¤È¥×¥í¥°¥é¥àÎã¤ò ¼¨¤¹À᤬¤¢¤ê¤Þ¤¹¡£


Node:Flex and C, Next:, Up:Interfacing to Flex

Flex¤ÈC

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;¤Ë¤Ê¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:Flex and C (Flex 2.5), Next:, Previous:Flex and C, Up:Interfacing to Flex

Flex¤ÈC¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

Flex 2.5¤Ç¤Ï¡¢Á°Àá¡ÊFlex and C¡Ë¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤Ê¤¤¡¢ °Ê²¼¤Î¥Þ¥¯¥í¤â¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

yy_set_interactive(is_interactive)
¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤ò¡¢ÂÐÏÃŪ¤Ê¤â¤Î¤È¤ß¤Ê¤¹¤«¡¢ÈóÂÐÏÃŪ¤Ê¤â¤Î¤È¤ß¤Ê¤¹¤«¤ò À©¸æ¤·¤Þ¤¹¡£ °ú¿ôis_interactive¤Ë¥¼¥í°Ê³°¤ÎÃͤòÅϤ¹¤È¡¢¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤ÏÂÐÏÃŪ ¤Ê¤â¤Î¤È¤ß¤Ê¤µ¤ì¡¢¥¼¥í¤òÅϤ¹¤È¡¢ÈóÂÐÏÃŪ¤Ê¤â¤Î¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£ yy_set_interactive()¤Ë¤è¤ë»ØÄê¤Ï¡¢%option always-interactive¤ä %option never-interactive¤Ë¤è¤ë»ØÄê¤ËÍ¥À褷¤Þ¤¹¡£ ¤³¤Î¥Þ¥¯¥í¤Ï¡¢¥Ð¥Ã¥Õ¥¡¤«¤é¤Î¥¹¥­¥ã¥ó½èÍý¤¬»Ï¤Þ¤ë¤è¤ê¤âÁ°¤Ë ¸Æ¤Ó½Ð¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
yy_set_bol(at_bol)
¥Ð¥Ã¥Õ¥¡¤Ï¡¢¤µ¤Þ¤¶¤Þ¤Ê¥³¥ó¥Æ¥­¥¹¥È¾ðÊó¤òÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤¬Å¬ÍѤµ¤ì¤ë¤Î¤Ï¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î ¸½ºß°ÌÃÖ¤¬¼ÂºÝ¤Ë¹Ô¤ÎÀèÆ¬¤Ç¤¢¤ë¾ì¹ç¤À¤±¤Ç¤¹¤¬¡¢¸½ºß°ÌÃÖ¤¬¹Ô¤ÎÀèÆ¬¤Ë ¤¢¤ë¤«Èݤ«¤È¤¤¤¦¾ðÊó¤Ï¡¢¥Ð¥Ã¥Õ¥¡¤Î¥³¥ó¥Æ¥­¥¹¥È¾ðÊó¤È¤·¤ÆÊÝ»ý¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¥Þ¥¯¥íyy_set_bol()¤Ï¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃÖ¤¬¹Ô¤ÎÀèÆ¬¤Ë ¤¢¤ë¤«Èݤ«¤òɽ¤¹¥³¥ó¥Æ¥­¥¹¥È¾ðÊó¤òÀßÄꤷ¤Þ¤¹¡£ °ú¿ô¤Ë¥¼¥í°Ê³°¤ÎÃͤòÅϤ¹¤È¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃ֤ϹԤÎÀèÆ¬¤Ç¤¢¤ë¡¢ ¤È¤¤¤¦¥³¥ó¥Æ¥­¥¹¥È¾ðÊ󤬥»¥Ã¥È¤µ¤ì¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¼¡¤Ë¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á½èÍý¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¤Ï¡¢ ¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤ÎŬÍѤ¬»î¤ß¤é¤ì¤Þ¤¹¡£ µÕ¤Ë¡¢°ú¿ô¤Ë¥¼¥í¤òÅϤ¹¤È¡¢¥Ð¥Ã¥Õ¥¡Æâ¤Î¸½ºß°ÌÃ֤ϹԤÎÀèÆ¬¤Ç¤Ï¤Ê¤¤¤³¤È¤Ë¤Ê¤ê¡¢ ¼¡¤Ë¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á½èÍý¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¤Ï¡¢ ¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤ÎŬÍѤ¬»î¤ß¤é¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£

YY_AT_BOL()
¼¡¤Ë¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á½èÍý¤¬¹Ô¤ï¤ì¤ë¤È¤­¤Ë¡¢¹ÔƬ¤òɽ¤¹^¤ò´Þ¤à¥ë¡¼¥ë¤Î ŬÍѤ¬»î¤ß¤é¤ì¤ë¤è¤¦¤Ê¥³¥ó¥Æ¥­¥¹¥È¾ðÊ󤬥»¥Ã¥È¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡¢ ¥¼¥í°Ê³°¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£ ¤½¤ì°Ê³°¤Î¾ì¹ç¤Ï¡¢¥¼¥í¤òÊÖ¤·¤Þ¤¹¡£


Node:An Example of Flex and C, Next:, Previous:Flex and C (Flex 2.5), Up:Interfacing to Flex

Flex¤ÈC¤Î´Êñ¤Ê¥×¥í¥°¥é¥àÎã

¤¢¤ëñ¸ì¤¬¸½¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤òÊ̤Îñ¸ì¤ËÃÖ¤­´¹¤¨¤ëɬÍפ¬À¸¤¸¤ë¤³¤È ¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¤¢¤ë̾Á°¤¬¸½¤ì¤ë¤¿¤Ó¤Ë¡¢¤½¤ì¤ò¤¢¤ë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¤Ç¤¹¡£


Node:Flex and Bison, Next:, Previous:An Example of Flex and C, Up:Interfacing to Flex

Flex¤ÈBison

Bison¤Ï¡¢Flex¤ÈƱÍÍ¡¢¤¢¤ëµ­½Ò¾ðÊó¤ò¼õ¤±¼è¤Ã¤Æ¡¢ ¤½¤ì¤ò¤â¤È¤ËC¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ë¥×¥í¥°¥é¥à¤Ç¤¹¡£ ξ¼Ô¤Î°ã¤¤¤Ï¡¢ Bison¤¬C¤äPascal¤Î¤è¤¦¤Ê¸À¸ì¤Îʸˡ¤Ë´Ø¤¹¤ëµ­½Ò¾ðÊó¤òÆþÎϤȤ·¤Æ¼õ¤±¼è¤ê¡¢ ¤½¤Îµ­½Ò¾ðÊ󤫤é¥Ñ¡¼¥µ¤òÀ¸À®¤¹¤ëÅÀ¤Ë¤¢¤ê¤Þ¤¹¡£ Flex¤ÈBison¤ò·ë¹ç¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢¸À¸ì¤Î»ú¶ç²òÀϤȹ½Ê¸²òÀϤÎξÊý¤ò ½èÍý¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡Ê¤³¤ì¤Ï¡¢¥³¥ó¥Ñ¥¤¥é¥Ç¥¶¥¤¥ó¤Ë¤ª¤¤¤Æ¤â¤Ã¤È¤â ÍÆ°×¤Ë¼«Æ°²½¤Ç¤­¤ëÉôʬ¤Ç¤¹¡Ë¡£

À¸À®¤µ¤ì¤ë¥Ñ¡¼¥µ¤¬µ¡Ç½¤¹¤ë¤¿¤á¤Ë¤Ï¡¢ Bison¤Ïyylex()¤È¤¤¤¦´Ø¿ô¤òɬÍפȤ·¤Þ¤¹¡£ ¤³¤Î´Ø¿ô¤Ï¥æ¡¼¥¶¡¼¤Ë¤è¤Ã¤ÆÄ󶡤µ¤ì¡¢¸Æ¤Ó½Ð¤µ¤ì¤¿¤È¤­¤Ë¡¢ ¥Ñ¡¼¥¹¤µ¤ì¤Æ¤¤¤ë¸À¸ì¤Î¤¢¤ëÍ×ÁǤòɽ¤¹À°¿ôÃͤòBison¤ËÊÖ¤·¤Þ¤¹¡£ Flex¤Ë¤ª¤¤¤Æ¥¹¥­¥ã¥ó½èÍý¤ò¹Ô¤¦¥ë¡¼¥Á¥ó¤Ïyylex()¤Ç¤¢¤ê¡¢ ¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÀ°¿ôÃͤòÊÖ¤·¤Þ¤¹¡£ ¤³¤ì¤Ë¤è¤ê¡¢Flex¤ÈBison¤ò°ì½ï¤Ë»È¤¦¤Î¤ÏÈó¾ï¤Ë´Êñ¤Ë¤Ê¤ê¤Þ¤¹¡£

·Ù¹ð¡§ °Ê²¼¤ÎÀá¤Ç¤Ï¡¢ÆÉ¼Ô¤¬Bison¤Î´ðËÜŪ¤Ê¥Ñ¡¼¥µ¤ÎÀë¸À¤ò Íý²ò¤·¤Æ¤¤¤ë¤â¤Î¤È²¾Äꤷ¤Þ¤¹¡£ Bison¤ò»È¤Ã¤¿·Ð¸³¤Î¤Ê¤¤¿Í¤Ë¤Ï¡¢¥Ñ¡¼¥µ¤ÎÄêµÁ¤Ïº®Íð¤ò¤â¤¿¤é¤¹²ÄǽÀ­ ¤¬¤¢¤ê¤Þ¤¹¤Î¤Ç¡¢Àè¤Ë¿Ê¤àÁ°¤Ë¤¼¤ÒBison¤Î¥Þ¥Ë¥å¥¢¥ë11¤òÆÉ¤ó¤Ç¤¯¤À¤µ¤¤¡£ Bison¤Ë¶½Ì£¤Î¤Ê¤¤¿Í¤Ï¡¢¤³¤ÎÀáÁ´ÂΤòÈô¤Ð¤·¤Æ¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£


Node:Interfacing Flex and Bison, Next:, Up:Flex and Bison

Flex¤È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¤Î¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:YYSTYPE and yylval, Previous:Interfacing Flex and Bison, Up:Flex and Bison

YYSTYPE¤Èyylval

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¤òÀë¸À¤¹¤ëɬÍ× ¤¬¤¢¤ê¤Þ¤¹¡£


Node:Another Example of Flex and Bison, Next:, Previous:Flex and Bison, Up:Interfacing to Flex

Flex¤ÈBison¤Î¤â¤¦1¤Ä¤Î¥×¥í¥°¥é¥àÎã

¥³¡¼¥É¤òÆÉ¤à¤Î¤Ï¡¢¥×¥í¥°¥é¥ß¥ó¥°¤Î¤·¤«¤¿¤ò³Ø¤ÖÎɤ¤ÊýË¡¤Ç¤¹¡£ ¤½¤³¤Ç¡¢Flex¡¢Bison¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Îã¤ò¤â¤¦1¤Ä¼¨¤¹¤³¤È¤Ë¤·¤Þ¤¹¡£ ¼¡¤ÎÎã¤Ç¤Ï¡¢³ÈÄ¥¤·¤Æ¥Ç¡¼¥¿¥Ù¡¼¥¹¤òÁàºî¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ê¡¢ ¾®µ¬ÌϤʸÀ¸ì¤Î¤¿¤á¤Î´Êñ¤Ê¥Ñ¡¼¥µ¤òºî¤ê¤Þ¤¹¡£


Node:The Database Language, Next:, Up:Another Example of Flex and Bison

¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¸À¸ì

¥Ç¡¼¥¿¥Ù¡¼¥¹¤È¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¸À¸ì¤Ï¡¢±Ñ¸ì¤ÎÈó¾ï¤Ë¾®¤µ¤Ê¥µ¥Ö¥»¥Ã¥È¤Ë¤Ê¤ê¤Þ¤¹¡£ ʸˡ¤Ï¤ª¤ª¤è¤½°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

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¤Î¥Þ¥Ë¥å¥¢¥ë ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:The Implementation, Next:, Previous:The Database Language, Up:Another Example of Flex and 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¤ò»È¤¦¤Î¤Ç¤¢¤ì¤Ð¡¢¤³¤Î¥Õ¥¡¥¤¥ë¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£


Node:Notes on the Implementation, Previous:The Implementation, Up:Another Example of Flex and Bison

¼ÂÁõ¤Ë´Ø¤¹¤ëÃí°Õ

°Ê²¼¤Ë¼ÂÁõ¤Ë´Ø¤¹¤ëÃí°Õ¤ò¼¨¤·¤Þ¤¹¡£


Node:Flex and C plus plus (Flex 2.5), Previous:Another Example of Flex and Bison, Up:Interfacing to Flex

Flex¤ÈC++¡ÊFlex 2.5¤ÎÊä­¾ðÊó¡Ë

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
¤³¤ÎÃͤ¬¥¼¥í°Ê³°¤Î¾ì¹ç¡¢C++¥¹¥­¥ã¥Ê¤Ï¥Ç¥Ð¥Ã¥°½ÐÎϤò¹Ô¤¤¤Þ¤¹¡£

¼¡¤Ë¡¢FlexLexer¤Î»ý¤Ä¥á¥ó¥Ð´Ø¿ô¤Î¤¦¤Á¡¢ Ãê¾Ý²¾ÁÛ´Ø¿ô¤Ç¤Ï¤Ê¤¤¤â¤Î¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£

const char* YYText()
¥á¥ó¥Ðyytext¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int YYLeng()
¥á¥ó¥Ðyyleng¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int yylex(istream* new_in, ostream* new_out = 0)
new_in¤Ènew_out¤ò°ú¿ô¤Ë»ØÄꤷ¤Æ¡¢¥á¥ó¥Ð´Ø¿ôswitch_streams() ¤ò¸Æ¤Ó½Ð¤·¤¿¸å¡¢¥á¥ó¥Ð´Ø¿ôint yylex(void)¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£
int lineno() const
¥á¥ó¥Ðyylineno¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
int debug() const
¥á¥ó¥Ðyy_flex_debug¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
void set_debug(int flag)
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)
¤³¤ì¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥­¥ã¥Ê¤ÎÆþÎϽèÍý¤òÊѹ¹¤Ç¤­¤Þ¤¹¡£ ºÇÂçmax_size¥Ð¥¤¥È¤Îʸ»ú¤òÆþÎϤ·¤Æbuf¤Î»Ø¤¹Îΰè¤Ë¥»¥Ã¥È¤·¡¢ ¼ÂºÝ¤ËÆþÎϤ·¤¿¥Ð¥¤¥È¿ô¤òÌá¤êÃͤȤ·¤Þ¤¹¡£ ÆþÎϤòÂÐÏÃŪ¤Ë°·¤¦¾ì¹ç¤È°·¤ï¤Ê¤¤¾ì¹ç¤Ç¡¢½èÍýÆâÍÆ¤òÊѹ¹¤¹¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ï¡¢ #ifdef YY_INTERACTIVE¤ò»È¤¤¤Þ¤¹¡£
void LexerOutput(const char* buf, int size)
¤³¤ì¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¹¥­¥ã¥Ê¤Î½ÐÎϽèÍý¤òÊѹ¹¤Ç¤­¤Þ¤¹¡£ buf¤Î»Ø¤¹Îΰè¤Ë¤¢¤ësize¥Ð¥¤¥È¤Îʸ»ú¤ò½ÐÎϤ·¤Þ¤¹¡£
void LexerError(const char* msg)
¤³¤ì¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Î½ÐÎϽèÍý¤òÊѹ¹¤Ç¤­¤Þ¤¹¡£ ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¢°ú¿ô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>


Node:Other Flex Features, Next:, Previous:Interfacing to Flex, Up:Top

Flex¤Î¾¤ÎÆÃħ

¤³¤³¤Ç¤Ï¡¢Lex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤µ¡Ç½¤ä°ìÈ̤ˤϤ¢¤Þ¤ê»È¤ï¤ì¤Ê¤¤µ¡Ç½¤òÀâÌÀ¤·¤Þ¤¹¡£ Flex¤Ï¤Û¤Ü100¥Ñ¡¼¥»¥ó¥ÈLex¸ß´¹¤Ç¤¹¤¬¡¢Lex¤è¤ê¤â¸å¤Ë¼ÂÁõ¤µ¤ì¤¿¤¿¤á¡¢ À­Ç½Åª¤Ë¤è¤êÍ¥¤ì¤Æ¤ª¤ê¡¢ ¤Þ¤¿¡¢¹­ÈϤÊÍÑÅӤ˻Ȥ¨¤ë¥¹¥­¥ã¥Ê¤ò¤è¤ê´Êñ¤ËºîÀ®¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¡¢ ÆÃÊ̤ʵ¡Ç½¤òÄ󶡤·¤Æ¤¤¤Þ¤¹¡£


Node:Case Insensitive Scanners, Next:, Up:Other Flex Features

Âçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤¥¹¥­¥ã¥Ê

¿¤¯¤Î¸À¸ì¤Ï¡¢¤½¤Î¼±Ê̻Ҥˤª¤¤¤ÆÂçʸ»ú¡¿¾®Ê¸»ú¤ò¶èÊ̤·¤Þ¤»¤ó¡Ê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¤Ç¤Ï¡¢¥Ñ¥¿¡¼¥ó¤ÎÊ£»¨¤µ¤ÏÂ礷¤Æ±Æ¶Á¤·¤Þ¤»¤ó¡Ë¡£

¤Û¤«¤Ë¤â¤³¤ì¤ÈƱ¤¸¤³¤È¤ò¹Ô¤¦ÊýË¡¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¤¤¤º¤ì¤â¥¨¥ì¥¬¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£


Node:The -i Switch, Up:Case Insensitive Scanners

-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¤ÎÀâÌÀ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Node:Interactive Scanners, Next:, Previous:Case Insensitive Scanners, Up:Other Flex Features

-I¥ª¥×¥·¥ç¥ó¡§ÂÐÏ÷¿¥¹¥­¥ã¥Ê

Flex¤ÎÌäÂê¤È¤·¤Æ¡¢¤É¤Î¥ë¡¼¥ë¤òŬÍѤ¹¤ë¤«¤ò·èÄꤹ¤ëÁ°¤Ë¡¢ ÆþÎϾðÊóÃæ¤Î¼¡¤Î1ʸ»ú¤òÀèÆÉ¤ß¤¹¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ ÂÐÏÃŪ¤Ç¤Ï¤Ê¤¤»È¤¤Êý¤ò¤¹¤ë¾ì¹ç¤Ë¤ÏÌäÂê¤Ë¤Ê¤ê¤Þ¤»¤ó¤¬¡¢ Flex¤ò»È¤Ã¤Æ¥æ¡¼¥¶¡¼¤«¤éľÀÜÆþÎÏʸ»ú¤ò¼õ¤±¼è¤ë¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢ ÌäÂê¤Ë¤Ê¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£

¤³¤Î¤è¤¦¤ÊÎã¤ò2¤Ä¤¢¤²¤ë¤È¡¢1¤Ä¤Ï¥·¥§¥ë¤È¤ä¤ê¼è¤ê¤¹¤ë¾ì¹ç¡¢ ¤â¤¦1¤Ä¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥Õ¥í¥ó¥È¥¨¥ó¥É¤È¤ä¤ê¼è¤ê¤¹¤ë¾ì¹ç¤Ç¤¹¡£ Ä̾ï¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢²þ¹Ô¤¬ÆþÎϤνª¤ï¤ê¤òɽ¤¹¤È¤¤¤¦¤â¤Î¤Ç¡¢ ²þ¹Ô¼«¿È¤Ï°ì¼ï¤Î¡ÖÃæ¿È¤Î¤Ê¤¤Ê¸¡×¤È¤·¤Æ¼õ¤±ÉÕ¤±¤ë¤Î¤¬Ë¾¤Þ¤·¤¤¤Î¤Ç¤¹¤¬¡¢ Ä̾ï¤ÎFlex¥¹¥­¥ã¥Ê¤Ç¤Ï¤³¤ì¤Ï²Äǽ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ Flex¤¬¾ï¤ËÀèÆÉ¤ß¤ò¤¹¤ë¤È¤¤¤¦»ö¼Â¤Ï¡¢²þ¹Ô¤¬Ç§¼±¤µ¤ì¤ë¤¿¤á¤Ë¤Ï¥æ¡¼¥¶¡¼¤¬¼¡¤Î¹Ô¤ò ÆþÎϤ·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹ ¡Ê¤¹¤Ê¤ï¤Á¡¢Ã±°ì¤Î²þ¹Ô¤Ï¡¢¤½¤ì¤À¤±¤Ç¤Ïǧ¼±¤µ¤ì¤º¡¢ ¾¤Îʸ»ú¤¬ÆþÎϤµ¤ì¤ëɬÍפ¬¤¢¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡Ë¡£ ¤³¤ì¤Ï¥·¥§¥ë¾å¤Ç¤Ï¤Þ¤Ã¤¿¤¯Ë¾¤Þ¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£

Flex¤Ë¤Ï¤³¤ì¤ò²óÈò¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç-I¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤È¡¢Flex¤Ï¡¢ ɬÍפʾì¹ç¤Ë¤·¤«ÀèÆÉ¤ß¤ò¤·¤Ê¤¤ÆÃÊ̤ÊÂÐÏ÷¿¥¹¥­¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ ¤³¤Î¼ï¤Î¥¹¥­¥ã¥Ê¤Ï¡¢¥æ¡¼¥¶¡¼¤«¤é¤ÎÆþÎϤòľÀܼõ¤±¼è¤ë¤Î¤ËŬ¤·¤Æ¤¤¤Þ¤¹¤¬¡¢ ¼ã´³¤ÎÀ­Ç½Äã²¼¤ò°ú¤­µ¯¤³¤¹¤«¤â¤·¤ì¤Þ¤»¤ó¡£

Ãí°Õ¡§-I¥ª¥×¥·¥ç¥ó¤Ï¡¢-f¡¢-F¡¢-Cf¡¢ ¤Þ¤¿¤Ï-CF¥Õ¥é¥°¤È°ì½ï¤Ë»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ ¤Ä¤Þ¤ê¡¢ÀèÆÉ¤ß¤¬¤Ç¤­¤Ê¤¤¤³¤È¤«¤é¤¯¤ëÀ­Ç½Äã²¼¤Ë²Ã¤¨¤Æ¡¢¥Ñ¡¼¥µ¤â À­Ç½¸þ¾å¤Î¤¿¤á¤ËºÇŬ²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£

-I¥ª¥×¥·¥ç¥ó¤Ë¤ª¤±¤ë¥Þ¥¤¥Ê¥¹Ì̤ϡ¢Ä̾ï¤Ï¤´¤¯¤ï¤º¤«¤Ê¤Î¤Ç¡¢ ÆþÎϾðÊ󤬤ɤ³¤«¤é¤¯¤ë¤Î¤«¤¬³Î¤«¤Ç¤Ï¤Ê¤¯¡¢À­Ç½¸þ¾å¤Î¤¿¤á¤ÎºÇŬ²½ ¤ò»Ü¤¹²ÄǽÀ­¤òÄü¤á¤Æ¤â¤«¤Þ¤ï¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç -I¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤¿¤Û¤¦¤¬¤è¤¤¤Ç¤·¤ç¤¦¡£


Node:Table Compression and Scanner Speed, Next:, Previous:Interactive Scanners, Up:Other Flex Features

¥Æ¡¼¥Ö¥ë¤Î°µ½Ì¤È¥¹¥­¥ã¥Ê¤Î¥¹¥Ô¡¼¥É

¥Æ¡¼¥Ö¥ë¤Î°µ½Ì¤È¥¹¥Ô¡¼¥É¤ÎÌ̤Ǥϡ¢ Flex¤ÏLex¤ÎǽÎϤò¤Ï¤ë¤«¤Ë¾å²ó¤Ã¤Æ¤¤¤Þ¤¹¡£ Flex¤Ï¡¢»È¤ï¤ì¤ë¥ª¥×¥·¥ç¥ó¤Ë±þ¤¸¤Æ¡¢Lex¤è¤ê¤â¤Ï¤ë¤«¤Ë¹â®¤Ê¥Æ¡¼¥Ö¥ë¡¢ ¤¢¤ë¤¤¤Ï¡¢¤Ï¤ë¤«¤Ë¾®¤µ¤Ê¥Æ¡¼¥Ö¥ë¤òÀ¸À®¤Ç¤­¤Þ¤¹¡£ ¤³¤ÎÀá¤Ç¤Ï¡¢ÍøÍѲÄǽ¤Ê¥ª¥×¥·¥ç¥ó¤È³Æ¥ª¥×¥·¥ç¥ó¤¬¥¹¥Ô¡¼¥É¤Ë¤â¤¿¤é¤¹±Æ¶Á ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤¹¡£ °ìÈ̤ˡ¢¥Æ¡¼¥Ö¥ë¤¬°µ½Ì¤µ¤ì¤ë¤Û¤É¡¢¤½¤Î¥¹¥Ô¡¼¥É¤ÏÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£ Flex¤Ç¤Ï¡¢¤³¤¦¤·¤¿¥ª¥×¥·¥ç¥ó¤ò¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç»ØÄꤷ¤Þ¤¹¡£ ¥ª¥×¥·¥ç¥ó¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£13

-f¤Þ¤¿¤Ï-Cf
¥Õ¥ë¥Æ¡¼¥Ö¥ë¡Êfull table¡Ë¤òÀ¸À®¤·¤Þ¤¹¡£ ¤³¤Î¥Æ¡¼¥Ö¥ë¤Ï¤Þ¤Ã¤¿¤¯°µ½Ì¤µ¤ì¤º¡¢¥µ¥¤¥º¤¬Â礭¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¥¹¥Ô¡¼¥É¤Ï ®¤¯¤Ê¤ê¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ÎÉôʬ¤ËREJECT ¤ò»È¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

Ãí°Õ¡§-f¥Õ¥é¥°¤È-F¥Õ¥é¥°¤Ç¤Ï¡¢ À¸À®¤¹¤ë¥Æ¡¼¥Ö¥ë¤ËÁê°ã¤¬¤¢¤ê¤Þ¤¹¡£ -f¥Õ¥é¥°¤Ï¥Õ¥ë¥Æ¡¼¥Ö¥ë¡Êfull table¡Ë¤òÀ¸À®¤·¡¢ -F¥Õ¥é¥°¤Ï¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¡Êfast table¡Ë¤òÀ¸À®¤·¤Þ¤¹¡£ ¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¤È¤Ï¡¢¥¹¥Ô¡¼¥É¤òºÇÂç¸Â¤Ë¤¹¤ë¤è¤¦ºÇŬ²½¤µ¤ì¤¿¥Æ¡¼¥Ö¥ë·Á¼°¤Ç¤¢¤ê¡¢ °ìÊý¡¢¥Õ¥ë¥Æ¡¼¥Ö¥ë¤Ë¤ÏºÇŬ²½¤Ï°ìÀڻܤµ¤ì¤Þ¤»¤ó¡£ ·ë²Ì¤Ï¤è¤¯»÷¤Æ¤¤¤Þ¤¹¤¬¡¢¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤ÏÂ礭¤¯°Û¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£

-F¤Þ¤¿¤Ï-CF
¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¡Ê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
¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»È¤¦¤È¡¢À­Ç½¤Ë¤Ï¤ï¤º¤«¤·¤«±Æ¶Á¤òµÚ¤Ü¤µ¤º¤Ë¡¢ ¥Æ¡¼¥Ö¥ë¤Î¥µ¥¤¥º¤ò¤«¤Ê¤ê¾®¤µ¤¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ -Ce¤¬»È¤ï¤ì¤ë¤È¡¢ Flex¤ÏƱÅù¥¯¥é¥¹¡Êequivalence classes¡Ë¤òºîÀ®¤·¤Þ¤¹¡£ ƱÅù¥¯¥é¥¹¤È¤Ï¡¢Æ±°ì¤ÎÊýË¡¤Ç»È¤ï¤ì¤ëʸ»ú¤Î¥°¥ë¡¼¥×¤Ç¤¹¡£ ¤¿¤È¤¨¤Ð¡¢»È¤ï¤ì¤ë¿ô»ú¤¬½¸¹ç[0-9]¤ÎÈϰϤ˸ÂÄꤵ¤ì¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢ 0¤«¤é9¤Þ¤Ç¤Î¿ô¤ÏƱÅù¥¯¥é¥¹¤ÎÃæ¤ËÃÖ¤«¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
-Cfe¡¢-CFe
ƱÅù¥¯¥é¥¹¤ò»ý¤Ä¥Õ¥¡¥¹¥È¥Æ¡¼¥Ö¥ë¤Ç¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤â¤Þ¤¿¹â®¤Ç¤¢¤ê¡¢¤«¤Ä¡¢ -Cf¤¢¤ë¤¤¤Ï-CF¤ò»ØÄꤷ¤ÆÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤ÈÈæ³Ó¤·¤Æ¡¢ ¥µ¥¤¥º¤â¤Ï¤ë¤«¤Ë¾®¤µ¤¯¤Ê¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹¡£ ¥µ¥¤¥º¤Þ¤¿¤Ï¥¹¥Ô¡¼¥É¤Î°ìÊý¤òÍ¥À褵¤»¤ëɬÍפ¬¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢ ¤³¤ì¤ÏÎɤ¤ÁȤ߹ç¤ï¤»¤Ç¤¹¡£
-Cm
¥á¥¿Æ±Åù¥¯¥é¥¹¡Êmeta-equivalence classes¡Ë¤ò»ÈÍѤ·¤Þ¤¹¡£ ¤³¤ì¤Ï¡¢°ì½ï¤Ë»È¤ï¤ì¤ë¤³¤È¤¬Â¿¤¤Ê¸»ú¤Î½¸¹ç¡¢¤Þ¤¿¤Ï ¡ÊƱÅù¥¯¥é¥¹¤¬»È¤ï¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¡ËƱÅù¥¯¥é¥¹¤Ç¤¹¡£ ƱÅù¥¯¥é¥¹¤ò»È¤¦¾ì¹ç¤è¤ê¤âÀ­Ç½¤Ï¤µ¤é¤Ë°­¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¤³¤ì¤Ï¿¤¯¤Î¾ì¹ç¡¢ ¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤ò¾®¤µ¤¯¤¹¤ë¤Î¤ËÈó¾ï¤Ë¸ú²ÌŪ¤ÊÊýË¡¤Ç¤¹¡£
-Cem
¥Ç¥Õ¥©¥ë¥È¤Î¥Æ¡¼¥Ö¥ë°µ½Ì¤Ç¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤ÇÀ¸À®¤µ¤ì¤ë¥¹¥­¥ã¥Ê¤Ï¡¢Flex¤¬À¸À®¤¹¤ë¥¹¥­¥ã¥Ê¤ÎÃæ¤Ç »ö¼Â¾å¤â¤Ã¤È¤â¾®¤µ¤¯¡¢¤«¤Ä¡¢¤â¤Ã¤È¤âÀ­Ç½¤ÎÎô¤ë¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£
-C
-C¥ª¥×¥·¥ç¥óñÂΤǤϡ¢Æ±Åù¥¯¥é¥¹¤ä¥á¥¿Æ±Åù¥¯¥é¥¹¤ò»È¤ï¤º¤Ë ¥Æ¡¼¥Ö¥ë¤ò°µ½Ì¤·¤Þ¤¹¡£

Ãí°Õ¡§-Cxx¥ª¥×¥·¥ç¥ó¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¾å¤Ë¤Ï1¤Ä¤À¤± »ØÄꤹ¤Ù¤­¤Ç¤¹¡£ ¤È¤¤¤¦¤Î¤Ï¡¢¤³¤Î¤¦¤ÁºÇ¸å¤Ë¸«¤Ä¤«¤Ã¤¿¥ª¥×¥·¥ç¥ó¤À¤±¤¬¼ÂºÝ¤Î¸ú²Ì¤ò»ý¤Ä¤«¤é¤Ç¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢

flex -Cf -Cem foo.l

¤Ï¡¢Flex¤Ë-Cem¥ª¥×¥·¥ç¥ó¤ò»È¤ï¤»¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£

Flex¤Î¥Ç¥Õ¥