%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); } %% [^%]|\%[^%] ; ^"%%" BEGIN RULES; ^%% BEGIN EPILOG; "/*" BEGIN COMMENT; ^[a-z][a-z0-9_]*":" { ++ProdNum; FirstProd=1; Derivation(DocStyle, ProdNum, yytext); } ^[ \t][ \t]*[|\[]?[ ]?[a-zA-Z'\[\]{}].*"\n" ECHO; ^[ \t]*";".*"\n" Semicolon(DocStyle, yytext); "//".*"\n" ; ^[ \t][ \t]*"|"[ \t]*"\n" ECHO; "*/" BEGIN RULES; . ; "\n" ; %% int Semicolon(int docStyle, char * text) { if (ShowProd) { if (docStyle) { printf(";\n"); } else { printf("%s\n", 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 \n", 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; } /* "<<"[a-zA-Z][a-zA-Z_0-9]*">>" Production(yytext); r"[^"]*\" | \"\"\" Literal(yytext); "::=" | ".." | "+" | "*" | "|" | "[" | "]" BNFStuff(yytext); " " ; "\t" ; "\n" ; . Unknown(yytext); */