%type <parser> grammar
%type <parser> subgrammar
%type <parser> subparser
+%type <string> subparser_name
%type <parser> if_stmt
%type <parser> else_stmt
}
;
-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);
}
;
+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);
# #
#############################################################################*/
-%option noinput nounput noyywrap yylineno
+%option noinput noyywrap yylineno
%option nodefault
%option stack noyy_top_state
%option warn
return strdup(input);
}
+#define unput_string(s) for (int i = strlen(s) - 1; i >= 0; i--) unput(s[i])
+
%}
%x INDENT
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)?
%%
{whitespace} { /* consume any whitespace */ }
-<NOKEYWORD>{key}$ {
+<NOKEYWORD>{keys}$ {
// Leave NOKEYWORD immediately again
yy_pop_state();
return T_KEY;
}
-<NOKEYWORD>{key} {
+<NOKEYWORD>{keys} {
// Leave NOKEYWORD immediately again
yy_pop_state();
abort();
}
-{keywords}$ {
+{subparsers}$ {
// Hack because we cannot use ^ after calling yyless()
// in the INDENT stage.
if (current_indent > 0)
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);