|
@ -280,12 +280,7 @@ Symbol *intern(char *name){ |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void printSymbolTable() { |
|
|
|
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
|
|
|
int i=printCode(symbolTable.elements[k]->rule); |
|
|
|
|
|
printf("Node *%s= &node%i;\n",symbolTable.elements[k]->name,i); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void setRule(char *name, Node *rule) |
|
|
void setRule(char *name, Node *rule) |
|
|
{ |
|
|
{ |
|
@ -547,79 +542,79 @@ void printVariableName(enum op type, NodeCount count, int increment){ |
|
|
|
|
|
|
|
|
int nodeNumber=0; |
|
|
int nodeNumber=0; |
|
|
|
|
|
|
|
|
int printCode(Node *node) |
|
|
|
|
|
|
|
|
int printCode(FILE *file,Node *node) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
switch (node->type) { |
|
|
switch (node->type) { |
|
|
case String:{ |
|
|
case String:{ |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Query: { |
|
|
case Query: { |
|
|
int i = printCode(node->Query.children[0]); |
|
|
|
|
|
|
|
|
int i = printCode(file,node->Query.children[0]); |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Star: { |
|
|
case Star: { |
|
|
int i = printCode(node->Star.children[0]); |
|
|
|
|
|
|
|
|
int i = printCode(file,node->Star.children[0]); |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Plus:{ |
|
|
case Plus:{ |
|
|
int i = printCode(node->Plus.children[0]); |
|
|
|
|
|
|
|
|
int i = printCode(file,node->Plus.children[0]); |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Or:{ |
|
|
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++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case And:{ |
|
|
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++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Class:{ |
|
|
case Class:{ |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Dot:{ |
|
|
case Dot:{ |
|
|
int thisNumber=nodeNumber++; |
|
|
int thisNumber=nodeNumber++; |
|
|
printf("Node node%i= { .Dot = { Dot}};\n",thisNumber); |
|
|
|
|
|
|
|
|
fprintf(file,"Node node%i= { .Dot = { Dot}};\n",thisNumber); |
|
|
return thisNumber; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Exc:{ |
|
|
case Exc:{ |
|
|
int i = printCode(node->Exc.children[0]); |
|
|
|
|
|
|
|
|
int i = printCode(file,node->Exc.children[0]); |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Et: { |
|
|
case Et: { |
|
|
int i = printCode(node->Et.children[0]); |
|
|
|
|
|
|
|
|
int i = printCode(file,node->Et.children[0]); |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
case Id: { |
|
|
case Id: { |
|
|
int thisNumber=nodeNumber++; |
|
|
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; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -627,10 +622,13 @@ int printCode(Node *node) |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void printlnCode(Node *node) |
|
|
|
|
|
{ |
|
|
|
|
|
printCode(node); |
|
|
|
|
|
printf("\n"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void printSymbolTable(FILE *file) { |
|
|
|
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
|
|
|
int i=printCode(file,symbolTable.elements[k]->rule); |
|
|
|
|
|
fprintf(file,"Node *%s= &node%i;\n",symbolTable.elements[k]->name,i); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int main(int argc, char **argv) |
|
|
int main(int argc, char **argv) |
|
@ -686,8 +684,11 @@ int main(int argc, char **argv) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if( opt_c){ |
|
|
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; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|