%{ #include #include extern FILE *yyin; extern char *yytext; int gPos = 0; char gBuffer[102400]; char *gList[102400]; int gList_Pos = 0; 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); } void Record () { gBuffer[gPos] = '\0'; gList[gList_Pos] = (char *) malloc (strlen (gBuffer)+1); strcpy (gList[gList_Pos++], gBuffer); } void Output () { int i,j; char *temp; for (i=0; i 0) { temp = gList[i]; gList[i] = gList[j]; gList[j] = temp; } fprintf (stdout, "%s%s%s\n", gSeparator, gList[i], gEnd); } } %} %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 %% mystart: lines { if (gFlag == CITATION) Output (); YYACCEPT; } lines: lines line | /* Epsilon move */ ; line: 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) { gRecord = 2; gPos = 0; }} text CITATION_END { if (gFlag == CITATION) Record (); 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]); if (gRecord == 2) gBuffer[gPos++] = 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], "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 (); }