]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: parser: simplify OPTION_TKN & SELECTOR_TKN
authorDavid Lamparter <equinox@opensourcerouting.org>
Fri, 16 Dec 2016 21:30:36 +0000 (22:30 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Mon, 23 Jan 2017 20:52:43 +0000 (21:52 +0100)
These are functionally identical as "fork" tokens.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
lib/command.c
lib/command.h
lib/command_match.c
lib/command_parse.y
lib/grammar_sandbox.c
lib/grammar_sandbox.h [deleted file]
tools/permutations.c

index 6294e994e70c7ca451cbc3d13ab45e9c4b9204fc..cb1f54fbbd1ecff0074b71afc29c59160828572d 100644 (file)
@@ -1268,7 +1268,7 @@ permute (struct graph_node *start, struct vty *vty)
       for (ALL_LIST_ELEMENTS_RO (position,ln,gnn))
       {
         struct cmd_token *tt = gnn->data;
-        if (tt->type < SELECTOR_TKN)
+        if (tt->type < SPECIAL_TKN)
           vty_out (vty, " %s", tt->text);
       }
       if (gn == start)
index 1e1698fc7d123908f65365a6e7bcddbd643a18b9..dd940f0d573f87cc07b418c9b135511885af2f03 100644 (file)
@@ -176,11 +176,12 @@ enum cmd_token_type
   IPV6_PREFIX_TKN,  // IPV6 network prefixes
 
   /* plumbing types */
-  SELECTOR_TKN,     // marks beginning of selector
-  OPTION_TKN,       // marks beginning of option
-  NUL_TKN,          // dummy token
+  FORK_TKN,         // marks subgraph beginning
+  JOIN_TKN,         // marks subgraph end
   START_TKN,        // first token in line
   END_TKN,          // last token in line
+
+  SPECIAL_TKN = FORK_TKN,
 };
 
 /* Command attributes */
index d228563240075eab177b5ed886e28de5e0c88f8f..c3eec53bbcff3680b64a03a1c73d547476037d64 100644 (file)
@@ -459,7 +459,7 @@ command_complete (struct graph *graph,
 
 /**
  * Adds all children that are reachable by one parser hop to the given list.
- * NUL_TKN, SELECTOR_TKN, and OPTION_TKN nodes are treated as transparent.
+ * special tokens except END_TKN are treated as transparent.
  *
  * @param[in] list to add the nexthops to
  * @param[in] node to start calculating nexthops from
@@ -490,26 +490,24 @@ add_nexthops (struct list *list, struct graph_node *node,
           if (j != stackpos)
             continue;
         }
-      switch (token->type)
+      if (token->type >= SPECIAL_TKN && token->type != END_TKN)
         {
-          case OPTION_TKN:
-          case SELECTOR_TKN:
-          case NUL_TKN:
-            added += add_nexthops (list, child, stack, stackpos);
-            break;
-          default:
-            if (stack)
-              {
-                nextstack = XMALLOC (MTYPE_CMD_MATCHSTACK,
-                                     (stackpos + 1) * sizeof(struct graph_node *));
-                nextstack[0] = child;
-                memcpy(nextstack + 1, stack, stackpos * sizeof(struct graph_node *));
+          added += add_nexthops (list, child, stack, stackpos);
+        }
+      else
+        {
+          if (stack)
+            {
+              nextstack = XMALLOC (MTYPE_CMD_MATCHSTACK,
+                                   (stackpos + 1) * sizeof(struct graph_node *));
+              nextstack[0] = child;
+              memcpy(nextstack + 1, stack, stackpos * sizeof(struct graph_node *));
 
-                listnode_add (list, nextstack);
-              }
-            else
-              listnode_add (list, child);
-            added++;
+              listnode_add (list, nextstack);
+            }
+          else
+            listnode_add (list, child);
+          added++;
         }
     }
 
index c920e11380cdfa0bf118d7ed15aa975d8f3ebfb6..478ba0537c609fe19b7160a038e4c020d89db24f 100644 (file)
@@ -274,8 +274,8 @@ placeholder_token:
 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);
+  $$->start = new_token_node (ctx, FORK_TKN, NULL, NULL);
+  $$->end   = new_token_node (ctx, JOIN_TKN, NULL, NULL);
   for (unsigned int i = 0; i < vector_active ($2->start->to); i++)
   {
     struct graph_node *sn = vector_slot ($2->start->to, i),
@@ -329,8 +329,8 @@ selector_seq_seq:
 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);
+  $$->start = new_token_node (ctx, FORK_TKN, NULL, NULL);
+  $$->end   = new_token_node (ctx, JOIN_TKN, NULL, NULL);
   graph_add_edge ($$->start, $$->end);
   for (unsigned int i = 0; i < vector_active ($2->start->to); i++)
   {
@@ -377,8 +377,8 @@ option: '[' option_token_seq ']'
 {
   // make a new option
   $$ = malloc (sizeof (struct subgraph));
-  $$->start = new_token_node (ctx, OPTION_TKN, NULL, NULL);
-  $$->end   = new_token_node (ctx, NUL_TKN, NULL, NULL);
+  $$->start = new_token_node (ctx, FORK_TKN, NULL, NULL);
+  $$->end   = new_token_node (ctx, JOIN_TKN, NULL, NULL);
   // add a path through the sequence to the end
   graph_add_edge ($$->start, $2->start);
   graph_add_edge ($2->end, $$->end);
@@ -575,8 +575,7 @@ cmp_token (struct cmd_token *first, struct cmd_token *second)
      * cases; ultimately this forks the graph, but the matcher can handle
      * this regardless
      */
-    case SELECTOR_TKN:
-    case OPTION_TKN:
+    case FORK_TKN:
       return 0;
 
     /* end nodes are always considered equal, since each node may only
@@ -584,7 +583,7 @@ cmp_token (struct cmd_token *first, struct cmd_token *second)
      */
     case START_TKN:
     case END_TKN:
-    case NUL_TKN:
+    case JOIN_TKN:
     default:
       break;
   }
