From 93561c21e8d42aad487fd81ef1f79c5ba3f494fe Mon Sep 17 00:00:00 2001 From: Valentin Tolmer Date: Fri, 25 Jan 2013 11:12:47 +0100 Subject: [PATCH] grammar: preserve token declaration order In a declaration %token A B, the token A is declared before B, but in %left A B (or with %precedence or %nonassoc or %right), the token B was declared before A (tokens were declared in reverse order). * src/symlist.h, src/symlist.c (symbol_list_append): New. * src/parse-gram.y: Use it instead of symbol_list_prepend. * tests/input.at: Adjust expectations. --- NEWS | 6 ++++++ src/parse-gram.y | 6 +++--- src/symlist.c | 17 +++++++++++++++++ src/symlist.h | 3 +++ tests/input.at | 8 ++++---- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/NEWS b/NEWS index c94af17..167cc8b 100644 --- a/NEWS +++ b/NEWS @@ -289,6 +289,12 @@ GNU Bison NEWS It used to be an error only if used in non GLR mode, _and_ if there are reduce/reduce conflicts. +** Token numbering has changed to preserve the user-defined order + + When declaring %token A B, the numbering for A is inferior to B. Up to now, + when declaring associativity at the same time, with %left (or %right, + %precedence, %nonassoc), B was inferior to A. + * Noteworthy changes in release 2.7 (2012-12-12) [stable] ** Bug fixes diff --git a/src/parse-gram.y b/src/parse-gram.y index 0452c11..3a09c6c 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -503,7 +503,7 @@ symbols.prec: symbol.prec { $$ = symbol_list_sym_new ($1, @1); } | symbols.prec symbol.prec - { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); } + { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); } ; symbol.prec: @@ -516,12 +516,12 @@ symbols.1: symbol { $$ = symbol_list_sym_new ($1, @1); } | symbols.1 symbol - { $$ = symbol_list_prepend ($1, symbol_list_sym_new ($2, @2)); } + { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); } ; generic_symlist: generic_symlist_item { $$ = $1; } -| generic_symlist generic_symlist_item { $$ = symbol_list_prepend ($1, $2); } +| generic_symlist generic_symlist_item { $$ = symbol_list_append ($1, $2); } ; generic_symlist_item: diff --git a/src/symlist.c b/src/symlist.c index 722581b..13759e3 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -107,6 +107,23 @@ symbol_list_prepend (symbol_list *list, symbol_list *node) } +/*-------------------------. +| Append NODE to the LIST. | +`-------------------------*/ + +symbol_list * +symbol_list_append (symbol_list *list, symbol_list *node) +{ + if (!list) + return node; + symbol_list *next = list; + while (next->next) + next = next->next; + next->next = node; + return list; +} + + /*-----------------------------------------------. | Free the LIST, but not the items it contains. | `-----------------------------------------------*/ diff --git a/src/symlist.h b/src/symlist.h index 137a7a3..a88e73c 100644 --- a/src/symlist.h +++ b/src/symlist.h @@ -97,6 +97,9 @@ void symbol_list_syms_print (const symbol_list *l, FILE *f); /** Prepend \c node to \c list. */ symbol_list *symbol_list_prepend (symbol_list *list, symbol_list *node); +/** Append \c node to \c list. */ +symbol_list *symbol_list_append (symbol_list *list, symbol_list *node); + /** Free \c list, but not the items it contains. */ void symbol_list_free (symbol_list *list); diff --git a/tests/input.at b/tests/input.at index 9a3d87e..b46f8fa 100644 --- a/tests/input.at +++ b/tests/input.at @@ -445,14 +445,14 @@ input.y:5.10-24: error: %printer redeclaration for input.y:2.10-24: previous declaration input.y:5.10-24: error: %printer redeclaration for input.y:5.10-24: previous declaration -input.y:11.13-29: error: %destructor redeclaration for -input.y:4.13-29: previous declaration input.y:11.13-29: error: %destructor redeclaration for input.y:1.13-29: previous declaration -input.y:12.10-24: error: %printer redeclaration for -input.y:2.10-24: previous declaration +input.y:11.13-29: error: %destructor redeclaration for +input.y:4.13-29: previous declaration input.y:12.10-24: error: %printer redeclaration for input.y:5.10-24: previous declaration +input.y:12.10-24: error: %printer redeclaration for +input.y:2.10-24: previous declaration ]]) AT_CLEANUP -- 2.7.4