Przeglądaj źródła

ncd: NCDConfigParser: simplify grammar

ambrop7 13 lat temu
rodzic
commit
385ceeef2e

+ 213 - 221
generated/NCDConfigParser_parse.c

@@ -75,18 +75,18 @@ struct parser_out {
 **                       defined, then do no error processing.
 */
 #define YYCODETYPE unsigned char
-#define YYNOCODE 30
+#define YYNOCODE 31
 #define YYACTIONTYPE unsigned char
 #define ParseTOKENTYPE struct parser_minor
 typedef union {
   int yyinit;
   ParseTOKENTYPE yy0;
-  char * yy5;
-  struct NCDConfig_list * yy12;
-  struct NCDConfig_statements * yy16;
-  struct NCDConfig_strings * yy24;
-  struct NCDConfig_processes * yy45;
-  int yy46;
+  char * yy13;
+  struct NCDConfig_list * yy14;
+  struct NCDConfig_strings * yy44;
+  struct NCDConfig_statements * yy50;
+  int yy52;
+  struct NCDConfig_processes * yy57;
 } YYMINORTYPE;
 #ifndef YYSTACKDEPTH
 #define YYSTACKDEPTH 0
@@ -166,49 +166,47 @@ static const YYMINORTYPE yyzerominor = { 0 };
 **  yy_default[]       Default action for each state.
 */
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */    44,   21,   38,   45,   23,   46,   24,   44,   30,   38,
- /*    10 */    45,   32,   46,   24,   23,    3,   40,   44,   37,   25,
- /*    20 */    45,   18,   46,   24,    4,   22,   43,   44,   23,    3,
- /*    30 */    45,   28,   46,   26,   33,   34,   20,   16,    4,   47,
- /*    40 */    43,   36,   44,   29,   39,   45,   17,   46,   24,   44,
- /*    50 */    23,    3,   45,   42,   46,   26,   18,   78,   44,   31,
- /*    60 */     4,   45,   43,   46,   27,   35,   16,    1,   49,   16,
- /*    70 */    14,   50,    9,   19,   12,   13,    8,    5,   41,   79,
- /*    80 */    10,   79,   79,    2,   79,   79,    7,    6,   79,   48,
- /*    90 */    11,   79,   15,
+ /*     0 */    43,   20,   37,   44,   22,   45,   23,   43,   29,   37,
+ /*    10 */    44,   35,   45,   23,   22,    3,   39,   43,    1,   24,
+ /*    20 */    44,   13,   45,   23,    4,   16,   42,   43,   22,    3,
+ /*    30 */    44,   27,   45,   25,   32,   33,   17,   78,    4,   46,
+ /*    40 */    42,   43,   21,   38,   44,   43,   45,   23,   44,   41,
+ /*    50 */    45,   25,   22,    3,   43,   36,   28,   44,   30,   45,
+ /*    60 */    26,   31,    4,   50,   42,    9,   19,   15,    9,   49,
+ /*    70 */    15,   18,   17,    8,   11,   10,   12,    7,   40,   34,
+ /*    80 */    79,   79,    2,    5,   14,    6,   48,   79,   79,   47,
 };
 static const YYCODETYPE yy_lookahead[] = {
- /*     0 */    19,   20,   21,   22,    1,   24,   25,   19,   20,   21,
- /*    10 */    22,   17,   24,   25,    1,    2,    3,   19,    1,   21,
- /*    20 */    22,   27,   24,   25,   11,   26,   13,   19,    1,    2,
- /*    30 */    22,   23,   24,   25,   14,   15,   18,   19,   11,   12,
- /*    40 */    13,   19,   19,   19,   21,   22,   17,   24,   25,   19,
- /*    50 */     1,    2,   22,   23,   24,   25,   27,   28,   19,   26,
- /*    60 */    11,   22,   13,   24,   25,   18,   19,    4,   18,   19,
- /*    70 */     7,    0,    2,    1,    5,    8,    3,    9,    3,   29,
- /*    80 */     6,   29,   29,    4,   29,   29,   10,    9,   29,   12,
- /*    90 */     6,   29,    5,
+ /*     0 */    20,   21,   22,   23,    1,   25,   26,   20,   21,   22,
+ /*    10 */    23,    1,   25,   26,    1,    2,    3,   20,    4,   22,
+ /*    20 */    23,    7,   25,   26,   11,   17,   13,   20,    1,    2,
+ /*    30 */    23,   24,   25,   26,   14,   15,   28,   29,   11,   12,
+ /*    40 */    13,   20,   27,   22,   23,   20,   25,   26,   23,   24,
+ /*    50 */    25,   26,    1,    2,   20,   20,   20,   23,   27,   25,
+ /*    60 */    26,   17,   11,    0,   13,   18,   19,   20,   18,   19,
+ /*    70 */    20,    1,   28,    2,    5,    3,    8,   10,    3,    6,
+ /*    80 */    30,   30,    4,    9,    5,    9,    6,   30,   30,   12,
 };
 #define YY_SHIFT_USE_DFLT (-1)
-#define YY_SHIFT_MAX 31
+#define YY_SHIFT_MAX 30
 static const signed char yy_shift_ofst[] = {
- /*     0 */    20,   49,   49,   13,   27,   49,   49,   49,   20,    3,
- /*    10 */     3,    3,   17,    3,    3,   17,   63,   71,   72,   70,
- /*    20 */    73,   69,   74,   67,   68,   75,   76,   78,   77,   79,
- /*    30 */    87,   84,
+ /*     0 */    20,   51,   51,   13,   27,   51,   51,   51,    3,    3,
+ /*    10 */    20,   10,    3,    3,   10,   14,   63,   70,   71,   72,
+ /*    20 */    69,   73,   68,   74,   75,   67,   76,   77,   78,   79,
+ /*    30 */    80,
 };
