Sfoglia il codice sorgente

Transférer les fichiers vers ''

main
leo.quintrand 3 anni fa
parent
commit
ba181c65aa
1 ha cambiato i file con 35 aggiunte e 106 eliminazioni
  1. +35
    -106
      parse.leg

+ 35
- 106
parse.leg Vedi File

@ -165,7 +165,9 @@ void print(Node *node)
return;
case Class:
printf("Class");
printf("\"%s\"", node->Class.array);
for(int i=0;i<32;i++){
printf("\\%03o",(unsigned char)node->Class.array[i]);
}
return;
case Dot:
printf("Dot");
@ -206,9 +208,15 @@ else { \
Symbol *intern(char *name){
Symbol *intern(char *string){
int left=0,right=symbolTable.length-1;
char *name = strdup(string),*p =name;
while(*p){
if(*p=='-'){
*p='_';
}
p++;
}
while (left<=right) {
int middle=(left+right)/2;
int comp=strcmp(name,symbolTable.elements[middle]->name);
@ -220,6 +228,7 @@ Symbol *intern(char *name){
left=middle+1;
}
else{
free(name);
return symbolTable.elements[middle];
}
}
@ -227,8 +236,9 @@ Symbol *intern(char *name){
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]));
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)) }
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)) }
@ -313,102 +324,7 @@ NodeCount nodeCount={
.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;
@ -420,7 +336,20 @@ int printCode(FILE *file,Node *node)
case String:{
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);
return thisNumber;
}
@ -499,13 +428,13 @@ void printSymbolTable(FILE *file) {
}
void declareSymbols(FILE *file) {
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) {
for (int k= 0; k<symbolTable.length; 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);
}
}

Caricamento…
Annulla
Salva