From: Michael Tremer Date: Fri, 31 May 2019 03:45:58 +0000 (+0100) Subject: libpakfire: parser: Merge parsers from all rules X-Git-Tag: 0.9.28~1285^2~1020 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7811b9fba9c3b2ca9883f5309cf91e3fe62a2068;p=pakfire.git libpakfire: parser: Merge parsers from all rules Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 5ebd300e9..26386b321 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -60,6 +60,8 @@ enum operator { }; static PakfireParser new_parser(PakfireParser parent); +static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2); + static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op, const char* val1, const char* val2, PakfireParser block); @@ -82,7 +84,9 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op, %type word; %type words; +%type top; %type assignment; +%type block; %type block_assignments; %type block_assignment; %type if_stmt; @@ -100,9 +104,21 @@ static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op, %% top : %empty + { + $$ = new_parser(parser); + } | top assignment + { + $$ = merge_parsers($1, $2); + } | top block + { + $$ = merge_parsers($1, $2); + } | top empty + { + $$ = $1; + } ; empty : T_EOL @@ -173,12 +189,14 @@ block_closing : end current_block = NULL; }; -block : block_opening block_assignments block_closing; +block : block_opening block_assignments block_closing + { + $$ = $2; + }; block_assignments : block_assignments block_assignment { - $$ = pakfire_parser_merge($1, $2); - pakfire_parser_unref($2); + $$ = merge_parsers($1, $2); } | block_assignment; @@ -326,6 +344,15 @@ static PakfireParser new_parser(PakfireParser parent) { return parser; } +static PakfireParser merge_parsers(PakfireParser p1, PakfireParser p2) { + PakfireParser p = pakfire_parser_merge(p1, p2); + + // Parser 2 is now obsolete + pakfire_parser_unref(p2); + + return p; +} + static PakfireParser make_if_stmt(PakfireParser parser, const enum operator op, const char* val1, const char* val2, PakfireParser block) { Pakfire pakfire = pakfire_parser_get_pakfire(parser);