Previous: Another Example of Flex and Bison, Up: Interfacing to Flex [Contents][Index]
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
¤Î»ý¤Ä¥á¥ó¥Ð¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
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
¤ËÂåÆþ¤·¤Þ¤¹¡£
¼¡¤Ë¡¢
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
¥á¥ó¥Ð´Ø¿ô¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢
¥¹¥¥ã¥Ê¤Î¿¶¤ëÉñ¤¤¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
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++¥¹¥¥ã¥Ê¡¦¥¯¥é¥¹¤òÀ¸À®¤·¤Æ¡¢
£±¤Ä¤Î¼Â¹Ô¥×¥í¥°¥é¥à¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£
¤³¤ì¤ò¹Ô¤¦¤Ë¤Ï¡¢
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]