|
|
@ -249,7 +249,7 @@ Symbol *intern(char *name){ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
int binary_search(SymbolTable *st, char *c){ |
|
|
|
/*int binary_search(SymbolTable *st, char *c){ |
|
|
|
int start=0,end=st->length-1; |
|
|
|
int m=0; |
|
|
|
while(end-start>1){ |
|
|
@ -275,10 +275,10 @@ int binary_search(SymbolTable *st, char *c){ |
|
|
|
return end; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
|
|
void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { |
|
|
|
/*void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { |
|
|
|
|
|
|
|
if(symbolTable->length==0){ |
|
|
|
|
|
|
@ -301,22 +301,23 @@ void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
}*/ |
|
|
|
|
|
|
|
void setRule(SymbolTable *symbolTable, char *name, Node *rule) { |
|
|
|
for (int i= 0; i < symbolTable->length;i++) { |
|
|
|
void setRule(char *name, Node *rule) { |
|
|
|
intern(name)->rule= rule; |
|
|
|
/*for (int i= 0; i < symbolTable->length;i++) { |
|
|
|
if (strcmp(symbolTable->elements[i]->name, name) == 0) { |
|
|
|
symbolTable->elements[i]->rule= rule; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
}*/ |
|
|
|
} |
|
|
|
|
|
|
|
void arrayAppend(Array *array, Node *statement) { |
|
|
|
/*void arrayAppend(Array *array, Node *statement) { |
|
|
|
array->length++; |
|
|
|
array->elements= realloc(array->elements,sizeof(Node*) * array->length); |
|
|
|
array->elements[array->length-1] = statement; |
|
|
|
} |
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
|
|
#define YYSTYPE Node * |
|
|
@ -326,7 +327,9 @@ YYSTYPE yylval = 0; |
|
|
|
|
|
|
|
start = declaration+ |
|
|
|
|
|
|
|
declaration = i:id '=' - e:expression { setRule(&symbolTable,get(i, Id, symbol)->name, e) } |
|
|
|
declaration = i:id '=' - e:expression { setRule(get(i, Id, symbol)->name, e) } |
|
|
|
|
|
|
|
expression = or |
|
|
|
|
|
|
|
or = a:and - "|" - o:or {$$ = mkOr(o, a) } |
|
|
|
| a:and { $$ = a } |
|
|
@ -435,6 +438,7 @@ int execute(Node *node, InputBuffer *in) |
|
|
|
} |
|
|
|
case Id: { |
|
|
|
Symbol *symbol= get(node, Id, symbol); |
|
|
|
if (0 == symbol->rule) { printf("undefined rule: %s\n", symbol->name); } |
|
|
|
return execute(symbol->rule, in); |
|
|
|
} |
|
|
|
} |
|
|
|