source: trunk/essentials/sys-devel/flex/examples/manual/string2.lex

Last change on this file was 3031, checked in by bird, 18 years ago

flex 2.5.33.

File size: 3.0 KB
Line 
1/*
2 * string2.lex: An example of using scanning strings
3 * by using start states.
4 */
5
6%{
7#include <ctype.h>
8#include <malloc.h>
9
10#define isodigit(x) ((x) >= '0' && (x) <= '7')
11#define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
12
13char *buffer = NULL;
14int buffer_size = 0;
15
16void yyerror(char *message)
17{
18 printf("\nError: %s\n",message);
19}
20
21%}
22
23%x STRING
24
25hex (x|X)[0-9a-fA-F]{1,2}
26oct [0-7]{1,3}
27
28%%
29
30\" {
31 buffer = malloc(1);
32 buffer_size = 1; strcpy(buffer,"");
33 BEGIN(STRING);
34 }
35<STRING>\n {
36 yyerror("Unterminated string");
37 free(buffer);
38 BEGIN(INITIAL);
39 }
40<STRING><<EOF>> {
41 yyerror("EOF in string");
42 free(buffer);
43 BEGIN(INITIAL);
44 }
45<STRING>[^\\\n"] {
46 buffer = realloc(buffer,buffer_size+yyleng+1);
47 buffer_size += yyleng;
48 strcat(buffer,yytext);
49 }
50<STRING>\\\n /* ignore this */
51<STRING>\\{hex} {
52 int temp =0,loop = 0;
53 for(loop=yyleng-2; loop>0; loop--){
54 temp <<= 4;
55 temp += hextoint(toupper(yytext[yyleng-loop]));
56 }
57 buffer = realloc(buffer,buffer_size+1);
58 buffer[buffer_size-1] = temp;
59 buffer[buffer_size] = '\0';
60 buffer_size += 1;
61 }
62<STRING>\\{oct} {
63 int temp =0,loop = 0;
64 for(loop=yyleng-1; loop>0; loop--){
65 temp <<= 3;
66 temp += (yytext[yyleng-loop] - '0');
67 }
68 buffer = realloc(buffer,buffer_size+1);
69 buffer[buffer_size-1] = temp;
70 buffer[buffer_size] = '\0';
71 buffer_size += 1;
72 }
73<STRING>\\[^\n] {
74 buffer = realloc(buffer,buffer_size+1);
75 switch(yytext[yyleng-1]){
76 case 'b' : buffer[buffer_size-1] = '\b'; break;
77 case 't' : buffer[buffer_size-1] = '\t'; break;
78 case 'n' : buffer[buffer_size-1] = '\n'; break;
79 case 'v' : buffer[buffer_size-1] = '\v'; break;
80 case 'f' : buffer[buffer_size-1] = '\f'; break;
81 case 'r' : buffer[buffer_size-1] = '\r'; break;
82 default : buffer[buffer_size-1] = yytext[yyleng-1];
83 }
84 buffer[buffer_size] = '\0';
85 buffer_size += 1;
86 }
87<STRING>\" {
88 printf("string = \"%s\"",buffer);
89 free(buffer);
90 BEGIN(INITIAL);
91 }
92%%
93
94
Note: See TracBrowser for help on using the repository browser.