1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
%{
#include <stdio.h>
#include "gram.h"
extern char *progname;
extern int ParseError;
extern FILE *rcfile;
#undef yyin
#define yyin rcfile
#define YY_SKIP_YYWRAP
#define yywrap() 1
extern int parse_keyword(char *);
void fixup_string(char *, char *);
#define YY_SKIP_YYWRAP
%}
%%
\#[^\n]*\n { ; }
\"([^"\n\\]|\\.|\\\n)*\" { fixup_string(yytext, yytext); yylval.ptr=yytext;
return STRING; }
[0-9]+ { yylval.num=atoi(yytext); return NUMBER; }
[a-zA-Z]+ { int token = parse_keyword(yytext);
if(token == ERRORTOKEN) {
fprintf(stderr, "%s: ignoring unknown keyword: %s\n",
progname, yytext);
ParseError=1;
} else
return token;
}
\{ { return LEFTBRACE; }
\} { return RIGHTBRACE; }
[\r\n\t ] { ; }
. { fprintf(stderr, "%s: illegal character \"%s\" ignored\n",
progname, yytext);
ParseError=1; }
%%
void fixup_string(char *src, char *dest)
{
src++;
while(*src!='"')
if((*dest++=*src++)=='\\')
switch((dest[-1]=*src++)) {
case 'n':
dest[-1]='\n';
break;
case 'r':
dest[-1]='\r';
break;
case 'a':
dest[-1]='\a';
break;
case 'b':
dest[-1]='\b';
break;
case 't':
dest[-1]='\t';
break;
case 'e':
dest[-1]='\033';
break;
}
*dest='\0';
}
|