| char rcsid_main[] = "$Id$"; |
| |
| #include <math.h> |
| #include <stdio.h> |
| #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((const 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); |
| } |