%}
%start Input
-%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
-%token IDENT NUM ASSIGN
+%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN
@macro xxputsin(xx,)
@i xx = @Statement.sin@;
Input:
Program
@{
- @i @Program.f@ = new_tab();
+ @i @Program.f@ = tab_new();
@}
;
|
@{
- @i @Parms.f@ = new_tab();
+ @i @Parms.f@ = tab_new();
@}
;
|
@{
- @i @FeldID.f@ = new_tab();
+ @i @FeldID.f@ = tab_new();
@}
;
| VAR IDENT ASSIGN Expr
@{
- @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
+ /* tab_clone ist hier noetig, vgl. folgendes statement
+ * > var x := x - 1; */
+ @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1);
xxputsin(@Expr.s@,)
@}
#define DD
-struct symbol *new_tab(void)
+struct symbol *tab_new(void)
{
return SYMNULL;
}
-struct symbol *clone_tab(struct symbol *tab)
+struct symbol *tab_clone(struct symbol *tab)
{
- struct symbol *elm;
- struct symbol *new_tabx;
+ struct symbol *elm = tab;
+ struct symbol *ntab = tab_new();
#ifdef DD
- printf("clone_tab: tab(%08X)\n", tab);
+ printf("tab_clone: tab(%08X)\n", tab);
#endif
- elm = tab;
- new_tabx = new_tab();
while(elm != SYMNULL) {
- new_tabx = tab_add_symbol(new_tabx, elm->ident, elm->type, 0);
+ ntab = tab_add_symbol(ntab, elm->ident, elm->type, 0);
elm = elm->next;
}
-
- return new_tabx;
+ return ntab;
}
struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short check)
{
- struct symbol *elm;
+ struct symbol *elm = tab;
struct symbol *new_elm;
#ifdef DD
printf("tab_add_symbol: tab(%08X), ident(%s), type(%i), check(%i)\n", tab, ident, type, check);
return new_elm;
}
- elm = tab;
while(elm->next != SYMNULL) {
elm = elm->next;
}
struct symbol *tab_merge(struct symbol *tab, struct symbol *to_add, short check)
{
struct symbol *elm = to_add;
- struct symbol *new_tab = clone_tab(tab);
+ struct symbol *ntab = tab_clone(tab);
#ifdef DD
- printf("tab_merge: tab(%08X), to_add(%08X), check(%i), new_tab(%08X)\n", tab, to_add, check, new_tab);
+ printf("tab_merge: tab(%08X), to_add(%08X), check(%i), ntab(%08X)\n", tab, to_add, check, ntab);
#endif
while(elm != SYMNULL) {
- new_tab = tab_add_symbol(new_tab, elm->ident, elm->type, check);
+ ntab = tab_add_symbol(ntab, elm->ident, elm->type, check);
elm = elm->next;
}
- return new_tab;
+ return ntab;
}
struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type)
}
}
+ /* keine passende variable gefunden?
+ * => vllt gibt es ja ein passenden feldnamen */
elm = tab_lookup(tab, ident, S_FIELD);
if(elm == SYMNULL) {
fprintf(stderr, "Unbekannter Identifier: \"%s\"\n", ident);
short type;
};
-struct symbol *clone_tab(struct symbol *tab);
-struct symbol *new_tab(void);
+struct symbol *tab_clone(struct symbol *tab);
+struct symbol *tab_new(void);
struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short check);
struct symbol *tab_lookup(struct symbol *tab, char *ident, short type);
struct symbol *tab_remove_symbol(struct symbol *tab, char *ident, short type);