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

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

flex 2.5.33.

File size: 2.5 KB
Line 
1/*
2 * string1.lex: Handling strings by using input()
3 */
4
5%{
6#include <ctype.h>
7#include <malloc.h>
8
9#define ALLOC_SIZE 32 /* for (re)allocating the buffer */
10
11#define isodigit(x) ((x) >= '0' && (x) <= '7')
12#define hextoint(x) (isdigit((x)) ? (x) - '0' : ((x) - 'A') + 10)
13
14void yyerror(char *message)
15{
16 printf("\nError: %s\n",message);
17}
18
19%}
20
21%%
22
23\" {
24 int inch,count,max_size;
25 char *buffer;
26 int temp;
27
28 buffer = malloc(ALLOC_SIZE);
29 max_size = ALLOC_SIZE;
30 inch = input();
31 count = 0;
32 while(inch != EOF && inch != '"' && inch != '\n'){
33 if(inch == '\\'){
34 inch = input();
35 switch(inch){
36 case '\n': inch = input(); break;
37 case 'b' : inch = '\b'; break;
38 case 't' : inch = '\t'; break;
39 case 'n' : inch = '\n'; break;
40 case 'v' : inch = '\v'; break;
41 case 'f' : inch = '\f'; break;
42 case 'r' : inch = '\r'; break;
43 case 'X' :
44 case 'x' : inch = input();
45 if(isxdigit(inch)){
46 temp = hextoint(toupper(inch));
47 inch = input();
48 if(isxdigit(inch)){
49 temp = (temp << 4) + hextoint(toupper(inch));
50 } else {
51 unput(inch);
52 }
53 inch = temp;
54 } else {
55 unput(inch);
56 inch = 'x';
57 }
58 break;
59 default:
60 if(isodigit(inch)){
61 temp = inch - '0';
62 inch = input();
63 if(isodigit(inch)){
64 temp = (temp << 3) + (inch - '0');
65 } else {
66 unput(inch);
67 goto done;
68 }
69 inch = input();
70 if(isodigit(inch)){
71 temp = (temp << 3) + (inch - '0');
72 } else {
73 unput(inch);
74 }
75 done:
76 inch = temp;
77 }
78 }
79 }
80 buffer[count++] = inch;
81 if(count >= max_size){
82 buffer = realloc(buffer,max_size + ALLOC_SIZE);
83 max_size += ALLOC_SIZE;
84 }
85 inch = input();
86 }
87 if(inch == EOF || inch == '\n'){
88 yyerror("Unterminated string.");
89 }
90 buffer[count] = '\0';
91 printf("String = \"%s\"\n",buffer);
92 free(buffer);
93 }
94.
95\n
96%%
97
98
Note: See TracBrowser for help on using the repository browser.