From: Michael Tremer Date: Thu, 25 Feb 2021 15:29:26 +0000 (+0000) Subject: parser: Add support for named subparsers and variables X-Git-Tag: 0.9.28~1285^2~694 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69d27848eed81dc5f355a01da055d130b2470382;p=pakfire.git parser: Add support for named subparsers and variables Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 9f9f73ecf..e6fb886d2 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -117,6 +117,7 @@ static void pakfire_parser_free_declaration(struct pakfire_parser_declaration* d %type grammar %type subgrammar %type subparser +%type subparser_name %type if_stmt %type else_stmt @@ -233,7 +234,7 @@ line : T_STRING T_EOL } ; -subparser : T_SUBPARSER T_EOL subgrammar T_END T_EOL +subparser : subparser_name T_EOL subgrammar T_END T_EOL { pakfire_parser_set_namespace($3, $1); @@ -241,6 +242,14 @@ subparser : T_SUBPARSER T_EOL subgrammar T_END T_EOL } ; +subparser_name : T_SUBPARSER + | T_SUBPARSER T_STRING + { + int r = asprintf(&$$, "%s:%s", $1, $2); + if (r < 0) + ABORT; + } + if_stmt : T_IF T_STRING T_EQUALS T_STRING T_EOL subgrammar else_stmt T_END T_EOL { $$ = make_if_stmt(pakfire, result, OP_EQUALS, $2, $4, $6, $7); diff --git a/src/libpakfire/parser/scanner.l b/src/libpakfire/parser/scanner.l index ea86172a2..acb6a0432 100644 --- a/src/libpakfire/parser/scanner.l +++ b/src/libpakfire/parser/scanner.l @@ -18,7 +18,7 @@ # # #############################################################################*/ -%option noinput nounput noyywrap yylineno +%option noinput noyywrap yylineno %option nodefault %option stack noyy_top_state %option warn @@ -70,6 +70,8 @@ COPY: return strdup(input); } +#define unput_string(s) for (int i = strlen(s) - 1; i >= 0; i--) unput(s[i]) + %} %x INDENT @@ -84,8 +86,15 @@ whitespace [ \t]+ quoted_string \"([^\"])*\" key ({letter}|{underscore})(({letter}|{digit}|{underscore})*({letter}|{digit}))? +named_key {key}:{key} + +keys ({key}|{named_key}) + +subparsers (build|dependencies|distribution|packages?|quality\-agent) -keywords (build|dependencies|distribution|packages?|quality\-agent) +named_subparsers (template|package) + +scriptlet script(let)? %% @@ -109,7 +118,7 @@ keywords (build|dependencies|distribution|packages?|quality\-agent) {whitespace} { /* consume any whitespace */ } -{key}$ { +{keys}$ { // Leave NOKEYWORD immediately again yy_pop_state(); @@ -126,7 +135,7 @@ keywords (build|dependencies|distribution|packages?|quality\-agent) return T_KEY; } -{key} { +{keys} { // Leave NOKEYWORD immediately again yy_pop_state(); @@ -142,7 +151,7 @@ keywords (build|dependencies|distribution|packages?|quality\-agent) abort(); } -{keywords}$ { +{subparsers}$ { // Hack because we cannot use ^ after calling yyless() // in the INDENT stage. if (current_indent > 0) @@ -153,6 +162,17 @@ keywords (build|dependencies|distribution|packages?|quality\-agent) return T_SUBPARSER; } +{named_subparsers} { + yy_push_state(READLINE); + + yylval.string = strdup(yytext); + return T_SUBPARSER; + } + +{scriptlet}{whitespace} { + unput_string("scriptlet:"); + } + {quoted_string} { // Remove quotes yylval.string = unquote(yytext);