From e6c78ce32d1f4d737c0fe52661d8f5d56abe879d Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 19 Jul 2023 20:52:21 -0400 Subject: [PATCH] libcdecl: Parse function parameters in order. Currently the parser collects function parameters in reverse order, then reverses them at the end. There is no reason to do this. It is only a slight restructuring of the rules to collect parameters in the right order from the get go, which means we can delete the duplicated list reversal code. The grammar itself is also simpler this way, using two less nonterminals. --- src/parse.y | 46 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/src/parse.y b/src/parse.y index 0156bb3..b57428d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -248,15 +248,15 @@ static struct cdecl *insert_identifier(struct cdecl *decl, char *ident) %type direct_declarator declarator pointer array parens postfix %type direct_declarator_ish declarator_ish parameter_type_list %type declaration declarators declarator_wrap -%type parameter parameters +%type parameter %type english_vla %type storage_func_specs post_specs %type type_qual_spec type_qual_specs typedef_name_qual %type english_declarator english_array english_function %type english_parameter_list null_decl -%type english_parameter english_parameters %type english english_declaration +%type english_parameter /* * Harmless shift/reduce conflicts in english_parameter. See comments below @@ -399,26 +399,17 @@ parameter: declspecs declarator { .declarators = $2); } -parameters: parameter | parameters T_COMMA parameter { - $$ = $3; - $$->next = $1; -} - varargs: { $$ = false; } | T_COMMA T_ELLIPSIS { $$ = true; } -parameter_type_list: parameters varargs { - struct cdecl *p, *c, *n; - - /* Parameters were accumulated in reverse order. */ - for (p = NULL, c = $1; c; p = c, c = n) { - n = c->next; - c->next = p; - } - +parameter_type_list: parameter varargs { ALLOC_STRUCT($$, struct cdecl_declarator, .type = CDECL_DECL_FUNCTION, - .u.function.parameters = p, + .u.function.parameters = $1, .u.function.variadic = $2); +} | parameter T_COMMA parameter_type_list { + $$ = $3; + $1->next = $$->u.function.parameters; + $$->u.function.parameters = $1; } parens: T_LPAREN parameter_type_list T_RPAREN { @@ -527,25 +518,16 @@ english_function: T_FUNCTION T_RETURNING { $$ = $3; } -english_parameter_list: english_parameters varargs { - struct cdecl *p, *c, *n; - - /* Parameters were accumulated in reverse order. */ - for (p = NULL, c = $1; c; p = c, c = n) { - n = c->next; - c->next = p; - } - +english_parameter_list: english_parameter varargs { ALLOC_STRUCT($$, struct cdecl_declarator, .type = CDECL_DECL_FUNCTION, - .u.function.parameters = p, + .u.function.parameters = $1, .u.function.variadic = $2); -} - -english_parameters: english_parameters T_COMMA english_parameter { +} | english_parameter T_COMMA english_parameter_list { $$ = $3; - $$->next = $1; -} | english_parameter + $1->next = $$->u.function.parameters; + $$->u.function.parameters = $1; +} typedef_name_qual: T_IDENT qualifiers { ALLOC_STRUCT($$, struct cdecl_declspec, -- 2.43.2