瀏覽代碼

parse.leg with new symbol functions

main
lquint 3 年之前
父節點
當前提交
271cf98a6e
共有 2 個檔案被更改,包括 163 行新增157 行删除
  1. +91
    -88
      parse.c
  2. +72
    -69
      parse.leg

+ 91
- 88
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=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"

+ 72
- 69
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; 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");
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 <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;
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) {
@ -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) } -

Loading…
取消
儲存