7 typedef struct _Scanner {
29 void scan_init( Scanner *s, FILE *file )
31 memset (s, '\0', sizeof(Scanner));
36 #define TK_NO_TOKEN (-1)
39 #define TK_Identifier 130
48 #define ret_tok( _tok ) token = _tok; s->data = s->tokstart
50 int scan( Scanner *s )
54 int token = TK_NO_TOKEN;
59 printf("scanner: need more data\n");
61 if ( s->tokstart == 0 )
64 /* There is data that needs to be shifted over. */
65 printf("scanner: buffer broken mid token\n");
66 s->have = pe - s->tokstart;
67 memmove( s->buf, s->tokstart, s->have );
68 s->tokend -= (s->tokstart-s->buf);
73 space = BUFSIZE - s->have;
76 /* We filled up the buffer trying to scan a token. */
77 printf("scanner: out of buffer space\n");
82 printf("scanner: end of file\n");
87 readlen = fread( p, 1, space, s->file );
88 if ( readlen < space )
102 ( [a-zA-Z_] [a-zA-Z0-9_]* ) =>
103 { ret_tok( TK_Identifier ); fbreak; };
110 { ret_tok( TK_Number ); fbreak; };
114 { ret_tok( TK_EOF ); fbreak; };
118 { ret_tok( *p ); fbreak; };
125 if ( s->cs == Scanner_error )
128 if ( token != TK_NO_TOKEN ) {
129 /* Save p and pe. fbreak does not advance p. */
132 s->len = s->p - s->data;
139 int main (int argc, char** argv)
144 scan_init(&ss, stdin);
148 if ( tok == TK_EOF ) {
149 printf ("parser: EOF\n");
152 else if ( tok == TK_ERR ) {
153 printf ("parser: ERR\n");
157 printf ("parser: %d \"", tok);
158 fwrite ( ss.data, 1, ss.len, stdout );