%{ /* * * IRBOX, an Ivy driver for infra-red remote controls * * Copyright 1998-1999 * Centre d'Etudes de la Navigation Aerienne * * This is the lexical analyser for reading tables * * Authors: Stephane Chatty * * $Id$ * * Please refer to file version.h for the * copyright notice regarding this software */ #include #include #include /* 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); }