mirror of https://github.com/lianthony/NT4.0
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.
167 lines
2.5 KiB
167 lines
2.5 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);
|
|
}
|
|
|
|
%%
|
|
|
|
"\n\n""\n"* printf("\n");
|
|
^"#line".*"\n" ;
|
|
^"%token"[ \t]* printf("\%token\t ");
|
|
. ECHO;
|
|
|
|
^"%%" ECHO; printf("\n"); BEGIN RULES;
|
|
|
|
<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" printf("%s", yytext); break;
|
|
<RULES>^[ \t][ \t]*"\n" ;
|
|
|
|
<RULES>^"%%\n" ECHO; BEGIN EPILOG;
|
|
|
|
<EPILOG>.|"\n" ;
|
|
%%
|
|
|
|
/*
|
|
<COMMENT>"*.../" BEGIN RULES;
|
|
<COMMENT>.|"\n" ;
|
|
|
|
<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);
|
|
*/
|
|
|
|
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;
|
|
}
|