/* Parst eine Zeitangabe der Form: DD.MM.[YY]YY hh:mm[:ss[.sss]] */ %{ #include #include int yylex(); void yyerror(); %} %debug %language "c" %token TWONUM %token WHITESPACE %token THREENUM %% input : /* Nichts */ | zeile '\n' ; zeile : datum WHITESPACE zeit | WHITESPACE datum WHITESPACE zeit WHITESPACE // | error {yyerrok;} ; /* Datum */ datum : TWONUM '.' TWONUM '.' jahr // | error {yyerrok;} ; jahr : TWONUM | TWONUM TWONUM ; /* Zeit */ zeit : TWONUM ':' TWONUM ':' | TWONUM ':' TWONUM ':' TWONUM | TWONUM ':' TWONUM ':' TWONUM '.' THREENUM ; %% int main() { yydebug = 1; yyparse(); return 0; } int yylex() { int zeichen = 0; int zeichenold = 0; /* WHITESPACE */ if( (zeichen = getchar()) == ' ' || zeichen == '\t' ) { while( (zeichen = getchar()) == ' ' || zeichen == '\t') /* überspringe */ ; printf("return WHITESPACE;"); return WHITESPACE; } if(isdigit(zeichen = getchar())) { zeichenold = zeichen; if( isdigit(zeichen = getchar()) ) { if( isdigit(zeichen = getchar()) ) return THREENUM; else { ungetc(zeichen,stdin); printf("return TWONUM;"); return TWONUM; } } else { ungetc(zeichen,stdin); printf("return %d;",zeichenold); return zeichenold; } } if( (zeichen = getchar()) != EOF ) { printf("return %d;",zeichen); return zeichen; } else { printf("return 0;"); return 0; } } /* Called by yyparse on error. */ void yyerror (char const *s) { fprintf (stderr, "%s\n", s); }