|
@ -165,7 +165,9 @@ void print(Node *node) |
|
|
return; |
|
|
return; |
|
|
case Class: |
|
|
case Class: |
|
|
printf("Class"); |
|
|
printf("Class"); |
|
|
printf("\"%s\"", node->Class.array); |
|
|
|
|
|
|
|
|
for(int i=0;i<32;i++){ |
|
|
|
|
|
printf("\\%03o",(unsigned char)node->Class.array[i]); |
|
|
|
|
|
} |
|
|
return; |
|
|
return; |
|
|
case Dot: |
|
|
case Dot: |
|
|
printf("Dot"); |
|
|
printf("Dot"); |
|
@ -206,9 +208,15 @@ else { \ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Symbol *intern(char *name){ |
|
|
|
|
|
|
|
|
Symbol *intern(char *string){ |
|
|
int left=0,right=symbolTable.length-1; |
|
|
int left=0,right=symbolTable.length-1; |
|
|
|
|
|
|
|
|
|
|
|
char *name = strdup(string),*p =name; |
|
|
|
|
|
while(*p){ |
|
|
|
|
|
if(*p=='-'){ |
|
|
|
|
|
*p='_'; |
|
|
|
|
|
} |
|
|
|
|
|
p++; |
|
|
|
|
|
} |
|
|
while (left<=right) { |
|
|
while (left<=right) { |
|
|
int middle=(left+right)/2; |
|
|
int middle=(left+right)/2; |
|
|
int comp=strcmp(name,symbolTable.elements[middle]->name); |
|
|
int comp=strcmp(name,symbolTable.elements[middle]->name); |
|
@ -220,6 +228,7 @@ Symbol *intern(char *name){ |
|
|
left=middle+1; |
|
|
left=middle+1; |
|
|
} |
|
|
} |
|
|
else{ |
|
|
else{ |
|
|
|
|
|
free(name); |
|
|
return symbolTable.elements[middle]; |
|
|
return symbolTable.elements[middle]; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -227,8 +236,9 @@ Symbol *intern(char *name){ |
|
|
symbolTable.elements= realloc(symbolTable.elements,sizeof(symbolTable.elements[0]) * (symbolTable.length+1)); |
|
|
symbolTable.elements= realloc(symbolTable.elements,sizeof(symbolTable.elements[0]) * (symbolTable.length+1)); |
|
|
memmove(symbolTable.elements+left+1,symbolTable.elements+left,(symbolTable.length-left)*sizeof(symbolTable.elements[0])); |
|
|
memmove(symbolTable.elements+left+1,symbolTable.elements+left,(symbolTable.length-left)*sizeof(symbolTable.elements[0])); |
|
|
symbolTable.length++; |
|
|
symbolTable.length++; |
|
|
return symbolTable.elements[left]=createSymbol(name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Symbol *s= symbolTable.elements[left]=createSymbol(name); |
|
|
|
|
|
free(name); |
|
|
|
|
|
return s; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -269,9 +279,10 @@ atom = string | class | dot | rule | '(' - expression ')' - |
|
|
|
|
|
|
|
|
rule = i:id !'=' { $$ = mkId(intern(yytext)) } |
|
|
rule = i:id !'=' { $$ = mkId(intern(yytext)) } |
|
|
|
|
|
|
|
|
id = < [a-zA-z_][a-zA-z_0-9]* > - { $$ = mkId(intern(yytext)) } |
|
|
|
|
|
|
|
|
id = < [a-zA-z_\-][a-zA-z_0-9]* > - { $$ = mkId(intern(yytext)) } |
|
|
|
|
|
|
|
|
string = '"' < [^\"]* > '"' - { $$ = mkString(yytext) } |
|
|
|
|
|
|
|
|
string = '"' < [^\"]* > '"' - { $$ = mkString(unescapedString(yytext)) } |
|
|
|
|
|
| "'" < [^\']* > "'" - { $$ = mkString(unescapedString(yytext)) } |
|
|
|
|
|
|
|
|
class = '['-<(!']'.)*> ']' - { $$=mkClass(classify(yytext)) } |
|
|
class = '['-<(!']'.)*> ']' - { $$=mkClass(classify(yytext)) } |
|
|
|
|
|
|
|
@ -313,102 +324,7 @@ NodeCount nodeCount={ |
|
|
.Id=0 |
|
|
.Id=0 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
void printVariableName(enum op type, NodeCount count, int increment){ |
|
|
|
|
|
char number[50] ; |
|
|
|
|
|
char *dest=malloc(30); |
|
|
|
|
|
size_t n; |
|
|
|
|
|
switch(type){ |
|
|
|
|
|
case String : |
|
|
|
|
|
printf("string%i",nodeCount.String); |
|
|
|
|
|
if(increment==1)nodeCount.String++; |
|
|
|
|
|
break; |
|
|
|
|
|
case Query : |
|
|
|
|
|
if(increment==1)nodeCount.Query++; |
|
|
|
|
|
number[0]=nodeCount.Query+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"query",5); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Star: |
|
|
|
|
|
printf("star%i",nodeCount.Star); |
|
|
|
|
|
if(increment==1) nodeCount.Star++; |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Plus : |
|
|
|
|
|
if(increment==1) nodeCount.Plus++; |
|
|
|
|
|
number[0]=nodeCount.Plus+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"plus",4); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Or : |
|
|
|
|
|
if(increment==1) nodeCount.Or++; |
|
|
|
|
|
number[0]=nodeCount.Or+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"or",2); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case And: |
|
|
|
|
|
if(increment==1) nodeCount.And++; |
|
|
|
|
|
number[0]=nodeCount.And+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"and",3); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Class: |
|
|
|
|
|
if(increment==1)nodeCount.Class++; |
|
|
|
|
|
number[0]=nodeCount.Class+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"class",5); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Dot: |
|
|
|
|
|
if(increment==1) nodeCount.Dot++; |
|
|
|
|
|
number[0]=nodeCount.Dot+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"dot",3); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Exc: |
|
|
|
|
|
if(increment==1) nodeCount.Exc++; |
|
|
|
|
|
number[0]=nodeCount.Exc+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"exc",3); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Et: |
|
|
|
|
|
if(increment==1) nodeCount.Et++; |
|
|
|
|
|
number[0]=nodeCount.Et+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"et",2); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case Id: |
|
|
|
|
|
if(increment==1) nodeCount.Id++; |
|
|
|
|
|
number[0]=nodeCount.Id+'0'; |
|
|
|
|
|
n = strlen(number); |
|
|
|
|
|
strncpy(dest,"id",2); |
|
|
|
|
|
strncat(dest, number, n); |
|
|
|
|
|
printf("%s ",dest); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int nodeNumber=0; |
|
|
int nodeNumber=0; |
|
|
|
|
|
|
|
@ -420,7 +336,20 @@ int printCode(FILE *file,Node *node) |
|
|
case String:{ |
|
|
case String:{ |
|
|
|
|
|
|
|
|
fprintf(file,"Node node%i = { .String = { String, ",thisNumber); |
|
|
fprintf(file,"Node node%i = { .String = { String, ",thisNumber); |
|
|
fprintf(file,"\"%s\"", node->String.string); |
|
|
|
|
|
|
|
|
fprintf(file,"\""); |
|
|
|
|
|
for(int i=0;i<node->String.len;i++){ |
|
|
|
|
|
int c = (unsigned char) node->String.string[i]; |
|
|
|
|
|
switch(c) { |
|
|
|
|
|
case '"': |
|
|
|
|
|
case '\\': |
|
|
|
|
|
fprintf(file,"\\%c",c); |
|
|
|
|
|
continue; |
|
|
|
|
|
default : |
|
|
|
|
|
if(c >=' ' && c <= '~') fprintf(file,"%c",c); |
|
|
|
|
|
else fprintf(file,"\\%03o",c); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
fprintf(file,"\""); |
|
|
fprintf(file," , %i }}; \n",node->String.len); |
|
|
fprintf(file," , %i }}; \n",node->String.len); |
|
|
return thisNumber; |
|
|
return thisNumber; |
|
|
} |
|
|
} |
|
@ -499,13 +428,13 @@ void printSymbolTable(FILE *file) { |
|
|
} |
|
|
} |
|
|
void declareSymbols(FILE *file) { |
|
|
void declareSymbols(FILE *file) { |
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
fprintf(file,"Symbol symbol_%s ;\n",symbolTable.elements[k]->name); |
|
|
|
|
|
|
|
|
fprintf(file,"Symbol symbol_%s ;\n",symbolTable.elements[k]->name); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
void defineSymbols(FILE *file) { |
|
|
void defineSymbols(FILE *file) { |
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
for (int k= 0; k<symbolTable.length; k++) { |
|
|
Symbol *s=symbolTable.elements[k]; |
|
|
Symbol *s=symbolTable.elements[k]; |
|
|
fprintf(file,"Symbol symbol_%s = { \"%s\", &node%i, %i};\n",s->name,s->name,s->number,s->number); |
|
|
|
|
|
|
|
|
fprintf(file,"Symbol symbol_%s = { \"%s\", &node%i, %i};\n",s->name,s->name,s->number,s->number); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|