Next: Multiple Scanners, Previous: Handling Strings, Up: Useful Code [Contents][Index]
¤³¤³¤Ç¤Ï¡¢
C¤Ë¸«¤é¤ì¤ëÍÍ¡¹¤Ê¿ôÃÍ·Á¼°¤ËÂФ·¤Æ¤è¤¯»È¤ï¤ì¤ëÄêµÁ¤ò¤¤¤¯¤Ä¤«¼¨¤·¡¢
¤µ¤é¤Ë¤½¤Î»È¤¤Êý¤Î¼ÂÎã¤ò£±¤Ä¼¨¤·¤Þ¤¹¡£
ÃíÌܤ¹¤Ù¤¼çÍפÊÅÀ¤Ï¡¢
¿ô¤ÎÃͤò³ÍÆÀ¤¹¤ë¤¿¤á¤Ëscanf()
¤ò»È¤Ã¤Æ¤¤¤ëÅÀ¤È¡¢
¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤¬È¯À¸¤·¤Ê¤¤¤è¤¦long
·¿¤ÎÃͤò¥¹¥¥ã¥ó¤¹¤ë¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ç¤¹¡£
°ìÈÌŪ¤Ë¤Ï¡¢
yytext
¤ò¿ô¤ËÊÑ´¹¤¹¤ëºÇÎɤÎÊýË¡¤Ï¡¢
sscanf()
¤ò»È¤¦¤³¤È¤Ç¤¹¡£
/* * numbers.lex : ¿ô¤ò¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤ÎÄêµÁ¤ª¤è¤Ó¥Æ¥¯¥Ë¥Ã¥¯¤Î¼ÂÎã */ %{ #include <stdio.h>
#define UNSIGNED_LONG_SYM 1 #define SIGNED_LONG_SYM 2 #define UNSIGNED_SYM 3 #define SIGNED_SYM 4 #define LONG_DOUBLE_SYM 5 #define FLOAT_SYM 6
union _yylval { long double ylong_double; float yfloat; unsigned long yunsigned_long;
unsigned yunsigned; long ysigned_long; int ysigned; } yylval; %}
digit [0-9] hex_digit [0-9a-fA-F] oct_digit [0-7]
exponent [eE][+-]?{digit}+ i {digit}+ float_constant ({i}\.{i}?|{i}?\.{i}){exponent}? hex_constant 0[xX]{hex_digit}+
oct_constant 0{oct_digit}* int_constant {digit}+ long_ext [lL] unsigned_ext [uU] float_ext [fF] ulong_ext [lL][uU]|[uU][lL]
%% {hex_constant}{ulong_ext} { /* 0x¤ÎÉôʬ¤ò¥¹¥¥Ã¥×¤¹¤ë */ sscanf(&yytext[2],"%lx", &yylval.yunsigned_long); return(UNSIGNED_LONG_SYM); }
{hex_constant}{long_ext} { sscanf(&yytext[2],"%lx", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{hex_constant}{unsigned_ext} { sscanf(&yytext[2],"%x", &yylval.yunsigned); return(UNSIGNED_SYM); }
{hex_constant} { /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò²óÈò¤¹¤ë¤¿¤á¤Ë%lx¤ò»È¤¦ */ sscanf(&yytext[2],"%lx", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{oct_constant}{ulong_ext} { sscanf(yytext,"%lo", &yylval.yunsigned_long); return(UNSIGNED_LONG_SYM); }
{oct_constant}{long_ext} { sscanf(yytext,"%lo", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{oct_constant}{unsigned_ext} { sscanf(yytext,"%o", &yylval.yunsigned); return(UNSIGNED_SYM); }
{oct_constant} { /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò²óÈò¤¹¤ë¤¿¤á¤Ë%lo¤ò»È¤¦ */ sscanf(yytext,"%lo", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{int_constant}{ulong_ext} { sscanf(yytext,"%ld", &yylval.yunsigned_long); return(UNSIGNED_LONG_SYM); }
{int_constant}{long_ext} { sscanf(yytext,"%ld", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{int_constant}{unsigned_ext} { sscanf(yytext,"%d", &yylval.yunsigned); return(UNSIGNED_SYM); }
{int_constant} { /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò²óÈò¤¹¤ë¤¿¤á¤Ë%ld¤ò»È¤¦ */ sscanf(yytext,"%ld", &yylval.ysigned_long); return(SIGNED_LONG_SYM); }
{float_constant}{long_ext} { sscanf(yytext,"%lf", &yylval.ylong_double); return(LONG_DOUBLE_SYM); }
{float_constant}{float_ext} { sscanf(yytext,"%f", &yylval.yfloat); return(FLOAT_SYM); }
{float_constant} { /* ¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤ò²óÈò¤¹¤ë¤¿¤á¤Ë%lf¤ò»È¤¦ */ sscanf(yytext,"%lf", &yylval.ylong_double); return(LONG_DOUBLE_SYM); }
%% int main(void) { int code; while((code = yylex())){ printf("yytext : %s\n",yytext); switch(code){
case UNSIGNED_LONG_SYM: printf("Type of number : UNSIGNED LONG\n"); printf("Value of number : %lu\n", yylval.yunsigned_long); break;
case SIGNED_LONG_SYM: printf("Type of number : SIGNED LONG\n"); printf("Value of number : %ld\n", yylval.ysigned_long); break;
case UNSIGNED_SYM: printf("Type of number : UNSIGNED\n"); printf("Value of number : %u\n", yylval.yunsigned); break;
case SIGNED_SYM: printf("Type of number : SIGNED\n"); printf("Value of number : %d\n", yylval.ysigned); break;
case LONG_DOUBLE_SYM: printf("Type of number : LONG DOUBLE\n"); printf("Value of number : %lf\n", yylval.ylong_double); break;
case FLOAT_SYM: printf("Type of number : FLOAT\n"); printf("Value of number : %f\n", yylval.yfloat); break;
default: printf("Type of number : UNDEFINED\n"); printf("Value of number : UNDEFINED\n"); break; } } return(0); }
16¿ÊÄê¿ô¤Ë¤Ä¤¤¤Æ¤Ï¡¢
ÊÑ´¹¤¹¤ëÁ°¤ËÀèÆ¬¤Î‘0x’¤ò¥¹¥¥Ã¥×¤¹¤ëɬÍפ¬¤¢¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤ì¤Ïsscanf()
¤Î»ÅÍͤǤ¹¡£
Next: Multiple Scanners, Previous: Handling Strings, Up: Useful Code [Contents][Index]