Blame examples/manual/string2.lex

Packit f00812
/*
Packit f00812
 * string2.lex: An example of using scanning strings
Packit f00812
 *              by using start states.
Packit f00812
 */
Packit f00812
Packit f00812
%{
Packit f00812
#include <ctype.h>
Packit f00812
#include <malloc.h>
Packit f00812
Packit f00812
#define isodigit(x) ((x) >= '0' && (x) <= '7') 
Packit f00812
#define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)  
Packit f00812
Packit f00812
char *buffer      = NULL;
Packit f00812
int  buffer_size  = 0;
Packit f00812
Packit f00812
void yyerror(char *message)
Packit f00812
{
Packit f00812
  printf("\nError: %s\n",message);
Packit f00812
}
Packit f00812
Packit f00812
%}
Packit f00812
Packit f00812
%x STRING
Packit f00812
Packit f00812
hex (x|X)[0-9a-fA-F]{1,2}
Packit f00812
oct [0-7]{1,3}
Packit f00812
Packit f00812
%%
Packit f00812
Packit f00812
\"                 { 
Packit f00812
                     buffer      = malloc(1); 
Packit f00812
                     buffer_size = 1; strcpy(buffer,"");
Packit f00812
                     BEGIN(STRING);
Packit f00812
                   }
Packit f00812
<STRING>\n         {
Packit f00812
                      yyerror("Unterminated string");       
Packit f00812
                      free(buffer);
Packit f00812
                      BEGIN(INITIAL);
Packit f00812
                   }
Packit f00812
<STRING><<EOF>>    {
Packit f00812
                      yyerror("EOF in string");       
Packit f00812
                      free(buffer);
Packit f00812
                      BEGIN(INITIAL);
Packit f00812
                   }
Packit f00812
<STRING>[^\\\n"]   {
Packit f00812
                     buffer = realloc(buffer,buffer_size+yyleng+1);
Packit f00812
                     buffer_size += yyleng;
Packit f00812
                     strcat(buffer,yytext);
Packit f00812
                   }
Packit f00812
<STRING>\\\n       /* ignore this */
Packit f00812
<STRING>\\{hex}    {
Packit f00812
                     int temp =0,loop = 0;
Packit f00812
                     for(loop=yyleng-2; loop>0; loop--){
Packit f00812
                       temp  <<= 4;
Packit f00812
                       temp  += hextoint(toupper(yytext[yyleng-loop]));
Packit f00812
                     } 
Packit f00812
                     buffer = realloc(buffer,buffer_size+1);
Packit f00812
                     buffer[buffer_size-1] = temp;
Packit f00812
                     buffer[buffer_size]   = '\0';
Packit f00812
                     buffer_size += 1;
Packit f00812
                   }
Packit f00812
<STRING>\\{oct}    {
Packit f00812
                     int temp =0,loop = 0;
Packit f00812
                     for(loop=yyleng-1; loop>0; loop--){
Packit f00812
                       temp  <<= 3;
Packit f00812
                       temp  += (yytext[yyleng-loop] - '0');
Packit f00812
                     } 
Packit f00812
                     buffer = realloc(buffer,buffer_size+1);
Packit f00812
                     buffer[buffer_size-1] = temp;
Packit f00812
                     buffer[buffer_size]   = '\0';
Packit f00812
                     buffer_size += 1;
Packit f00812
                   }
Packit f00812
<STRING>\\[^\n]    {
Packit f00812
                     buffer = realloc(buffer,buffer_size+1);
Packit f00812
                     switch(yytext[yyleng-1]){
Packit f00812
                     case 'b' : buffer[buffer_size-1] = '\b';  break;
Packit f00812
                     case 't' : buffer[buffer_size-1] = '\t';  break;
Packit f00812
                     case 'n' : buffer[buffer_size-1] = '\n';  break;
Packit f00812
                     case 'v' : buffer[buffer_size-1] = '\v';  break;
Packit f00812
                     case 'f' : buffer[buffer_size-1] = '\f';  break;
Packit f00812
                     case 'r' : buffer[buffer_size-1] = '\r';  break;
Packit f00812
                     default  : buffer[buffer_size-1] = yytext[yyleng-1];
Packit f00812
                     }
Packit f00812
                     buffer[buffer_size] = '\0';
Packit f00812
                     buffer_size += 1;
Packit f00812
                   }
Packit f00812
<STRING>\"         {
Packit f00812
                     printf("string = \"%s\"",buffer); 
Packit f00812
                     free(buffer);
Packit f00812
                     BEGIN(INITIAL);
Packit f00812
                   }
Packit f00812
%%
Packit f00812
Packit f00812