-#define YY_REDUCE_USE_DFLT (-20)
-#define YY_REDUCE_MAX 15
+#define YY_REDUCE_USE_DFLT (-21)
+#define YY_REDUCE_MAX 14
 static const signed char yy_reduce_ofst[] = {
- /*     0 */    29,  -19,  -12,   -2,    8,   23,   30,   39,   -6,   18,
- /*    10 */    47,   50,   -1,   22,   24,   33,
+ /*     0 */     8,  -20,  -13,   -3,    7,   21,   25,   34,   47,   50,
+ /*    10 */    44,   15,   35,   36,   31,
 };
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */    77,   59,   59,   77,   77,   77,   77,   77,   51,   77,
- /*    10 */    53,   55,   73,   77,   77,   73,   77,   77,   77,   77,
- /*    20 */    77,   77,   77,   57,   61,   77,   77,   65,   77,   77,
- /*    30 */    77,   77,   52,   75,   76,   54,   58,   74,   60,   62,
- /*    40 */    63,   64,   66,   69,   70,   71,   72,   67,   68,   56,
+ /*     0 */    77,   59,   59,   77,   77,   77,   77,   77,   77,   55,
+ /*    10 */    51,   73,   77,   77,   73,   77,   77,   77,   77,   77,
+ /*    20 */    77,   77,   57,   61,   77,   77,   65,   77,   77,   77,
+ /*    30 */    77,   52,   75,   76,   53,   74,   58,   60,   62,   63,
+ /*    40 */    64,   66,   69,   70,   71,   72,   67,   68,   54,   56,
 };
 #define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
 
@@ -306,10 +304,10 @@ static const char *const yyTokenName[] = {
   "ROUND_OPEN",    "ROUND_CLOSE",   "SEMICOLON",     "ARROW",       
   "DOT",           "COMMA",         "COLON",         "BRACKET_OPEN",
   "BRACKET_CLOSE",  "STRING",        "PROCESS",       "TEMPLATE",    
-  "error",         "processes",     "statements",    "statement_names",
-  "statement_args_maybe",  "list_contents",  "list",          "map_contents",
-  "map",           "value",         "name_maybe",    "process_or_template",
-  "input",       
+  "error",         "processes",     "statement",     "statements",  
+  "statement_names",  "statement_args_maybe",  "list_contents",  "list",        
+  "map_contents",  "map",           "value",         "name_maybe",  
+  "process_or_template",  "input",       
 };
 #endif /* NDEBUG */
 
