diff --git a/parse.c b/parse.c index 042bbba..4ba8a73 100644 --- a/parse.c +++ b/parse.c @@ -88,10 +88,10 @@ Node *mkString(char *s) return node; } -Node *mkId(char *s){ +Node *mkId(Symbol *s){ Node *node= new(Id); - node->Id.symbol=createSymbol(s); + node->Id.symbol=s; return node; } @@ -229,82 +229,85 @@ else { \ -void move(SymbolTable *symbolTable, int a) { - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Node*) * symbolTable->length); - printf("begin\n"); - for (int i= symbolTable->length-1; i >a; i--) { - symbolTable->elements[i] = symbolTable->elements[i-1]; - printf("\n"); - for(int i= 0; ilength; i++) { - printf("number : %i, name : %s, value : a\n",i, symbolTable->elements[i]->name); + + +Symbol *intern(char *name){ + int left=0,right=symbolTable.length-1; + + while(left<=right){ + int middle=(left+right)/2; + int comp=strcmp(name,symbolTable.elements[middle]->name); + + if(comp<0){ + right=middle-1; + } + else if(comp>0){ + left=middle+1; + } + else{ + return symbolTable.elements[middle]; } } - printf("end\n"); -} - -void addSymbolSorted(SymbolTable *symbolTable, Symbol *symbol) { - int a=0; - int b= symbolTable->length-1; - int c; - //1 no infinite loop with a and c = 0 et b =1 - while (1 < b - a ) { - c= (a+b)/2; - if (strcmp(symbolTable->elements[c]->name, symbol->name) < 0) { - a= c; - } else { - b= c; + + 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); + +} + +int binary_search(SymbolTable *st, char *c){ + int start=0,end=st->length-1; + int m=0; + while(end-start>1){ + + m=(end+start)/2; //printf("char : %s\n %s",c,st->elements[m]->name); + // printf("start : %i End : %i\n Compare : %i\n",start,end,strcmp(c,st->elements[m]->name));/**/ + if(strcmp(c,st->elements[m]->name)==0){ + return m; + } + else if(strcmp(c,st->elements[m]->name)<0){ + end=m-1; } + else{ + start=m+1; + } + m=(end+start)/2; } - //b>-1 <=> symboleTable->length > 0 - // this if is here to know if we put the symbol before or after a - if (b>-1 && strcmp(symbolTable->elements[a]->name, symbol->name) < 0) { - a++; + // printf("Start : %i, m : %i, end : %i char : %s size :%i\n",start,m,end,c,st->length); + if(strcmp(c,st->elements[m]->name)<0){ + return start; } - //we move all the symbols after a - move(symbolTable, a); - //we put the symbol at the right place - symbolTable->elements[a]->name = symbol->name; -} - -int findSymbol(SymbolTable *symbolTable, char *name) { - for (int i= 0; i < symbolTable->length;i++) { - if (strcmp(symbolTable->elements[i]->name, name) == 0) { - return 1; - } + else{ + return end; } - Symbol *symbol = createSymbol(name); - addSymbolSorted(symbolTable, symbol); - return 0; + } -Node *findSymbolSorted(SymbolTable *symbolTable, char *name) { - int a=0; - int b= symbolTable->length-1; - int c; - //1 no infinite loop with a and c = 0 et b =1 - while (1 < b - a ) { - c= (a+b)/2; - if (strcmp(symbolTable->elements[c]->name, name) < 0) { - a= c; - } else { - if (strcmp(symbolTable->elements[c]->name, name) > 0) { - b= c; - } else { - return symbolTable->elements[c]->rule; - } - } - } - //b>-1 <=> symboleTable->length > 0 - // this if is here to know if we put the symbol before or after a - if (b>-1 && strcmp(symbolTable->elements[a]->name, name) < 0) { - a++; + +void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { + + if(symbolTable->length==0){ + + symbolTable->length++; + symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol) * symbolTable->length); + symbolTable->elements[0]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[0]->name,0); + return; } - //we move all the symbols after a - move(symbolTable, a); - //we put the symbol at the right place - symbolTable->elements[a]= createSymbol(name); - return 0; + else{ + + + symbolTable->length++; + symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol*) * symbolTable->length); + int indice=binary_search(symbolTable, symbol->name); + + for(int k=symbolTable->length-1;k>indice;k--){ + symbolTable->elements[k]=symbolTable->elements[k-1]; + } + symbolTable->elements[indice]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[indice]->name,indice); + + } + } void setRule(SymbolTable *symbolTable, char *name, Node *rule) { @@ -618,7 +621,7 @@ YY_ACTION(void) yy_1_dot(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_dot\n")); { -#line 352 +#line 355 __=mkDot(); } #undef yythunkpos @@ -632,7 +635,7 @@ YY_ACTION(void) yy_1_class(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_class\n")); { -#line 350 +#line 353 __=mkClass(yytext) ; } #undef yythunkpos @@ -646,7 +649,7 @@ YY_ACTION(void) yy_1_string(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_string\n")); { -#line 348 +#line 351 __ = mkString(yytext) ; } #undef yythunkpos @@ -660,8 +663,8 @@ YY_ACTION(void) yy_1_id(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_id\n")); { -#line 346 - __ = mkId(yytext) ; +#line 349 + __ = mkId(intern(yytext)) ; } #undef yythunkpos #undef yypos @@ -675,8 +678,8 @@ YY_ACTION(void) yy_1_rule(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_rule\n")); { -#line 344 - __ = mkId(yytext) ; +#line 347 + __ = mkId(intern(yytext)) ; } #undef yythunkpos #undef yypos @@ -691,7 +694,7 @@ YY_ACTION(void) yy_4_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_4_postfix\n")); { -#line 340 +#line 343 __ = s; } #undef yythunkpos @@ -707,7 +710,7 @@ YY_ACTION(void) yy_3_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_3_postfix\n")); { -#line 339 +#line 342 s = mkPlus(s) ; } #undef yythunkpos @@ -723,7 +726,7 @@ YY_ACTION(void) yy_2_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_postfix\n")); { -#line 338 +#line 341 s = mkStar(s) ; } #undef yythunkpos @@ -739,7 +742,7 @@ YY_ACTION(void) yy_1_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_postfix\n")); { -#line 337 +#line 340 s = mkQuery(s) ; } #undef yythunkpos @@ -755,7 +758,7 @@ YY_ACTION(void) yy_2_prefix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_prefix\n")); { -#line 335 +#line 338 __ = p; } #undef yythunkpos @@ -771,7 +774,7 @@ YY_ACTION(void) yy_1_prefix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_prefix\n")); { -#line 334 +#line 337 __ = mkExc(p); } #undef yythunkpos @@ -788,7 +791,7 @@ YY_ACTION(void) yy_2_and(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_and\n")); { -#line 332 +#line 335 __ = p ; } #undef yythunkpos @@ -806,7 +809,7 @@ YY_ACTION(void) yy_1_and(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_and\n")); { -#line 331 +#line 334 __ = mkAnd(p, a); ; } #undef yythunkpos @@ -824,7 +827,7 @@ YY_ACTION(void) yy_2_or(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_or\n")); { -#line 329 +#line 332 __ = a ; } #undef yythunkpos @@ -842,7 +845,7 @@ YY_ACTION(void) yy_1_or(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_or\n")); { -#line 328 +#line 331 __ = mkOr(o, a) ; } #undef yythunkpos @@ -860,7 +863,7 @@ YY_ACTION(void) yy_1_declaration(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_declaration\n")); { -#line 326 +#line 329 setRule(&symbolTable,get(i, Id, symbol)->name, e) ; } #undef yythunkpos @@ -1143,7 +1146,7 @@ YY_PARSE(yycontext *) YYRELEASE(yycontext *yyctx) } #endif -#line 359 "parse.leg" +#line 362 "parse.leg" diff --git a/parse.leg b/parse.leg index fb91ec1..64fd7ef 100644 --- a/parse.leg +++ b/parse.leg @@ -81,10 +81,10 @@ Node *mkString(char *s) return node; } -Node *mkId(char *s){ +Node *mkId(Symbol *s){ Node *node= new(Id); - node->Id.symbol=createSymbol(s); + node->Id.symbol=s; return node; } @@ -222,82 +222,85 @@ else { \ -void move(SymbolTable *symbolTable, int a) { - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Node*) * symbolTable->length); - printf("begin\n"); - for (int i= symbolTable->length-1; i >a; i--) { - symbolTable->elements[i] = symbolTable->elements[i-1]; - printf("\n"); - for(int i= 0; ilength; i++) { - printf("number : %i, name : %s, value : a\n",i, symbolTable->elements[i]->name); + + +Symbol *intern(char *name){ + int left=0,right=symbolTable.length-1; + + while(left<=right){ + int middle=(left+right)/2; + int comp=strcmp(name,symbolTable.elements[middle]->name); + + if(comp<0){ + right=middle-1; + } + else if(comp>0){ + left=middle+1; + } + else{ + return symbolTable.elements[middle]; } } - printf("end\n"); + + 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); + } -void addSymbolSorted(SymbolTable *symbolTable, Symbol *symbol) { - int a=0; - int b= symbolTable->length-1; - int c; - //1 no infinite loop with a and c = 0 et b =1 - while (1 < b - a ) { - c= (a+b)/2; - if (strcmp(symbolTable->elements[c]->name, symbol->name) < 0) { - a= c; - } else { - b= c; +int binary_search(SymbolTable *st, char *c){ + int start=0,end=st->length-1; + int m=0; + while(end-start>1){ + + m=(end+start)/2; //printf("char : %s\n %s",c,st->elements[m]->name); + // printf("start : %i End : %i\n Compare : %i\n",start,end,strcmp(c,st->elements[m]->name));/**/ + if(strcmp(c,st->elements[m]->name)==0){ + return m; + } + else if(strcmp(c,st->elements[m]->name)<0){ + end=m-1; + } + else{ + start=m+1; } + m=(end+start)/2; } - //b>-1 <=> symboleTable->length > 0 - // this if is here to know if we put the symbol before or after a - if (b>-1 && strcmp(symbolTable->elements[a]->name, symbol->name) < 0) { - a++; + // printf("Start : %i, m : %i, end : %i char : %s size :%i\n",start,m,end,c,st->length); + if(strcmp(c,st->elements[m]->name)<0){ + return start; } - //we move all the symbols after a - move(symbolTable, a); - //we put the symbol at the right place - symbolTable->elements[a]->name = symbol->name; -} - -int findSymbol(SymbolTable *symbolTable, char *name) { - for (int i= 0; i < symbolTable->length;i++) { - if (strcmp(symbolTable->elements[i]->name, name) == 0) { - return 1; - } + else{ + return end; } - Symbol *symbol = createSymbol(name); - addSymbolSorted(symbolTable, symbol); - return 0; + } -Node *findSymbolSorted(SymbolTable *symbolTable, char *name) { - int a=0; - int b= symbolTable->length-1; - int c; - //1 no infinite loop with a and c = 0 et b =1 - while (1 < b - a ) { - c= (a+b)/2; - if (strcmp(symbolTable->elements[c]->name, name) < 0) { - a= c; - } else { - if (strcmp(symbolTable->elements[c]->name, name) > 0) { - b= c; - } else { - return symbolTable->elements[c]->rule; - } - } - } - //b>-1 <=> symboleTable->length > 0 - // this if is here to know if we put the symbol before or after a - if (b>-1 && strcmp(symbolTable->elements[a]->name, name) < 0) { - a++; + +void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { + + if(symbolTable->length==0){ + + symbolTable->length++; + symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol) * symbolTable->length); + symbolTable->elements[0]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[0]->name,0); + return; } - //we move all the symbols after a - move(symbolTable, a); - //we put the symbol at the right place - symbolTable->elements[a]= createSymbol(name); - return 0; + else{ + + + symbolTable->length++; + symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol*) * symbolTable->length); + int indice=binary_search(symbolTable, symbol->name); + + for(int k=symbolTable->length-1;k>indice;k--){ + symbolTable->elements[k]=symbolTable->elements[k-1]; + } + symbolTable->elements[indice]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[indice]->name,indice); + + } + } void setRule(SymbolTable *symbolTable, char *name, Node *rule) { @@ -341,9 +344,9 @@ postfix = s:atom ( "?" - { s = mkQuery(s) } atom = string | class | dot | rule -rule = i:id !'=' { $$ = mkId(yytext) } +rule = i:id !'=' { $$ = mkId(intern(yytext)) } -id = < [a-zA-z_][a-zA-z_0-9]* > - { $$ = mkId(yytext) } +id = < [a-zA-z_][a-zA-z_0-9]* > - { $$ = mkId(intern(yytext)) } string = '"' < [^"]* > '"' { $$ = mkString(yytext) } -