From: Michael Tremer Date: Wed, 24 Feb 2021 17:58:34 +0000 (+0000) Subject: parser: Add keywords that open a new parser X-Git-Tag: 0.9.28~1285^2~707 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aed1989129d9f86325f38b35ac8a001fe57bdc2c;p=pakfire.git parser: Add keywords that open a new parser Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index 2ace7d7fd..9375199e5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -648,7 +648,8 @@ EXTRA_DIST += \ tests/data/beep-1.3-2.ip3.x86_64.pfm \ \ tests/data/parser/test-comments.txt \ - tests/data/parser/test-declarations.txt + tests/data/parser/test-declarations.txt \ + tests/data/parser/test-subparsers.txt .PHONY: clean-local-check clean-local-check: diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 8a951a2ef..f4d3e61f9 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -57,6 +57,8 @@ enum operator { OP_EQUALS = 0, }; +static PakfireParser make_child(PakfireParser parent, const char* namespace); + %} %token T_INDENT @@ -72,6 +74,11 @@ enum operator { %token T_ASSIGN %token T_APPEND +%token T_SUBPARSER + +%type grammar +%type subparser + %type key %type value @@ -88,7 +95,15 @@ enum operator { %% grammar : %empty + { + $$ = make_child(parser, NULL); + } | grammar declaration + | grammar subparser + { + $$ = pakfire_parser_merge($1, $2); + pakfire_parser_unref($2); + } | grammar empty ; @@ -143,6 +158,28 @@ line : T_STRING T_EOL } ; +subparser : subparser_open T_INDENT grammar T_OUTDENT subparser_close + { + // Move back to the parent parser + parser = pakfire_parser_get_parent(parser); + + // Merge block into the parent parser + pakfire_parser_merge(parser, $3); + + // Free block parser + pakfire_parser_unref($3); + } + ; + +subparser_open : T_SUBPARSER T_EOL + { + // Create a new sub-parser which opens a new namespace + parser = make_child(parser, $1); + } + ; + +subparser_close : T_END; + %% int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len) { @@ -203,3 +240,10 @@ void yyerror(PakfireParser parser, const char* s) { pakfire_unref(pakfire); } + +static PakfireParser make_child(PakfireParser parent, const char* namespace) { + PakfireParser parser = pakfire_parser_create_child(parent, namespace); + pakfire_parser_unref(parent); + + return parser; +} diff --git a/src/libpakfire/parser/scanner.l b/src/libpakfire/parser/scanner.l index b00f525e2..9779b478c 100644 --- a/src/libpakfire/parser/scanner.l +++ b/src/libpakfire/parser/scanner.l @@ -61,6 +61,8 @@ whitespace [ \t]+ key ({letter}|{underscore})(({letter}|{digit}|{underscore})*({letter}|{digit}))? +keywords (build|dependencies|distribution|packages?|quality\-agent) + %% <*>\n { @@ -116,6 +118,12 @@ key ({letter}|{underscore})(({letter}|{digit}|{underscore})*({letter}|{digi abort(); } +{keywords}$ { + yylval.string = strdup(yytext); + + return T_SUBPARSER; + } + "=" { // Read everything after this yy_push_state(READLINE); diff --git a/tests/data/parser/test-subparsers.txt b/tests/data/parser/test-subparsers.txt new file mode 100644 index 000000000..824b98829 --- /dev/null +++ b/tests/data/parser/test-subparsers.txt @@ -0,0 +1,9 @@ +# This is a subparser +build + requires = ABC +end + +# This isn't but it starts with the same letters +builder + This is just a string +end diff --git a/tests/libpakfire/parser.c b/tests/libpakfire/parser.c index 74f075979..8961aa8a9 100644 --- a/tests/libpakfire/parser.c +++ b/tests/libpakfire/parser.c @@ -106,6 +106,7 @@ static int test_parser(const struct test* t) { static const char* files[] = { "data/parser/test-comments.txt", "data/parser/test-declarations.txt", + "data/parser/test-subparsers.txt", NULL, };