%{ #define YY_NO_INPUT #include #include #include "pidf.h" /* for PIDF_GetFileName */ #include "symtab.h" #include "pidf.y.tab.h" int pidf_lineno = 1; %} %option nounput %s COMMENT %% \n { pidf_lineno++; } \$.*$ ; /* ignore comments */ [ \t]+ ; /* ignore whitespace */ -?(([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) | -?[0-9]+[eE][-+]?[0-9]+ { yylval.pval = malloc (sizeof (float)); *((float *) yylval.pval) = atof (yytext); return Y_FLOAT_NUM; } -?[0-9]+ { yylval.pval = malloc (sizeof (long)); *((long *) yylval.pval) = atol (yytext); return Y_INT_NUM; } 0x[0-9A-Fa-f]+ { yylval.pval = malloc (sizeof (long)); *((long *) yylval.pval) = strtol (yytext, (char **)NULL, 0); return Y_INT_NUM; } \"[^"\n]*["\n] | \'[^'\n]*['\n] { *(yytext + yyleng - 1) = '\0'; /* remove the last quote */ yylval.sval = strdup (yytext + 1); /* remove the first one */ return Y_QUOTED_STRING; } \/\*.*\*\/ ; \/\* { BEGIN COMMENT; } . ; \*\/ { BEGIN 0;} PIDF | pidf { yylval.ival = Y_PIDF; return Y_PIDF; } STRUCT | struct { yylval.ival = Y_STRUCT; return Y_STRUCT; } INT | int { yylval.ival = Y_INT; return Y_INT; } FLOAT | float { yylval.ival = Y_FLOAT; return Y_FLOAT; } CHAR | char { yylval.ival = Y_CHAR; return Y_CHAR; } STRING | string { yylval.ival = Y_STRING; return Y_STRING; } [a-zA-Z][a-zA-Z0-9_]* { yylval.sval = (void *) strdup (yytext); return Y_NAME; } \* | . { return yytext [0]; } %% int yyerror (char *msg) { static char ErrorPrinted; static char FileName [100]; const char *PIDFFileName = PIDF_GetFileName (); if (strncmp (FileName, PIDFFileName, 100) != 0) ErrorPrinted = 0; if (!ErrorPrinted) { printf ("\nError in %s: Line %d : %s at '%s'\n", PIDFFileName, pidf_lineno, msg, yytext); printf ("\nFix PIDF before continuing...\n\n"); strcpy (FileName, PIDFFileName); ErrorPrinted = 1; } return -1; }