forked from OSchip/llvm-project
183 lines
3.1 KiB
C
183 lines
3.1 KiB
C
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);
|
|
}
|