Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

180 lines
2.6 KiB

%Start RULES EPILOG COMMENT ACTION
#include <stdio.h>
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;
<RULES>^%% BEGIN EPILOG;
<RULES>"/*" BEGIN COMMENT;
<RULES>^[a-z][a-z0-9_]*":" {
++ProdNum; FirstProd=1;
Derivation(DocStyle, ProdNum, yytext);
}
<RULES>^[ \t][ \t]*[|\[]?[ ]?[a-zA-Z'\[\]{}].*"\n" ECHO;
<RULES>^[ \t]*";".*"\n" Semicolon(DocStyle, yytext);
<RULES>"//".*"\n" ;
<RULES>^[ \t][ \t]*"|"[ \t]*"\n" ECHO;
<COMMENT>"*/" BEGIN RULES;
<EPILOG>. ;
<EPILOG>"\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;
}
/*
<EPILOG>"<<"[a-zA-Z][a-zA-Z_0-9]*">>" Production(yytext);
<EPILOG>r"[^"]*\" |
\"\"\" Literal(yytext);
<EPILOG>"::=" |
".." |
"+" |
"*" |
"|" |
"[" |
"]" BNFStuff(yytext);
<EPILOG>" " ;
<EPILOG>"\t" ;
<EPILOG>"\n" ;
<EPILOG>. Unknown(yytext);
*/