Next: , Previous: Handling Strings, Up: Useful Code   [Contents][Index]


9.3 ¿ô»ú¤Î½èÍý

¤³¤³¤Ç¤Ï¡¢ 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: , Previous: Handling Strings, Up: Useful Code   [Contents][Index]