Next: Handling Numbers, Previous: Handling Comments, Up: Useful Code [Contents][Index]
ʸ»úÎó¤Ï¡¢
¤½¤ì¤¬ÆþÎϤȤ·¤ÆÍ¿¤¨¤é¤ì¤¿»þ¤ËÇË´þ¤µ¤ì¤Ê¤¤¤È¤¤¤¦ÅÀ¤Ç¡¢
¥³¥á¥ó¥È¤È¤Ï¼ã´³°Û¤Ê¤ê¤Þ¤¹¡£
¤·¤«¤·¡¢
´ðËÜŪ¤Ê¥¢¥×¥í¡¼¥Á¤ÏƱ¤¸¤Ç¤¹¡£
Â裱¤ÎÊýË¡¤È¤·¤Æ¤Ï¡¢
input()
¤ò»È¤Ã¤ÆÊ¸»úÎó¤ò½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¥³¡¼¥É¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
/* * string1.lex: input()¤ò»È¤Ã¤ÆÊ¸»úÎó¤ò½èÍý¤¹¤ë */ %{ #include <stdio.h> #include <malloc.h> #include <ctype.h> #define ALLOC_SIZE 32 /* ¥Ð¥Ã¥Õ¥¡¤Î¡ÊºÆ¡Ë³ä¤êÅö¤ÆÍÑ */ #define isodigit(x) ((x) >= '0' && (x) <= '7') #define hextoint(x) (isdigit((x)) ? (x) - '0'\ : ((x) - 'A') + 10)
void yyerror(char *message) { printf("\nError: %s\n",message); } %}
%% \" { int inch,count,max_size; char *buffer; int temp;
buffer = malloc(ALLOC_SIZE); max_size = ALLOC_SIZE; inch = input(); count = 0;
while(inch != EOF && inch != '"' && inch != '\n'){ if(inch == '\\'){ inch = input(); switch(inch){ case '\n': inch = input(); break; case 'b' : inch = '\b'; break; case 't' : inch = '\t'; break; case 'n' : inch = '\n'; break; case 'v' : inch = '\v'; break; case 'f' : inch = '\f'; break;
case 'r' : inch = '\r'; break; case 'X' : case 'x' : inch = input(); if(isxdigit(inch)){ temp = hextoint(toupper(inch)); inch = input();
if(isxdigit(inch)){ temp = (temp << 4) + hextoint(toupper(inch)); } else { unput(inch); } inch = temp; } else { unput(inch); inch = 'x'; } break;
default: if(isodigit(inch)){ temp = inch - '0'; inch = input();
if(isodigit(inch)){ temp = (temp << 3) + (inch - '0'); } else { unput(inch); goto done; } inch = input();
if(isodigit(inch)){ temp = (temp << 3) + (inch - '0'); } else { unput(inch); } done: inch = temp; } } }
buffer[count++] = inch; if(count >= max_size){ buffer = realloc(buffer,max_size + ALLOC_SIZE); max_size += ALLOC_SIZE; } inch = input(); }
if(inch == EOF || inch == '\n'){ yyerror("Unterminated string."); } buffer[count] = '\0'; printf("String = \"%s\"\n",buffer); free(buffer); } . \n %%
¤³¤Î¥¹¥¥ã¥Ê¤Ï¡¢ Ê£¿ô¹Ô¤Ë¤ï¤¿¤ëʸ»úÎó¤ä¡¢ ÍÍ¡¹¤Ê¥¨¥¹¥±¡¼¥×¡¦¥·¡¼¥±¥ó¥¹¤ò½èÍý¤·¤Þ¤¹¡£ ¤Þ¤¿¡¢ ʸ»úÎ󤬤ɤΤ褦¤ÊŤµ¤Ç¤â¹½¤ï¤Ê¤¤¤è¤¦¤Ë¡¢ ưŪ¥Ð¥Ã¥Õ¥¡¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤ÈƱ¤¸¤³¤È¤ò¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤Ã¤Æ¹Ô¤¦¥³¡¼¥É¤Ï¡¢ °Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
/* * string2.lex: ¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤Ã¤ÆÊ¸»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ëÎã */ %{ #include <ctype.h>
#define isodigit(x) ((x) >= '0' && (x) <= '7') #define hextoint(x) (isdigit((x)) ? (x) - '0' \ : ((x) - 'A') + 10)
char *buffer = NULL; int buffer_size = 0;
void yyerror(char *message) { printf("\nError: %s\n",message); } %} %x STRING hex (x|X)[0-9a-fA-F]{1,2} oct [0-7]{1,3}
%% \" { buffer = malloc(1); buffer_size = 1; strcpy(buffer,""); BEGIN(STRING); }
<STRING>\n { yyerror("Unterminated string"); free(buffer); BEGIN(INITIAL); }
<STRING><<EOF>> { yyerror("EOF in string"); free(buffer); BEGIN(INITIAL); }
<STRING>[^\\\n"] { buffer_size += yyleng; buffer = realloc(buffer,buffer_size+1); strcat(buffer,yytext); }
<STRING>\\\n /* ¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿²þ¹Ô¤ò̵»ë¤¹¤ë */ <STRING>\\{hex} { int temp =0,loop = 0, foo; for(loop=yyleng-2; loop>0; loop--){ temp <<= 4; foo = toupper(yytext[yyleng-loop]); temp += hextoint(foo); } buffer = realloc(buffer,buffer_size+1); buffer[buffer_size-1] = temp; buffer[buffer_size] = '\0'; buffer_size += 1; }
<STRING>\\{oct} { int temp =0,loop = 0; for(loop=yyleng-1; loop>0; loop--){ temp <<= 3; temp += (yytext[yyleng-loop] - '0'); } buffer = realloc(buffer,buffer_size+1); buffer[buffer_size-1] = temp; buffer[buffer_size] = '\0'; buffer_size += 1; }
<STRING>\\[^\n] { buffer = realloc(buffer,buffer_size+1); switch(yytext[yyleng-1]){ case 'b' : buffer[buffer_size-1] = '\b'; break; case 't' : buffer[buffer_size-1] = '\t'; break;
case 'n' : buffer[buffer_size-1] = '\n'; break; case 'v' : buffer[buffer_size-1] = '\v'; break; case 'f' : buffer[buffer_size-1] = '\f'; break;
case 'r' : buffer[buffer_size-1] = '\r'; break; default : buffer[buffer_size-1] = yytext[yyleng-1]; } buffer[buffer_size] = '\0'; buffer_size += 1; }
<STRING>\" { printf("string = \"%s\"",buffer); free(buffer); BEGIN(INITIAL); } %%
¤³¤Î¥¹¥¥ã¥Ê¤Ï¡¢
string1.lex
¤è¤ê¤â¥â¥¸¥å¡¼¥ë²½¤µ¤ì¤Æ¤¤¤Æ¡¢
¤ª¤½¤é¤¯¤Ï¤è¤êʬ¤«¤ê¤ä¤¹¤¤¤Ç¤·¤ç¤¦¡£
¥¨¥é¡¼¤Î¥ë¡¼¥ë¤Ï¡¢
INITIAL
¾õÂÖ¤ËÌá¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
¤³¤¦¤·¤Ê¤¤¤È¡¢
¥¹¥¥ã¥Ê¤ÏÉÔÅö¤Êʸ»úÎó¤ÈÀµÅö¤Êʸ»úÎó¤È¤ò·ë¹ç¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
¤³¤³¤Ç¤â¡¢
Flex¤Î¥Ð¥Ã¥Õ¥¡¡ÊYY_BUF_SIZE
¡Ë¤¬½½Ê¬¤ËÂ礤¤¤È¤¤¤¦¤³¤È¤ò¤¢¤Æ¤Ë¤»¤º¡¢
ưŪ¥Ð¥Ã¥Õ¥¡¤ò»È¤¤¤Þ¤·¤¿¡£
ÆâÉô¥Ð¥Ã¥Õ¥¡¤¬½½Ê¬¤ËÂ礤¤¤È¤¤¤¦³Î¿®¤¬»ý¤Æ¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢
yytext
¤À¤±¤ò»È¤¦¤³¤È¤â²Äǽ¤Ç¤¹¡£
¤³¤Î¾ì¹ç¤Ë¤Ï¡¢
yytext
¤Î±¦Ã¼¤¬³Î¼Â¤ËºÇ½é¤Î°ÌÃÖ¤Ëα¤Þ¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬½ÅÍפǤ¹¡£
¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ë¤Ä¤¤¤Æ¤Ï¡¢
Flex and C¤Îyymore
¤Î¹à¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
Next: Handling Numbers, Previous: Handling Comments, Up: Useful Code [Contents][Index]