/* * string2.lex: An example of using scanning strings * by using start states. */ %{ #include #include #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); } \n { yyerror("Unterminated string"); free(buffer); BEGIN(INITIAL); } <> { yyerror("EOF in string"); free(buffer); BEGIN(INITIAL); } [^\\\n"] { buffer = realloc(buffer,buffer_size+yyleng+1); buffer_size += yyleng; strcat(buffer,yytext); } \\\n /* ignore this */ \\{hex} { int temp =0,loop = 0; for(loop=yyleng-2; loop>0; loop--){ temp <<= 4; temp += hextoint(toupper(yytext[yyleng-loop])); } buffer = realloc(buffer,buffer_size+1); buffer[buffer_size-1] = temp; buffer[buffer_size] = '\0'; buffer_size += 1; } \\{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; } \\[^\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; } \" { printf("string = \"%s\"",buffer); free(buffer); BEGIN(INITIAL); } %%