Files
amiwm-neo/lex.l
James Le Cuirot 5823492992 Adjust yacc builds to support the original yacc (as opposed to bison)
yacc doesn't support the arguments we've been giving to bison. byacc was
also tested.
2023-10-08 22:15:32 +01:00

70 lines
1.2 KiB
Plaintext

%option noyywrap
%{
#include <stdio.h>
#include "gram.tab.h"
extern char *progname;
extern int ParseError;
extern FILE *rcfile;
#undef yyin
#define yyin rcfile
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';
}