diff options
Diffstat (limited to 'gram.l')
-rw-r--r-- | gram.l | 113 |
1 files changed, 113 insertions, 0 deletions
@@ -0,0 +1,113 @@ +%{ +/* + * This is a lexical analyzer + * + * It comes with an associated grammar. + * + * + * + */ + +#include <stdio.h> +#include <string.h> +#include <stdio.h> + +/* header produced from the parser file with '-d' option of yacc */ +#include "y.tab.h" + +extern int tee (int); +#define RETURN(x) return (tee(x)) + + + +const char* ResWords [] = { + "type", + "name", + "brand", + 0 +}; + +const int ResWordsTokens [] = { + Y_TYPE, + Y_NAME, + Y_BRAND +}; + +int LineNo = 1; + +void +LexInit () +{ + +#ifdef FLEX_SCANNER +static void yyrestart (FILE*); +// yyrestart (0); +#endif + LineNo = 1; +} + + +int +CheckResWord (const char* s) +{ + const char** pp = ResWords; + while (*pp) { + if (strcmp (*pp, s) == 0) + return pp - ResWords; + ++pp; + } + return -1; +} + + +%} + + + +Int [-]?[0-9]+ +Ident [a-zA-Z/\[\]][a-zA-Z.0-9/\[\]]* +nl [\n] +sp0 [ \t]* +sp1 [ \t]+ + +%% + +[:] RETURN (yytext[0]); + +\#.*\n { /* comments */ + ++LineNo; + } + +\".*\" { + char* n = strdup (yytext+1); + n[strlen(yytext) - 1] = '\0'; + yylval.name = n; + RETURN (Y_STRING); + } + +{sp1} {} + +{nl} { + ++LineNo; + RETURN (Y_EOL); + } + +{Int} { + yylval.integer = atoi (yytext); + RETURN (Y_INT); + } + + +{Ident} { + int index = CheckResWord (yytext); + if (index >= 0) { + RETURN (ResWordsTokens[index]); + } else { + yylval.name = strdup (yytext); + RETURN (Y_ID); + } + } + +. { + RETURN (-1); + } |