@@ -320,10 +318,10 @@ static const char *const yyRuleName[] = {
  /*   0 */ "input ::= processes",
  /*   1 */ "processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE",
  /*   2 */ "processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes",
- /*   3 */ "statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
- /*   4 */ "statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements",
- /*   5 */ "statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
- /*   6 */ "statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements",
+ /*   3 */ "statement ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
+ /*   4 */ "statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON",
+ /*   5 */ "statements ::= statement",
+ /*   6 */ "statements ::= statement statements",
  /*   7 */ "statement_names ::= NAME",
  /*   8 */ "statement_names ::= NAME DOT statement_names",
  /*   9 */ "statement_args_maybe ::=",
@@ -441,47 +439,48 @@ static void yy_destructor(
 {
 #line 55 "NCDConfigParser_parse.y"
  free((yypminor->yy0).str); 
-#line 445 "NCDConfigParser_parse.c"
+#line 443 "NCDConfigParser_parse.c"
 }
       break;
     case 17: /* processes */
 {
-#line 69 "NCDConfigParser_parse.y"
- NCDConfig_free_processes((yypminor->yy45)); 
-#line 452 "NCDConfigParser_parse.c"
+#line 70 "NCDConfigParser_parse.y"
+ NCDConfig_free_processes((yypminor->yy57)); 
+#line 450 "NCDConfigParser_parse.c"
 }
       break;
-    case 18: /* statements */
+    case 18: /* statement */
+    case 19: /* statements */
 {
-#line 70 "NCDConfigParser_parse.y"
- NCDConfig_free_statements((yypminor->yy16)); 
-#line 459 "NCDConfigParser_parse.c"
+#line 71 "NCDConfigParser_parse.y"
+ NCDConfig_free_statements((yypminor->yy50)); 
+#line 458 "NCDConfigParser_parse.c"
 }
       break;
-    case 19: /* statement_names */
+    case 20: /* statement_names */
 {
-#line 71 "NCDConfigParser_parse.y"
- NCDConfig_free_strings((yypminor->yy24)); 
-#line 466 "NCDConfigParser_parse.c"
+#line 73 "NCDConfigParser_parse.y"
+ NCDConfig_free_strings((yypminor->yy44)); 
+#line 465 "NCDConfigParser_parse.c"
 }
       break;
-    case 20: /* statement_args_maybe */
-    case 21: /* list_contents */
-    case 22: /* list */
-    case 23: /* map_contents */
-    case 24: /* map */
-    case 25: /* value */
+    case 21: /* statement_args_maybe */
+    case 22: /* list_contents */
+    case 23: /* list */
+    case 24: /* map_contents */
+    case 25: /* map */
+    case 26: /* value */
 {
-#line 72 "NCDConfigParser_parse.y"
- NCDConfig_free_list((yypminor->yy12)); 
-#line 478 "NCDConfigParser_parse.c"
+#line 74 "NCDConfigParser_parse.y"
+ NCDConfig_free_list((yypminor->yy14)); 
+#line 477 "NCDConfigParser_parse.c"
 }
       break;
-    case 26: /* name_maybe */
+    case 27: /* name_maybe */
 {
-#line 78 "NCDConfigParser_parse.y"
- free((yypminor->yy5)); 
-#line 485 "NCDConfigParser_parse.c"
+#line 80 "NCDConfigParser_parse.y"
+ free((yypminor->yy13)); 
+#line 484 "NCDConfigParser_parse.c"
 }
       break;
     default:  break;   /* If no destructor action specified: do nothing */
@@ -654,12 +653,12 @@ static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
    while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
    /* Here code is inserted which will execute if the parser
    ** stack every overflows */
-#line 87 "NCDConfigParser_parse.y"
+#line 89 "NCDConfigParser_parse.y"
 
     if (yypMinor) {
         free(yypMinor->yy0.str);
     }
-#line 663 "NCDConfigParser_parse.c"
+#line 662 "NCDConfigParser_parse.c"
    ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
 }
 
@@ -716,33 +715,33 @@ static const struct {
   YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
   unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
 } yyRuleInfo[] = {
-  { 28, 1 },
+  { 29, 1 },
   { 17, 5 },
   { 17, 6 },
   { 18, 6 },
-  { 18, 7 },
   { 18, 8 },
-  { 18, 9 },
   { 19, 1 },
-  { 19, 3 },
-  { 20, 0 },
+  { 19, 2 },
   { 20, 1 },
+  { 20, 3 },
+  { 21, 0 },
   { 21, 1 },
-  { 21, 3 },
-  { 22, 2 },
+  { 22, 1 },
   { 22, 3 },
+  { 23, 2 },
   { 23, 3 },
-  { 23, 5 },
-  { 24, 2 },
   { 24, 3 },
-  { 25, 1 },
-  { 25, 1 },
-  { 25, 1 },
-  { 25, 1 },
-  { 26, 0 },
+  { 24, 5 },
+  { 25, 2 },
+  { 25, 3 },
   { 26, 1 },
+  { 26, 1 },
+  { 26, 1 },
+  { 26, 1 },
+  { 27, 0 },
   { 27, 1 },
-  { 27, 1 },
+  { 28, 1 },
+  { 28, 1 },
 };
 
 static void yy_accept(yyParser*);  /* Forward Declaration */
@@ -798,71 +797,58 @@ static void yy_reduce(
   **     break;
   */
       case 0: /* input ::= processes */
-#line 93 "NCDConfigParser_parse.y"
+#line 95 "NCDConfigParser_parse.y"
 {
-    parser_out->ast = yymsp[0].minor.yy45;
+    parser_out->ast = yymsp[0].minor.yy57;
 
-    if (!yymsp[0].minor.yy45) {
+    if (!yymsp[0].minor.yy57) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 810 "NCDConfigParser_parse.c"
+#line 809 "NCDConfigParser_parse.c"
         break;
       case 1: /* processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE */
-#line 101 "NCDConfigParser_parse.y"
+#line 103 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy45 = NCDConfig_make_processes(yymsp[-4].minor.yy46, yymsp[-3].minor.yy0.str, yymsp[-1].minor.yy16, NULL);
-    if (!yygotominor.yy45) {
+    yygotominor.yy57 = NCDConfig_make_processes(yymsp[-4].minor.yy52, yymsp[-3].minor.yy0.str, yymsp[-1].minor.yy50, NULL);
+    if (!yygotominor.yy57) {
         parser_out->out_of_memory = 1;
     }
   yy_destructor(yypParser,2,&yymsp[-2].minor);
   yy_destructor(yypParser,3,&yymsp[0].minor);
 }
-#line 822 "NCDConfigParser_parse.c"
+#line 821 "NCDConfigParser_parse.c"
         break;
       case 2: /* processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes */
-#line 108 "NCDConfigParser_parse.y"
+#line 110 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy45 = NCDConfig_make_processes(yymsp[-5].minor.yy46, yymsp[-4].minor.yy0.str, yymsp[-2].minor.yy16, yymsp[0].minor.yy45);
-    if (!yygotominor.yy45) {
+    yygotominor.yy57 = NCDConfig_make_processes(yymsp[-5].minor.yy52, yymsp[-4].minor.yy0.str, yymsp[-2].minor.yy50, yymsp[0].minor.yy57);
+    if (!yygotominor.yy57) {
         parser_out->out_of_memory = 1;
     }
   yy_destructor(yypParser,2,&yymsp[-3].minor);
   yy_destructor(yypParser,3,&yymsp[-1].minor);
 }
-#line 834 "NCDConfigParser_parse.c"
+#line 833 "NCDConfigParser_parse.c"
         break;
-      case 3: /* statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
-#line 115 "NCDConfigParser_parse.y"
+      case 3: /* statement ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
+#line 117 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy16 = NCDConfig_make_statements(NULL, yymsp[-5].minor.yy24, yymsp[-3].minor.yy12, yymsp[-1].minor.yy5, NULL);
-    if (!yygotominor.yy16) {
+    yygotominor.yy50 = NCDConfig_make_statements(NULL, yymsp[-5].minor.yy44, yymsp[-3].minor.yy14, yymsp[-1].minor.yy13, NULL);
+    if (!yygotominor.yy50) {
         parser_out->out_of_memory = 1;
     }
   yy_destructor(yypParser,4,&yymsp[-4].minor);
   yy_destructor(yypParser,5,&yymsp[-2].minor);
   yy_destructor(yypParser,6,&yymsp[0].minor);
 }
-#line 847 "NCDConfigParser_parse.c"
+#line 846 "NCDConfigParser_parse.c"
         break;
-      case 4: /* statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements */
-#line 122 "NCDConfigParser_parse.y"
+      case 4: /* statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
+#line 124 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy16 = NCDConfig_make_statements(NULL, yymsp[-6].minor.yy24, yymsp[-4].minor.yy12, yymsp[-2].minor.yy5, yymsp[0].minor.yy16);
-    if (!yygotominor.yy16) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,4,&yymsp[-5].minor);
-  yy_destructor(yypParser,5,&yymsp[-3].minor);
-  yy_destructor(yypParser,6,&yymsp[-1].minor);
-}
-#line 860 "NCDConfigParser_parse.c"
-        break;
-      case 5: /* statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
-#line 129 "NCDConfigParser_parse.y"
-{
-    yygotominor.yy16 = NCDConfig_make_statements(yymsp[-7].minor.yy24, yymsp[-5].minor.yy24, yymsp[-3].minor.yy12, yymsp[-1].minor.yy5, NULL);
-    if (!yygotominor.yy16) {
+    yygotominor.yy50 = NCDConfig_make_statements(yymsp[-7].minor.yy44, yymsp[-5].minor.yy44, yymsp[-3].minor.yy14, yymsp[-1].minor.yy13, NULL);
+    if (!yygotominor.yy50) {
         parser_out->out_of_memory = 1;
     }
   yy_destructor(yypParser,7,&yymsp[-6].minor);
@@ -870,214 +856,220 @@ static void yy_reduce(
   yy_destructor(yypParser,5,&yymsp[-2].minor);
   yy_destructor(yypParser,6,&yymsp[0].minor);
 }
-#line 874 "NCDConfigParser_parse.c"
+#line 860 "NCDConfigParser_parse.c"
         break;
-      case 6: /* statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements */
-#line 136 "NCDConfigParser_parse.y"
+      case 5: /* statements ::= statement */
+#line 131 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy16 = NCDConfig_make_statements(yymsp[-8].minor.yy24, yymsp[-6].minor.yy24, yymsp[-4].minor.yy12, yymsp[-2].minor.yy5, yymsp[0].minor.yy16);
-    if (!yygotominor.yy16) {
-        parser_out->out_of_memory = 1;
+    yygotominor.yy50 = yymsp[0].minor.yy50;
+}
+#line 867 "NCDConfigParser_parse.c"
+        break;
+      case 6: /* statements ::= statement statements */
+#line 135 "NCDConfigParser_parse.y"
+{
+    if (!yymsp[-1].minor.yy50) {
+        NCDConfig_free_statements(yymsp[0].minor.yy50);
+    } else {
+        ASSERT(!yymsp[-1].minor.yy50->next)
+        yymsp[-1].minor.yy50->next = yymsp[0].minor.yy50;
     }
-  yy_destructor(yypParser,7,&yymsp[-7].minor);
-  yy_destructor(yypParser,4,&yymsp[-5].minor);
-  yy_destructor(yypParser,5,&yymsp[-3].minor);
-  yy_destructor(yypParser,6,&yymsp[-1].minor);
+    yygotominor.yy50 = yymsp[-1].minor.yy50;
 }
-#line 888 "NCDConfigParser_parse.c"
+#line 880 "NCDConfigParser_parse.c"
         break;
       case 7: /* statement_names ::= NAME */
-#line 143 "NCDConfigParser_parse.y"
+#line 145 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy24 = NCDConfig_make_strings(yymsp[0].minor.yy0.str, 0, NULL);
-    if (!yygotominor.yy24) {
+    yygotominor.yy44 = NCDConfig_make_strings(yymsp[0].minor.yy0.str, 0, NULL);
+    if (!yygotominor.yy44) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 898 "NCDConfigParser_parse.c"
+#line 890 "NCDConfigParser_parse.c"
         break;
       case 8: /* statement_names ::= NAME DOT statement_names */
-#line 150 "NCDConfigParser_parse.y"
+#line 152 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy24 = NCDConfig_make_strings(yymsp[-2].minor.yy0.str, 1, yymsp[0].minor.yy24);
-    if (!yygotominor.yy24) {
+    yygotominor.yy44 = NCDConfig_make_strings(yymsp[-2].minor.yy0.str, 1, yymsp[0].minor.yy44);
+    if (!yygotominor.yy44) {
         parser_out->out_of_memory = 1;
     }
   yy_destructor(yypParser,8,&yymsp[-1].minor);
 }
-#line 909 "NCDConfigParser_parse.c"
+#line 901 "NCDConfigParser_parse.c"
         break;
       case 9: /* statement_args_maybe ::= */
-#line 157 "NCDConfigParser_parse.y"
+#line 159 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NULL;
+    yygotominor.yy14 = NULL;
 }
-#line 916 "NCDConfigParser_parse.c"
+#line 908 "NCDConfigParser_parse.c"
         break;
       case 10: /* statement_args_maybe ::= list_contents */
       case 11: /* list_contents ::= value */ yytestcase(yyruleno==11);
-#line 161 "NCDConfigParser_parse.y"
+#line 163 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = yymsp[0].minor.yy12;
+    yygotominor.yy14 = yymsp[0].minor.yy14;
 }
-#line 924 "NCDConfigParser_parse.c"
+#line 916 "NCDConfigParser_parse.c"
         break;
       case 12: /* list_contents ::= value COMMA list_contents */
-#line 169 "NCDConfigParser_parse.y"
+#line 171 "NCDConfigParser_parse.y"
 {
-    if (!yymsp[-2].minor.yy12) {
-        NCDConfig_free_list(yymsp[0].minor.yy12);
+    if (!yymsp[-2].minor.yy14) {
+        NCDConfig_free_list(yymsp[0].minor.yy14);
     } else {
-        ASSERT(!yymsp[-2].minor.yy12->next)
-        yymsp[-2].minor.yy12->next = yymsp[0].minor.yy12;
+        ASSERT(!yymsp[-2].minor.yy14->next)
+        yymsp[-2].minor.yy14->next = yymsp[0].minor.yy14;
     }
-    yygotominor.yy12 = yymsp[-2].minor.yy12;
+    yygotominor.yy14 = yymsp[-2].minor.yy14;
   yy_destructor(yypParser,9,&yymsp[-1].minor);
 }
-#line 938 "NCDConfigParser_parse.c"
+#line 930 "NCDConfigParser_parse.c"
         break;
       case 13: /* list ::= CURLY_OPEN CURLY_CLOSE */
-#line 179 "NCDConfigParser_parse.y"
+#line 181 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NULL;
+    yygotominor.yy14 = NULL;
   yy_destructor(yypParser,2,&yymsp[-1].minor);
   yy_destructor(yypParser,3,&yymsp[0].minor);
 }
-#line 947 "NCDConfigParser_parse.c"
+#line 939 "NCDConfigParser_parse.c"
         break;
       case 14: /* list ::= CURLY_OPEN list_contents CURLY_CLOSE */
-#line 183 "NCDConfigParser_parse.y"
+#line 185 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = yymsp[-1].minor.yy12;
+    yygotominor.yy14 = yymsp[-1].minor.yy14;
   yy_destructor(yypParser,2,&yymsp[-2].minor);
   yy_destructor(yypParser,3,&yymsp[0].minor);
 }
-#line 956 "NCDConfigParser_parse.c"
+#line 948 "NCDConfigParser_parse.c"
         break;
       case 15: /* map_contents ::= value COLON value */
-#line 187 "NCDConfigParser_parse.y"
+#line 189 "NCDConfigParser_parse.y"
 {
-    if (!yymsp[-2].minor.yy12 || !yymsp[0].minor.yy12) {
-        NCDConfig_free_list(yymsp[-2].minor.yy12);
-        NCDConfig_free_list(yymsp[0].minor.yy12);
-        yygotominor.yy12 = NULL;
+    if (!yymsp[-2].minor.yy14 || !yymsp[0].minor.yy14) {
+        NCDConfig_free_list(yymsp[-2].minor.yy14);
+        NCDConfig_free_list(yymsp[0].minor.yy14);
+        yygotominor.yy14 = NULL;
     } else {
-        ASSERT(!yymsp[-2].minor.yy12->next)
-        ASSERT(!yymsp[0].minor.yy12->next)
-        yymsp[-2].minor.yy12->next = yymsp[0].minor.yy12;
-        yygotominor.yy12 = yymsp[-2].minor.yy12;
+        ASSERT(!yymsp[-2].minor.yy14->next)
+        ASSERT(!yymsp[0].minor.yy14->next)
+        yymsp[-2].minor.yy14->next = yymsp[0].minor.yy14;
+        yygotominor.yy14 = yymsp[-2].minor.yy14;
     }
   yy_destructor(yypParser,10,&yymsp[-1].minor);
 }
-#line 973 "NCDConfigParser_parse.c"
+#line 965 "NCDConfigParser_parse.c"
         break;
       case 16: /* map_contents ::= value COLON value COMMA map_contents */
-#line 200 "NCDConfigParser_parse.y"
+#line 202 "NCDConfigParser_parse.y"
 {
-    if (!yymsp[-4].minor.yy12 || !yymsp[-2].minor.yy12) {
-        NCDConfig_free_list(yymsp[-4].minor.yy12);
-        NCDConfig_free_list(yymsp[-2].minor.yy12);
-        NCDConfig_free_list(yymsp[0].minor.yy12);
-        yygotominor.yy12 = NULL;
+    if (!yymsp[-4].minor.yy14 || !yymsp[-2].minor.yy14) {
+        NCDConfig_free_list(yymsp[-4].minor.yy14);
+        NCDConfig_free_list(yymsp[-2].minor.yy14);
+        NCDConfig_free_list(yymsp[0].minor.yy14);
+        yygotominor.yy14 = NULL;
     } else {
-        ASSERT(!yymsp[-4].minor.yy12->next)
-        ASSERT(!yymsp[-2].minor.yy12->next)
-        yymsp[-4].minor.yy12->next = yymsp[-2].minor.yy12;
-        yymsp[-2].minor.yy12->next = yymsp[0].minor.yy12;
-        yygotominor.yy12 = yymsp[-4].minor.yy12;
+        ASSERT(!yymsp[-4].minor.yy14->next)
+        ASSERT(!yymsp[-2].minor.yy14->next)
+        yymsp[-4].minor.yy14->next = yymsp[-2].minor.yy14;
+        yymsp[-2].minor.yy14->next = yymsp[0].minor.yy14;
+        yygotominor.yy14 = yymsp[-4].minor.yy14;
     }
   yy_destructor(yypParser,10,&yymsp[-3].minor);
   yy_destructor(yypParser,9,&yymsp[-1].minor);
 }
-#line 993 "NCDConfigParser_parse.c"
+#line 985 "NCDConfigParser_parse.c"
         break;
       case 17: /* map ::= BRACKET_OPEN BRACKET_CLOSE */
-#line 215 "NCDConfigParser_parse.y"
+#line 217 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NULL;
+    yygotominor.yy14 = NULL;
   yy_destructor(yypParser,11,&yymsp[-1].minor);
   yy_destructor(yypParser,12,&yymsp[0].minor);
 }
-#line 1002 "NCDConfigParser_parse.c"
+#line 994 "NCDConfigParser_parse.c"
         break;
       case 18: /* map ::= BRACKET_OPEN map_contents BRACKET_CLOSE */
-#line 219 "NCDConfigParser_parse.y"
+#line 221 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = yymsp[-1].minor.yy12;
+    yygotominor.yy14 = yymsp[-1].minor.yy14;
   yy_destructor(yypParser,11,&yymsp[-2].minor);
   yy_destructor(yypParser,12,&yymsp[0].minor);
 }
-#line 1011 "NCDConfigParser_parse.c"
+#line 1003 "NCDConfigParser_parse.c"
         break;
       case 19: /* value ::= STRING */
-#line 223 "NCDConfigParser_parse.y"
+#line 225 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NCDConfig_make_list_string(yymsp[0].minor.yy0.str, yymsp[0].minor.yy0.len, NULL);
-    if (!yygotominor.yy12) {
+    yygotominor.yy14 = NCDConfig_make_list_string(yymsp[0].minor.yy0.str, yymsp[0].minor.yy0.len, NULL);
+    if (!yygotominor.yy14) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 1021 "NCDConfigParser_parse.c"
+#line 1013 "NCDConfigParser_parse.c"
         break;
       case 20: /* value ::= statement_names */
-#line 230 "NCDConfigParser_parse.y"
+#line 232 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NCDConfig_make_list_var(yymsp[0].minor.yy24, NULL);
-    if (!yygotominor.yy12) {
+    yygotominor.yy14 = NCDConfig_make_list_var(yymsp[0].minor.yy44, NULL);
+    if (!yygotominor.yy14) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 1031 "NCDConfigParser_parse.c"
+#line 1023 "NCDConfigParser_parse.c"
         break;
       case 21: /* value ::= list */
-#line 237 "NCDConfigParser_parse.y"
+#line 239 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NCDConfig_make_list_list(yymsp[0].minor.yy12, NULL);
-    if (!yygotominor.yy12) {
+    yygotominor.yy14 = NCDConfig_make_list_list(yymsp[0].minor.yy14, NULL);
+    if (!yygotominor.yy14) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 1041 "NCDConfigParser_parse.c"
+#line 1033 "NCDConfigParser_parse.c"
         break;
       case 22: /* value ::= map */
-#line 244 "NCDConfigParser_parse.y"
+#line 246 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy12 = NCDConfig_make_list_maplist(yymsp[0].minor.yy12, NULL);
-    if (!yygotominor.yy12) {
+    yygotominor.yy14 = NCDConfig_make_list_maplist(yymsp[0].minor.yy14, NULL);
+    if (!yygotominor.yy14) {
         parser_out->out_of_memory = 1;
     }
 }
-#line 1051 "NCDConfigParser_parse.c"
+#line 1043 "NCDConfigParser_parse.c"
         break;
       case 23: /* name_maybe ::= */
-#line 251 "NCDConfigParser_parse.y"
+#line 253 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy5 = NULL;
+    yygotominor.yy13 = NULL;
 }
-#line 1058 "NCDConfigParser_parse.c"
+#line 1050 "NCDConfigParser_parse.c"
         break;
       case 24: /* name_maybe ::= NAME */
-#line 255 "NCDConfigParser_parse.y"
+#line 257 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy5 = yymsp[0].minor.yy0.str;
+    yygotominor.yy13 = yymsp[0].minor.yy0.str;
 }
-#line 1065 "NCDConfigParser_parse.c"
+#line 1057 "NCDConfigParser_parse.c"
         break;
       case 25: /* process_or_template ::= PROCESS */
-#line 259 "NCDConfigParser_parse.y"
+#line 261 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy46 = 0;
+    yygotominor.yy52 = 0;
   yy_destructor(yypParser,14,&yymsp[0].minor);
 }
-#line 1073 "NCDConfigParser_parse.c"
+#line 1065 "NCDConfigParser_parse.c"
         break;
       case 26: /* process_or_template ::= TEMPLATE */
-#line 263 "NCDConfigParser_parse.y"
+#line 265 "NCDConfigParser_parse.y"
 {
-    yygotominor.yy46 = 1;
+    yygotominor.yy52 = 1;
   yy_destructor(yypParser,15,&yymsp[0].minor);
 }
-#line 1081 "NCDConfigParser_parse.c"
+#line 1073 "NCDConfigParser_parse.c"
         break;
       default:
         break;
@@ -1139,10 +1131,10 @@ static void yy_syntax_error(
 ){
   ParseARG_FETCH;
 #define TOKEN (yyminor.yy0)
-#line 82 "NCDConfigParser_parse.y"
+#line 84 "NCDConfigParser_parse.y"
 
     parser_out->syntax_error = 1;
-#line 1146 "NCDConfigParser_parse.c"
+#line 1138 "NCDConfigParser_parse.c"
   ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
 

+ 176 - 195
generated/NCDConfigParser_parse.out

@@ -5,15 +5,14 @@ State 0:
           process_or_template ::= * PROCESS
           process_or_template ::= * TEMPLATE
 
-                       PROCESS shift  33
-                      TEMPLATE shift  34
-                     processes shift  17
-           process_or_template shift  18
+                       PROCESS shift  32
+                      TEMPLATE shift  33
+                     processes shift  16
+           process_or_template shift  17
                          input accept
 
 State 1:
-          statements ::= statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statement ::= statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
       (9) statement_args_maybe ::= *
@@ -29,21 +28,20 @@ State 1:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-          statement_args_maybe shift  21
-                 list_contents shift  38
-                          list shift  45
-                           map shift  46
-                         value shift  24
+                        STRING shift  42
+               statement_names shift  43
+          statement_args_maybe shift  20
+                 list_contents shift  37
+                          list shift  44
+                           map shift  45
+                         value shift  23
                      {default} reduce 9
 
 State 2:
-          statements ::= statement_names ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statement ::= statement_names ARROW statement_names ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
       (9) statement_args_maybe ::= *
@@ -59,16 +57,16 @@ State 2:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-          statement_args_maybe shift  30
-                 list_contents shift  38
-                          list shift  45
-                           map shift  46
-                         value shift  24
+                        STRING shift  42
+               statement_names shift  43
+          statement_args_maybe shift  29
+                 list_contents shift  37
+                          list shift  44
+                           map shift  45
+                         value shift  23
                      {default} reduce 9
 
 State 3:
@@ -87,16 +85,16 @@ State 3:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
-                   CURLY_CLOSE shift  40
+                   CURLY_CLOSE shift  39
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-                 list_contents shift  25
-                          list shift  45
-                           map shift  46
-                         value shift  24
+                        STRING shift  42
+               statement_names shift  43
+                 list_contents shift  24
+                          list shift  44
+                           map shift  45
+                         value shift  23
 
 State 4:
           statement_names ::= * NAME
@@ -114,16 +112,16 @@ State 4:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                 BRACKET_CLOSE shift  47
-                        STRING shift  43
-               statement_names shift  44
-                          list shift  45
-                  map_contents shift  28
-                           map shift  46
-                         value shift  26
+                 BRACKET_CLOSE shift  46
+                        STRING shift  42
+               statement_names shift  43
+                          list shift  44
+                  map_contents shift  27
+                           map shift  45
+                         value shift  25
 
 State 5:
           statement_names ::= * NAME
@@ -140,15 +138,15 @@ State 5:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-                 list_contents shift  39
-                          list shift  45
-                           map shift  46
-                         value shift  24
+                        STRING shift  42
+               statement_names shift  43
+                 list_contents shift  38
+                          list shift  44
+                           map shift  45
+                         value shift  23
 
 State 6:
           statement_names ::= * NAME
@@ -165,15 +163,15 @@ State 6:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-                          list shift  45
-                  map_contents shift  42
-                           map shift  46
-                         value shift  26
+                        STRING shift  42
+               statement_names shift  43
+                          list shift  44
+                  map_contents shift  41
+                           map shift  45
+                         value shift  25
 
 State 7:
           statement_names ::= * NAME
@@ -189,228 +187,210 @@ State 7:
           value ::= * list
           value ::= * map
 
-                          NAME shift  23
+                          NAME shift  22
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                        STRING shift  43
-               statement_names shift  44
-                          list shift  45
-                           map shift  46
-                         value shift  27
+                        STRING shift  42
+               statement_names shift  43
+                          list shift  44
+                           map shift  45
+                         value shift  26
 
 State 8:
-          processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE
-      (1) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE *
-          processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes
-          processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE * processes
-          process_or_template ::= * PROCESS
-          process_or_template ::= * TEMPLATE
-
-                       PROCESS shift  33
-                      TEMPLATE shift  34
-                     processes shift  32
-           process_or_template shift  18
-                     {default} reduce 1
-
-State 9:
           processes ::= process_or_template NAME CURLY_OPEN * statements CURLY_CLOSE
           processes ::= process_or_template NAME CURLY_OPEN * statements CURLY_CLOSE processes
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+          statement ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statement ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= * statement
+          statements ::= * statement statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  23
-                    statements shift  20
-               statement_names shift  16
-
-State 10:
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-      (3) statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON * statements
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statement_names ::= * NAME
-          statement_names ::= * NAME DOT statement_names
+                          NAME shift  22
+                     statement shift  9
+                    statements shift  19
+               statement_names shift  15
 
-                          NAME shift  23
-                    statements shift  35
-               statement_names shift  16
-                     {default} reduce 3
-
-State 11:
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-      (5) statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
-          statements ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON * statements
+State 9:
+          statement ::= * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statement ::= * statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statements ::= * statement
+      (5) statements ::= statement *
+          statements ::= * statement statements
+          statements ::= statement * statements
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  23
+                          NAME shift  22
+                     statement shift  9
                     statements shift  49
-               statement_names shift  16
+               statement_names shift  15
                      {default} reduce 5
 
-State 12:
-          statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON statements
+State 10:
+          processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE
+      (1) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE *
+          processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes
+          processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE * processes
+          process_or_template ::= * PROCESS
+          process_or_template ::= * TEMPLATE
+
+                       PROCESS shift  32
+                      TEMPLATE shift  33
+                     processes shift  31
+           process_or_template shift  17
+                     {default} reduce 1
+
+State 11:
+          statement ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
      (23) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  37
-                    name_maybe shift  22
+                          NAME shift  35
+                    name_maybe shift  21
                      {default} reduce 23
 
-State 13:
+State 12:
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
           statement_names ::= NAME DOT * statement_names
 
-                          NAME shift  23
+                          NAME shift  22
                statement_names shift  36
 
-State 14:
-          statements ::= statement_names ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+State 13:
+          statement ::= statement_names ARROW * statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
 
-                          NAME shift  23
-               statement_names shift  29
+                          NAME shift  22
+               statement_names shift  28
 
-State 15:
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON statements
+State 14:
+          statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
      (23) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  37
-                    name_maybe shift  31
+                          NAME shift  35
+                    name_maybe shift  30
                      {default} reduce 23
 
-State 16:
-          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
-          statements ::= statement_names * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+State 15:
+          statement ::= statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
+          statement ::= statement_names * ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
 
                     ROUND_OPEN shift  1
-                         ARROW shift  14
+                         ARROW shift  13
 
-State 17:
+State 16:
       (0) input ::= processes *
 
                              $ reduce 0
 
-State 18:
+State 17:
           processes ::= process_or_template * NAME CURLY_OPEN statements CURLY_CLOSE
           processes ::= process_or_template * NAME CURLY_OPEN statements CURLY_CLOSE processes
 
-                          NAME shift  19
+                          NAME shift  18
 
-State 19:
+State 18:
           processes ::= process_or_template NAME * CURLY_OPEN statements CURLY_CLOSE
           processes ::= process_or_template NAME * CURLY_OPEN statements CURLY_CLOSE processes
 
-                    CURLY_OPEN shift  9
+                    CURLY_OPEN shift  8
 
-State 20:
+State 19:
           processes ::= process_or_template NAME CURLY_OPEN statements * CURLY_CLOSE
           processes ::= process_or_template NAME CURLY_OPEN statements * CURLY_CLOSE processes
 
-                   CURLY_CLOSE shift  8
+                   CURLY_CLOSE shift  10
 
-State 21:
-          statements ::= statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON statements
+State 20:
+          statement ::= statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  12
+                   ROUND_CLOSE shift  11
 
-State 22:
-          statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON statements
+State 21:
+          statement ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  10
+                     SEMICOLON shift  34
 
-State 23:
+State 22:
       (7) statement_names ::= NAME *
           statement_names ::= NAME * DOT statement_names
 
-                           DOT shift  13
+                           DOT shift  12
                      {default} reduce 7
 
-State 24:
+State 23:
      (11) list_contents ::= value *
           list_contents ::= value * COMMA list_contents
 
                          COMMA shift  5
                      {default} reduce 11
 
-State 25:
+State 24:
           list ::= CURLY_OPEN list_contents * CURLY_CLOSE
 
-                   CURLY_CLOSE shift  41
+                   CURLY_CLOSE shift  40
 
-State 26:
+State 25:
           map_contents ::= value * COLON value
           map_contents ::= value * COLON value COMMA map_contents
 
                          COLON shift  7
 
-State 27:
+State 26:
      (15) map_contents ::= value COLON value *
           map_contents ::= value COLON value * COMMA map_contents
 
                          COMMA shift  6
                      {default} reduce 15
 
-State 28:
+State 27:
           map ::= BRACKET_OPEN map_contents * BRACKET_CLOSE
 
-                 BRACKET_CLOSE shift  48
+                 BRACKET_CLOSE shift  47
 
-State 29:
-          statements ::= statement_names ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements
+State 28:
+          statement ::= statement_names ARROW statement_names * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
 
                     ROUND_OPEN shift  2
 
-State 30:
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON statements
+State 29:
+          statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  15
+                   ROUND_CLOSE shift  14
 
-State 31:
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
-          statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON statements
+State 30:
+          statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  11
+                     SEMICOLON shift  48
 
-State 32:
+State 31:
       (2) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes *
 
                      {default} reduce 2
 
-State 33:
+State 32:
      (25) process_or_template ::= PROCESS *
 
                      {default} reduce 25
 
-State 34:
+State 33:
      (26) process_or_template ::= TEMPLATE *
 
                      {default} reduce 26
 
+State 34:
+      (3) statement ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
+
+                     {default} reduce 3
+
 State 35:
-      (4) statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
+     (24) name_maybe ::= NAME *
 
-                     {default} reduce 4
+                     {default} reduce 24
 
 State 36:
       (8) statement_names ::= NAME DOT statement_names *
@@ -418,67 +398,67 @@ State 36:
                      {default} reduce 8
 
 State 37:
-     (24) name_maybe ::= NAME *
-
-                     {default} reduce 24
-
-State 38:
      (10) statement_args_maybe ::= list_contents *
 
                      {default} reduce 10
 
-State 39:
+State 38:
      (12) list_contents ::= value COMMA list_contents *
 
                      {default} reduce 12
 
-State 40:
+State 39:
      (13) list ::= CURLY_OPEN CURLY_CLOSE *
 
                      {default} reduce 13
 
-State 41:
+State 40:
      (14) list ::= CURLY_OPEN list_contents CURLY_CLOSE *
 
                      {default} reduce 14
 
-State 42:
+State 41:
      (16) map_contents ::= value COLON value COMMA map_contents *
 
                      {default} reduce 16
 
-State 43:
+State 42:
      (19) value ::= STRING *
 
                      {default} reduce 19
 
-State 44:
+State 43:
      (20) value ::= statement_names *
 
                      {default} reduce 20
 
-State 45:
+State 44:
      (21) value ::= list *
 
                      {default} reduce 21
 
-State 46:
+State 45:
      (22) value ::= map *
 
                      {default} reduce 22
 
-State 47:
+State 46:
      (17) map ::= BRACKET_OPEN BRACKET_CLOSE *
 
                      {default} reduce 17
 
-State 48:
+State 47:
      (18) map ::= BRACKET_OPEN map_contents BRACKET_CLOSE *
 
                      {default} reduce 18
 
+State 48:
+      (4) statement ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
+
+                     {default} reduce 4
+
 State 49:
-      (6) statements ::= statement_names ARROW statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
+      (6) statements ::= statement statements *
 
                      {default} reduce 6
 
@@ -502,14 +482,15 @@ Symbols:
    15: TEMPLATE
    16: error:
    17: processes: PROCESS TEMPLATE
-   18: statements: NAME
-   19: statement_names: NAME
-   20: statement_args_maybe: <lambda> NAME CURLY_OPEN BRACKET_OPEN STRING
-   21: list_contents: NAME CURLY_OPEN BRACKET_OPEN STRING
-   22: list: CURLY_OPEN
-   23: map_contents: NAME CURLY_OPEN BRACKET_OPEN STRING
-   24: map: BRACKET_OPEN
-   25: value: NAME CURLY_OPEN BRACKET_OPEN STRING
-   26: name_maybe: <lambda> NAME
-   27: process_or_template: PROCESS TEMPLATE
-   28: input: PROCESS TEMPLATE
+   18: statement: NAME
+   19: statements: NAME
+   20: statement_names: NAME
+   21: statement_args_maybe: <lambda> NAME CURLY_OPEN BRACKET_OPEN STRING
+   22: list_contents: NAME CURLY_OPEN BRACKET_OPEN STRING
+   23: list: CURLY_OPEN
+   24: map_contents: NAME CURLY_OPEN BRACKET_OPEN STRING
+   25: map: BRACKET_OPEN
+   26: value: NAME CURLY_OPEN BRACKET_OPEN STRING
+   27: name_maybe: <lambda> NAME
+   28: process_or_template: PROCESS TEMPLATE
+   29: input: PROCESS TEMPLATE

+ 14 - 12
generated/NCDConfigParser_parse.y

@@ -55,6 +55,7 @@ struct parser_out {
 %token_destructor { free($$.str); }
 
 %type processes {struct NCDConfig_processes *}
+%type statement {struct NCDConfig_statements *}
 %type statements {struct NCDConfig_statements *}
 %type statement_names {struct NCDConfig_strings *}
 %type statement_args_maybe {struct NCDConfig_list *}
@@ -67,6 +68,7 @@ struct parser_out {
 %type process_or_template {int}
 
 %destructor processes { NCDConfig_free_processes($$); }
+%destructor statement { NCDConfig_free_statements($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
 %destructor statement_args_maybe { NCDConfig_free_list($$); }
@@ -112,32 +114,32 @@ processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_C
     }
 }
 
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+statement(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(NULL, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(NULL, A, B, C, N);
+statement(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+    R = NCDConfig_make_statements(M, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
-    R = NCDConfig_make_statements(M, A, B, C, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
+statements(R) ::= statement(A). {
+    R = A;
 }
 
-statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(M, A, B, C, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
+statements(R) ::= statement(A) statements(N). {
+    if (!A) {
+        NCDConfig_free_statements(N);
+    } else {
+        ASSERT(!A->next)
+        A->next = N;
     }
+    R = A;
 }
 
 statement_names(R) ::= NAME(A). {

+ 14 - 12
ncd/NCDConfigParser_parse.y

@@ -55,6 +55,7 @@ struct parser_out {
 %token_destructor { free($$.str); }
 
 %type processes {struct NCDConfig_processes *}
+%type statement {struct NCDConfig_statements *}
 %type statements {struct NCDConfig_statements *}
 %type statement_names {struct NCDConfig_strings *}
 %type statement_args_maybe {struct NCDConfig_list *}
@@ -67,6 +68,7 @@ struct parser_out {
 %type process_or_template {int}
 
 %destructor processes { NCDConfig_free_processes($$); }
+%destructor statement { NCDConfig_free_statements($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
 %destructor statement_args_maybe { NCDConfig_free_list($$); }
@@ -112,32 +114,32 @@ processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_C
     }
 }
 
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+statement(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(NULL, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(NULL, A, B, C, N);
+statement(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
+    R = NCDConfig_make_statements(M, A, B, C, NULL);
     if (!R) {
         parser_out->out_of_memory = 1;
     }
 }
 
-statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
-    R = NCDConfig_make_statements(M, A, B, C, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
+statements(R) ::= statement(A). {
+    R = A;
 }
 
-statements(R) ::= statement_names(M) ARROW statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(M, A, B, C, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
+statements(R) ::= statement(A) statements(N). {
+    if (!A) {
+        NCDConfig_free_statements(N);
+    } else {
+        ASSERT(!A->next)
+        A->next = N;
     }
+    R = A;
 }
 
 statement_names(R) ::= NAME(A). {