lquint преди 3 години
родител
ревизия
2af88d5eee
променени са 1 файла, в които са добавени 41 реда и са изтрити 40 реда
  1. +41
    -40
      parse.leg

+ 41
- 40
parse.leg Целия файл

@ -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)
{
@ -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; 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)
@ -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;
}

Зареждане…
Отказ
Запис