summaryrefslogtreecommitdiffstats
path: root/lib/command_parse.y
diff options
context:
space:
mode:
authorDavid Lamparter <equinox@opensourcerouting.org>2016-11-18 15:56:18 +0100
committerDavid Lamparter <equinox@opensourcerouting.org>2016-12-15 23:13:52 +0100
commit7d5718c140611ae125dfab56b94f6a96e19b5922 (patch)
tree76b5d634724313564e078600818bd66f132c66a7 /lib/command_parse.y
parentlib: parser: refresh grammar_sandbox (diff)
downloadfrr-7d5718c140611ae125dfab56b94f6a96e19b5922.tar.xz
frr-7d5718c140611ae125dfab56b94f6a96e19b5922.zip
lib: parser: support keyword arguments
This re-adds "{foo WORD|bar WORD}" keyword-argument support to the CLI parser. Note that token graphs may now contain loops for this purpose; therefore the matching functions retain a history of already-matched tokens. Each token can thus only be consumed once. And then LINE... gets its special treatment with allowrepeat. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'lib/command_parse.y')
-rw-r--r--lib/command_parse.y22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/command_parse.y b/lib/command_parse.y
index 339e6be8f..3dba8f0e8 100644
--- a/lib/command_parse.y
+++ b/lib/command_parse.y
@@ -180,6 +180,8 @@ start:
if ((ctx->currnode = add_edge_dedup (ctx->currnode, $3)) != $3)
graph_delete_node (ctx->graph, $3);
+ ctx->currnode->allowrepeat = 1;
+
// adding a node as a child of itself accepts any number
// of the same token, which is what we want for variadics
add_edge_dedup (ctx->currnode, ctx->currnode);
@@ -336,6 +338,26 @@ selector_seq_seq:
}
;
+/* {keyword} productions */
+selector: '{' selector_seq_seq '}'
+{
+ $$ = malloc (sizeof (struct subgraph));
+ $$->start = new_token_node (ctx, SELECTOR_TKN, NULL, NULL);
+ $$->end = new_token_node (ctx, NUL_TKN, NULL, NULL);
+ graph_add_edge ($$->start, $$->end);
+ for (unsigned int i = 0; i < vector_active ($2->start->to); i++)
+ {
+ struct graph_node *sn = vector_slot ($2->start->to, i),
+ *en = vector_slot ($2->end->from, i);
+ graph_add_edge ($$->start, sn);
+ graph_add_edge (en, $$->start);
+ }
+ graph_delete_node (ctx->graph, $2->start);
+ graph_delete_node (ctx->graph, $2->end);
+ free ($2);
+};
+
+
selector_token_seq:
simple_token
{