%Start RULES EPILOG COMMENT ACTION #include char *PgmName=0; int ShowLit=0; int ShowProd=1; int ShowBNF=0; int ProdNum=0; int FirstProd=0; int ErrorCnt=0; int DocStyle=0; int Number=1; void main(argc, argv) int argc; char **argv; { PgmName = *argv; --argc, ++argv; while (argc && ((**argv == '-') || (**argv == '+'))) { char *cp=&argv[0][1]; while (*cp) { switch (*cp) { case 'p': case 'P': ShowProd = (**argv == '-') ? 0 : 1; break; case 'l': case 'L': ShowLit = (**argv == '-') ? 0 : 1; break; case 'b': case 'B': ShowBNF = (**argv == '-') ? 0 : 1; break; case 'd': case 'D': DocStyle = (**argv == '-') ? 0 : 1; break; case 'n': case 'N': Number = (**argv == '-') ? 0 : 1; break; default: fprintf(stderr, "Usage: %s [(-|+)dplb] [filename]\n", PgmName); exit(-1); } ++cp; } --argc, ++argv; } if (argc && (freopen(*argv, "r", stdin) == NULL)) { perror(PgmName); exit(-1); } yylex(); exit(ErrorCnt); } %% "\n\n""\n"* printf("\n"); ^"#line".*"\n" ; ^"%token"[ \t]* printf("\%token\t "); . ECHO; ^"%%" ECHO; printf("\n"); BEGIN RULES; "/*" BEGIN COMMENT; ^[a-z][a-z0-9_]*":" { ++ProdNum; FirstProd=1; Derivation(DocStyle, ProdNum, yytext); } ^[ \t][ \t]*[|]?[ ]?[a-zA-Z'{}].*"\n" ECHO; ^[ \t]*";".*"\n" printf("%s", yytext); break; ^[ \t][ \t]*"\n" ; ^"%%\n" ECHO; BEGIN EPILOG; .|"\n" ; %% /* "*.../" BEGIN RULES; .|"\n" ; "<<"[a-zA-Z][a-zA-Z_0-9]*">>" Production(yytext); r"[^"]*\" | \"\"\" Literal(yytext); "::=" | ".." | "+" | "*" | "|" | "[" | "]" BNFStuff(yytext); " " ; "\t" ; "\n" ; . Unknown(yytext); */ int Derivation(int docStyle, int prodNum, char * text) { if (ShowProd) { if (docStyle) { if (Number) { printf("%3d. %s\n", prodNum, yytext); } else { printf("%s\n", yytext); } } else { printf("%-60s %s %3d. %s ", yytext, "/*", ProdNum, "*/"); } } } int Production(text) char *text; { if (ShowProd) { if (FirstProd) { FirstProd = 0; printf("%s\t00\t%02d\n", text, ProdNum); } else { printf("%s\t%02d\n", text, ProdNum); } } } int Literal(text) char *text; { if (ShowLit) printf("%s\t%02d\n", text, ProdNum); } int BNFStuff(text) char *text; { if (ShowBNF) printf("%s\tBNF\n", text); } int Unknown(text) char *text; { printf("%s\t%02d -Unknown-\n", text, ProdNum); ++ErrorCnt; }