index 0239ca44ac9c84b6ddb3bd6af4e289019dd0fed2..b5ac36c41fb54182dde1fea7c039ed1f0db12db8 100644 (file)
@@ -275,9 +275,8 @@ struct message tokennames[] = {
   item(IPV6_PREFIX_TKN),  // IPV6 network prefixes
 
   /* plumbing types */
-  item(SELECTOR_TKN),     // marks beginning of selector
-  item(OPTION_TKN),       // marks beginning of option
-  item(NUL_TKN),          // dummy token
+  item(FORK_TKN),
+  item(JOIN_TKN),
   item(START_TKN),        // first token in line
   item(END_TKN),          // last token in line
   { 0, NULL }
diff --git a/lib/grammar_sandbox.h b/lib/grammar_sandbox.h
deleted file mode 100644 (file)
index 5da0b05..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _GRAMMAR_SANDBOX_H
-#define _GRAMMAR_SANDBOX_H
-
-/**
- * Houses functionality for testing shim as well as code that should go into
- * command.h and command.c during integration.
- */
-#include "memory.h"
-
-#define CMD_CR_TEXT "<cr>"
-
-void
-grammar_sandbox_init (void);
-
-/**
- * Types for tokens.
- *
- * The type determines what kind of data the token can match (in the
- * matching use case) or hold (in the argv use case).
- */
-enum cmd_token_type_t
-{
-  WORD_TKN,         // words
-  NUMBER_TKN,       // integral numbers
-  VARIABLE_TKN,     // almost anything
-  RANGE_TKN,        // integer range
-  IPV4_TKN,         // IPV4 addresses
-  IPV4_PREFIX_TKN,  // IPV4 network prefixes
-  IPV6_TKN,         // IPV6 prefixes
-  IPV6_PREFIX_TKN,  // IPV6 network prefixes
-
-  /* plumbing types */
-  SELECTOR_TKN,     // marks beginning of selector
-  OPTION_TKN,       // marks beginning of option
-  NUL_TKN,          // dummy token
-  START_TKN,        // first token in line
-  END_TKN,          // last token in line
-};
-
-/**
- * Token struct.
- */
-struct cmd_token_t
-{
-  enum cmd_token_type_t type;   // token type
-
-  char *text;                   // token text
-  char *desc;                   // token description
-
-  long long value;              // for numeric types
-  long long min, max;           // for ranges
-
-  char *arg;                    // user input that matches this token
-};
-
-#endif /* _GRAMMAR_SANDBOX_H */
index 8db51ee0374d8d1a59a1003a5f662d260345c6e6..0ca980b2595b186c06a6f1e633b80dc3049da2a6 100644 (file)
@@ -70,7 +70,7 @@ permute (struct graph_node *start)
       for (ALL_LIST_ELEMENTS_RO (position,ln,gnn))
       {
         struct cmd_token *tt = gnn->data;
-        if (tt->type < SELECTOR_TKN)
+        if (tt->type < SPECIAL_TKN)
           fprintf (stdout, "%s ", tt->text);
       }
       fprintf (stdout, "\n");