|
|
@ -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=createSymbolspan>(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; i<symbolTable->length; 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 <b-a => 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 <b-a => 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" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|