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]