char rcsid_main[] = "$Id$"; #include #include #include "b.h" #include "fe.h" int debugTables = 0; static int simpleTables = 0; static int internals = 0; static int diagnostics = 0; static char *inFileName; static char *outFileName; static char version[] = "BURG, Version 1.0"; extern int main ARGS((int argc, char **argv)); int main(argc, argv) int argc; char **argv; { int i; extern int atoi ARGS((char *)); for (i = 1; argv[i]; i++) { char **needStr = 0; int *needInt = 0; if (argv[i][0] == '-') { switch (argv[i][1]) { case 'V': fprintf(stderr, "%s\n", version); break; case 'p': needStr = (char**)&prefix; break; case 'o': needStr = &outFileName; break; case 'I': internals = 1; break; case 'T': simpleTables = 1; break; case '=': #ifdef NOLEX fprintf(stderr, "'%s' was not compiled to support lexicographic ordering\n", argv[0]); #else lexical = 1; #endif /* NOLEX */ break; case 'O': needInt = &principleCost; break; case 'c': needInt = &prevent_divergence; break; case 'e': needInt = &exceptionTolerance; break; case 'd': diagnostics = 1; break; case 'S': speedflag = 1; break; case 't': trimflag = 1; break; case 'G': grammarflag = 1; break; default: fprintf(stderr, "Bad option (%s)\n", argv[i]); exit(1); } } else { if (inFileName) { fprintf(stderr, "Unexpected Filename (%s) after (%s)\n", argv[i], inFileName); exit(1); } inFileName = argv[i]; } if (needInt || needStr) { char *v; char *opt = argv[i]; if (argv[i][2]) { v = &argv[i][2]; } else { v = argv[++i]; if (!v) { fprintf(stderr, "Expection argument after %s\n", opt); exit(1); } } if (needInt) { *needInt = atoi(v); } else if (needStr) { *needStr = v; } } } if (inFileName) { if(freopen(inFileName, "r", stdin)==NULL) { fprintf(stderr, "Failed opening (%s)", inFileName); exit(1); } } if (outFileName) { if ((outfile = fopen(outFileName, "w")) == NULL) { fprintf(stderr, "Failed opening (%s)", outFileName); exit(1); } } else { outfile = stdout; } yyparse(); if (!rules) { fprintf(stderr, "ERROR: No rules present\n"); exit(1); } findChainRules(); findAllPairs(); doGrammarNts(); build(); debug(debugTables, foreachList((ListFn) dumpOperator_l, operators)); debug(debugTables, printf("---final set of states ---\n")); debug(debugTables, dumpMapping(globalMap)); startBurm(); makeNts(); if (simpleTables) { makeSimple(); } else { makePlanks(); } startOptional(); makeLabel(); makeKids(); if (internals) { makeChild(); makeOpLabel(); makeStateLabel(); } endOptional(); makeOperatorVector(); makeNonterminals(); if (internals) { makeOperators(); makeStringArray(); makeRuleDescArray(); makeCostArray(); makeDeltaCostArray(); makeStateStringArray(); makeNonterminalArray(); /* makeLHSmap(); */ } makeClosureArray(); if (diagnostics) { reportDiagnostics(); } yypurge(); exit(0); }