%{ #include #include extern FILE *yyin; extern char *yytext; char *gSeparator; char *gEnd; int gFlag = -1; int gRecord = 0; int gLine_Number = 1; void yyerror (char *message) { fprintf (stderr, "%s on line %d\n", message, gLine_Number); } %} %start mystart %token SECTION SECTION_END AUTHOR AUTHOR_END USER USER_END TASK TASK_END %token CITATION CITATION_END PROJECT PROJECT_END PRODUCT PRODUCT_END %token BACKGROUND BACKGROUND_END VIDEO VIDEO_END CHARACTER ALL_AUTHOR %token ALL_AUTHOR_END OWNER OWNER_END %% mystart: lines { YYACCEPT; } lines: lines line | /* Epsilon move */ ; line: OWNER { if (gFlag == OWNER) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text OWNER_END { if (gFlag == OWNER) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | SECTION { if (gFlag == SECTION) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text SECTION_END { if (gFlag == SECTION) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | AUTHOR { if (gFlag == AUTHOR) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text AUTHOR_END { if (gFlag == AUTHOR) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | ALL_AUTHOR { if (gFlag == ALL_AUTHOR) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text ALL_AUTHOR_END { if (gFlag == ALL_AUTHOR) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | USER { if (gFlag == USER) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text USER_END { if (gFlag == USER) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | TASK { if (gFlag == TASK) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text TASK_END { if (gFlag == TASK) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | CITATION { if (gFlag == CITATION) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text CITATION_END { if (gFlag == CITATION) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | PROJECT { if (gFlag == PROJECT) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text PROJECT_END { if (gFlag == PROJECT) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | PRODUCT { if (gFlag == PRODUCT) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text PRODUCT_END { if (gFlag == PRODUCT) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | BACKGROUND { if (gFlag == BACKGROUND) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text BACKGROUND_END { if (gFlag == BACKGROUND) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text | VIDEO { if (gFlag == VIDEO) { fprintf (stdout, "%s", gSeparator); gRecord = 1; }} text VIDEO_END { if (gFlag == VIDEO) fprintf (stdout, "%s\n", gEnd); gRecord = 0; } text ; text: CHARACTER { if (gRecord == 1) fprintf (stdout, "%c", yytext[0]); } text | /* Epsilon move */ ; %% int main (int argc, char *argv[]) /* * */ { if (argc != 5) { fprintf (stderr, "Incorrect number of arguments\n"); exit (-1); } if (!(yyin = fopen (argv[1], "r"))) { fprintf (stderr, "Failed to open input file '%s'\n", argv[1]); exit (-1); } if (!strncasecmp (argv[2], "SECTION", strlen("SECTION"))) gFlag = SECTION; if (!strncasecmp (argv[2], "OWNER", strlen("OWNER"))) gFlag = OWNER; if (!strncasecmp (argv[2], "AUTHOR", strlen("AUTHOR"))) gFlag = AUTHOR; if (!strncasecmp (argv[2], "ALL_AUTHOR", strlen("ALL_AUTHOR"))) gFlag = ALL_AUTHOR; if (!strncasecmp (argv[2], "USER", strlen("USER"))) gFlag = USER; if (!strncasecmp (argv[2], "TASK", strlen("TASK"))) gFlag = TASK; if (!strncasecmp (argv[2], "CITATION", strlen("CITATION"))) gFlag = CITATION; if (!strncasecmp (argv[2], "PROJECT", strlen("PROJECT"))) gFlag = PROJECT; if (!strncasecmp (argv[2], "PRODUCT", strlen("PRODUCT"))) gFlag = PRODUCT; if (!strncasecmp (argv[2], "BACKGROUND", strlen("BACKGROUND"))) gFlag = BACKGROUND; if (!strncasecmp (argv[2], "VIDEO", strlen("VIDEO"))) gFlag = VIDEO; if (gFlag == -1) { fprintf (stderr, "Invalid flag specified\n"); exit (-1); } gSeparator = argv[3]; gEnd = argv[4]; yyparse (); }