Previous: Another Example of Flex and Bison, Up: Interfacing to Flex   [Contents][Index]


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

4.7 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++¥¹¥­¥ã¥Ê¡¦¥¯¥é¥¹¤Î¼ÂÁõ¤ËÍøÍѤµ¤ì¤ë£²¤Ä¤ÎC++¥¯¥é¥¹ ¡ÊFlexLexer¤ÈyyFlexLexer¡Ë ¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£


FlexLexer¤Ï¡¢ C++¥¹¥­¥ã¥Ê¡¦¥¯¥é¥¹¤¬¼ÂÁõ¤¹¤Ù¤­¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò¹½À®¤¹¤ëÃê¾Ý²¾ÁÛ´Ø¿ô¤òÄêµÁ¤¹¤ë¥¯¥é¥¹¤Ç¤¹¡£

FlexLexer¤Î»ý¤Ä¥á¥ó¥Ð¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£

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

¼¡¤Ë¡¢ 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)

ºÇ½é¤Î£µ¤Ä¤Î¥á¥ó¥Ð´Ø¿ô¤Ï¡¢ 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¥á¥ó¥Ð´Ø¿ô¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢ ¥¹¥­¥ã¥Ê¤Î¿¶¤ëÉñ¤¤¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


¥¹¥­¥ã¥ó½èÍý¤Ë´Ø¤ï¤ë¤¹¤Ù¤Æ¤Î¥³¥ó¥Æ¥­¥¹¥È¾ðÊó¤Ï¡¢ yyFlexLexer¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÆâÉô¤ËÊĤ¸¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¤³¤È¤Ï¡¢ C++¥¹¥­¥ã¥Ê¡¦¥¯¥é¥¹¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢ ºÆÆþ²Äǽ¤Ê¥¹¥­¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤¬²Äǽ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£

Ê£¿ô¤ÎC++¥¹¥­¥ã¥Ê¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Æ¡¢ £±¤Ä¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ ¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢ Flexµ¯Æ°»þ¤Ë‘-Pprefix’¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤«¡¢ ¥¹¥­¥ã¥ÊÄêµÁ¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë‘%option prefix="prefix"’¤ò»ØÄꤹ¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢ yyFlexLexer¤Î̾Á°¤ò‘prefixFlexLexer’¤ËÊѹ¹¤·¤Þ¤¹¡£ prefixFlexLexer¥¯¥é¥¹¤ò»È¤¦¥½¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç¤Ï¡¢ °Ê²¼¤Î¤è¤¦¤Ë¤·¤ÆFlexLexer.h¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢ prefixFlexLexer ¡Ê¼ÂºÝ¤Ë¤ÏyyFlexLexer¡Ë ¤ÎÄêµÁ¤ò»²¾È¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

#undef yyFlexLexer
#define yyFlexLexer prefixFlexLexer
#include <FlexLexer.h>

Previous: Another Example of Flex and Bison, Up: Interfacing to Flex   [Contents][Index]