]> git.ipfire.org Git - pakfire.git/commitdiff
parser: Add support for named subparsers and variables
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Feb 2021 15:29:26 +0000 (15:29 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 25 Feb 2021 15:35:42 +0000 (15:35 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/parser/grammar.y
src/libpakfire/parser/scanner.l

index 9f9f73ecfbf8e59b3ce18dacc8ffec8f8a069250..e6fb886d25834b414ff1c9a820ccdda7942bed88 100644 (file)
@@ -117,6 +117,7 @@ static void pakfire_parser_free_declaration(struct pakfire_parser_declaration* d
 %type <parser>                         grammar
 %type <parser>                         subgrammar
 %type <parser>                         subparser
+%type <string>                         subparser_name
 %type <parser>                         if_stmt
 %type <parser>                         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);
index ea86172a2a91cfe6d42d35b30399f9165dd7f8c1..acb6a0432a3197fa22120cfd1083871c1163a86f 100644 (file)
@@ -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 */ }
 
-<NOKEYWORD>{key}$              {
+<NOKEYWORD>{keys}$             {
                                                        // Leave NOKEYWORD immediately again
                                                        yy_pop_state();
 
@@ -126,7 +135,7 @@ keywords                            (build|dependencies|distribution|packages?|quality\-agent)
                                                        return T_KEY;
                                                }
 
-<NOKEYWORD>{key              {
+<NOKEYWORD>{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);