From 40028ed18fe744c90678b1a536be0883f942ced5 Mon Sep 17 00:00:00 2001 From: werner Date: Thu, 31 Dec 2009 16:24:23 +0000 Subject: [PATCH] The comment of the previous commit contained a slight exaggeration: we did in fact let duplicate variable names pass. - fpd.y: report duplicate variable/loop/column names git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5766 99fdad57-331a-0410-800a-d7fa5415bdb3 --- fpd.y | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/fpd.y b/fpd.y index 25008f2..2d4e962 100644 --- a/fpd.y +++ b/fpd.y @@ -68,6 +68,23 @@ static struct vec *find_vec(const struct frame *frame, const char *name) } +static struct var *find_var(const struct frame *frame, const char *name) +{ + const struct table *table; + struct var *var; + struct loop *loop; + + for (table = frame->tables; table; table = table->next) + for (var = table->vars; var; var = var->next) + if (var->name == name) + return var; + for (loop = frame->loops; loop; loop = loop->next) + if (loop->var.name == name) + return &loop->var; + return NULL; +} + + static void set_frame(struct frame *frame) { curr_frame = frame; @@ -289,10 +306,18 @@ frame_item: table | TOK_SET ID '=' expr { + if (find_var(curr_frame, $2)) { + yyerrorf("duplicate variable \"%s\"", $2); + YYABORT; + } make_var($2, $4); } | TOK_LOOP ID '=' expr ',' expr { + if (find_var(curr_frame, $2)) { + yyerrorf("duplicate variable \"%s\"", $2); + YYABORT; + } make_loop($2, $4, $6); } | vec @@ -347,6 +372,10 @@ vars: var: ID { + if (find_var(curr_frame, $1)) { + yyerrorf("duplicate variable \"%s\"", $1); + YYABORT; + } $$ = zalloc_type(struct var); $$->name = $1; $$->frame = curr_frame;