diff --git a/parse.leg b/parse.leg index 31370d3..8ed74f4 100644 --- a/parse.leg +++ b/parse.leg @@ -280,12 +280,7 @@ Symbol *intern(char *name){ } -void printSymbolTable() { - for (int k= 0; krule); - printf("Node *%s= &node%i;\n",symbolTable.elements[k]->name,i); - } -} + void setRule(char *name, Node *rule) { @@ -547,79 +542,79 @@ void printVariableName(enum op type, NodeCount count, int increment){ int nodeNumber=0; -int printCode(Node *node) +int printCode(FILE *file,Node *node) { switch (node->type) { case String:{ int thisNumber=nodeNumber++; - printf("Node node%i = { .String = { String, ",thisNumber); - printf("\"%s\"", node->String.string); - printf(" , %i }}; \n",node->String.len); + fprintf(file,"Node node%i = { .String = { String, ",thisNumber); + fprintf(file,"\"%s\"", node->String.string); + fprintf(file," , %i }}; \n",node->String.len); return thisNumber; } case Query: { - int i = printCode(node->Query.children[0]); + int i = printCode(file,node->Query.children[0]); int thisNumber=nodeNumber++; - printf("Node node%i",thisNumber); - printf("= { .Query = { Query, &node%i }};\n",i); + fprintf(file,"Node node%i",thisNumber); + fprintf(file,"= { .Query = { Query, &node%i }};\n",i); return thisNumber; } case Star: { - int i = printCode(node->Star.children[0]); + int i = printCode(file,node->Star.children[0]); int thisNumber=nodeNumber++; - printf("Node node%i",thisNumber); - printf("= { .Star = { Star, &node%i }};\n",i); + fprintf(file,"Node node%i",thisNumber); + fprintf(file,"= { .Star = { Star, &node%i }};\n",i); return thisNumber; } case Plus:{ - int i = printCode(node->Plus.children[0]); + int i = printCode(file,node->Plus.children[0]); int thisNumber=nodeNumber++; - printf("Node node%i = { .Plus = { Plus, &node%i }};\n",thisNumber,i); + fprintf(file,"Node node%i = { .Plus = { Plus, &node%i }};\n",thisNumber,i); return thisNumber; } case Or:{ - int i = printCode(node->Or.children[0]); - int j = printCode(node->Or.children[1]); + int i = printCode(file,node->Or.children[0]); + int j = printCode(file,node->Or.children[1]); int thisNumber=nodeNumber++; - printf("Node node%i= { .Or = { Or, &node%i",thisNumber,i); - printf(" , &node%i }};\n",j); + fprintf(file,"Node node%i= { .Or = { Or, &node%i",thisNumber,i); + fprintf(file," , &node%i }};\n",j); return thisNumber; } case And:{ - int i = printCode(node->And.children[0]); - int j = printCode(node->And.children[1]); + int i = printCode(file,node->And.children[0]); + int j = printCode(file,node->And.children[1]); int thisNumber=nodeNumber++; - printf("Node node%i= { .And = { And, &node%i",thisNumber,i); - printf(" , &node%i }};\n",j); + fprintf(file,"Node node%i= { .And = { And, &node%i",thisNumber,i); + fprintf(file," , &node%i }};\n",j); return thisNumber; } case Class:{ int thisNumber=nodeNumber++; - printf("Node node%i= { .Class = { Class, %s }};\n",thisNumber,node->Class.array); + fprintf(file,"Node node%i= { .Class = { Class, %s }};\n",thisNumber,node->Class.array); return thisNumber; } case Dot:{ int thisNumber=nodeNumber++; - printf("Node node%i= { .Dot = { Dot}};\n",thisNumber); + fprintf(file,"Node node%i= { .Dot = { Dot}};\n",thisNumber); return thisNumber; } case Exc:{ - int i = printCode(node->Exc.children[0]); + int i = printCode(file,node->Exc.children[0]); int thisNumber=nodeNumber++; - printf("Node node%i = { .Exc = { Exc, &node%i }};\n",thisNumber,i); + fprintf(file,"Node node%i = { .Exc = { Exc, &node%i }};\n",thisNumber,i); return thisNumber; } case Et: { - int i = printCode(node->Et.children[0]); + int i = printCode(file,node->Et.children[0]); int thisNumber=nodeNumber++; - printf("Node node%i = { .Et = { Et, &node%i }};\n",thisNumber,i); + fprintf(file,"Node node%i = { .Et = { Et, &node%i }};\n",thisNumber,i); return thisNumber; } case Id: { int thisNumber=nodeNumber++; - printf("Node node%i = { .Id = { Id, %s", thisNumber, get(node,Id, symbol)); - printf(" }};\n"); + fprintf(file,"Node node%i = { .Id = { Id, %s", thisNumber, get(node,Id, symbol)->name); + fprintf(file," }};\n"); return thisNumber; } } @@ -627,10 +622,13 @@ int printCode(Node *node) return 0; } -void printlnCode(Node *node) -{ - printCode(node); - printf("\n"); + + +void printSymbolTable(FILE *file) { + for (int k= 0; krule); + fprintf(file,"Node *%s= &node%i;\n",symbolTable.elements[k]->name,i); + } } int main(int argc, char **argv) @@ -686,8 +684,11 @@ int main(int argc, char **argv) } if( opt_c){ - int i=printCode(intern("start")->rule); - printf("Node *start_rule= &node%i;\n",i); + + //int i=printCode(intern("start")->rule); + //printf("Node *start_rule= &node%i;\n",i); + FILE *outputFile = fopen(opt_c,"w"); + printSymbolTable(outputFile); return 0; }