Browse Source

ncdconfig: compress the grammar a little

ambrop7 15 năm trước cách đây
mục cha
commit
816abd1d06

+ 145 - 195
generated/NCDConfigParser_parse.c

@@ -70,16 +70,17 @@ struct parser_out {
 **                       defined, then do no error processing.
 **                       defined, then do no error processing.
 */
 */
 #define YYCODETYPE unsigned char
 #define YYCODETYPE unsigned char
-#define YYNOCODE 18
+#define YYNOCODE 20
 #define YYACTIONTYPE unsigned char
 #define YYACTIONTYPE unsigned char
 #define ParseTOKENTYPE void *
 #define ParseTOKENTYPE void *
 typedef union {
 typedef union {
   int yyinit;
   int yyinit;
   ParseTOKENTYPE yy0;
   ParseTOKENTYPE yy0;
-  struct NCDConfig_strings * yy10;
-  struct NCDConfig_statements * yy18;
-  struct NCDConfig_interfaces * yy32;
-  struct NCDConfig_arguments * yy34;
+  char * yy9;
+  struct NCDConfig_interfaces * yy20;
+  struct NCDConfig_statements * yy26;
+  struct NCDConfig_strings * yy30;
+  struct NCDConfig_arguments * yy36;
 } YYMINORTYPE;
 } YYMINORTYPE;
 #ifndef YYSTACKDEPTH
 #ifndef YYSTACKDEPTH
 #define YYSTACKDEPTH 0
 #define YYSTACKDEPTH 0
@@ -88,8 +89,8 @@ typedef union {
 #define ParseARG_PDECL ,struct parser_out *parser_out
 #define ParseARG_PDECL ,struct parser_out *parser_out
 #define ParseARG_FETCH struct parser_out *parser_out = yypParser->parser_out
 #define ParseARG_FETCH struct parser_out *parser_out = yypParser->parser_out
 #define ParseARG_STORE yypParser->parser_out = parser_out
 #define ParseARG_STORE yypParser->parser_out = parser_out
-#define YYNSTATE 32
-#define YYNRULE 17
+#define YYNSTATE 26
+#define YYNRULE 15
 #define YY_NO_ACTION      (YYNSTATE+YYNRULE+2)
 #define YY_NO_ACTION      (YYNSTATE+YYNRULE+2)
 #define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)
 #define YY_ACCEPT_ACTION  (YYNSTATE+YYNRULE+1)
 #define YY_ERROR_ACTION   (YYNSTATE+YYNRULE)
 #define YY_ERROR_ACTION   (YYNSTATE+YYNRULE)
@@ -159,37 +160,32 @@ static const YYMINORTYPE yyzerominor = { 0 };
 **  yy_default[]       Default action for each state.
 **  yy_default[]       Default action for each state.
 */
 */
 static const YYACTIONTYPE yy_action[] = {
 static const YYACTIONTYPE yy_action[] = {
- /*     0 */    18,   13,   23,   20,   11,   50,   18,   22,   23,   31,
- /*    10 */    23,   30,   14,   22,   16,   17,   25,   17,   27,   17,
- /*    20 */    28,   17,   29,   17,   19,   21,   18,   24,   26,    5,
- /*    30 */     7,   32,   15,    9,   10,    4,   51,    2,    1,   51,
- /*    40 */    51,    6,   12,   51,   51,    3,    8,
+ /*     0 */    18,   14,   23,    9,   16,   10,   18,   16,   25,   42,
+ /*    10 */    18,   17,   24,   12,   13,   22,   20,   13,   19,   26,
+ /*    20 */    11,    6,   21,    4,   15,    2,    1,   43,    7,   43,
+ /*    30 */     5,   43,    8,   43,   43,    3,
 };
 };
 static const YYCODETYPE yy_lookahead[] = {
 static const YYCODETYPE yy_lookahead[] = {
- /*     0 */     2,   12,   14,   15,    6,   16,    2,    9,   14,   15,
- /*    10 */    14,   15,    1,    9,   13,   14,   13,   14,   13,   14,
- /*    20 */    13,   14,   13,   14,    2,    2,    2,   12,   14,    7,
- /*    30 */     7,    0,    2,    4,    8,    3,   17,   10,    5,   17,
- /*    40 */    17,    7,    6,   17,   17,   10,    7,
+ /*     0 */    14,   15,   16,   12,    2,    1,   14,    2,   16,   18,
+ /*    10 */    14,    9,   16,   13,   14,    2,   13,   14,   12,    0,
+ /*    20 */     2,    4,   14,    3,   17,   10,    5,   19,    6,   19,
+ /*    30 */     7,   19,    8,   19,   19,   10,
 };
 };
-#define YY_SHIFT_USE_DFLT (-3)
-#define YY_SHIFT_MAX 23
+#define YY_SHIFT_USE_DFLT (-1)
+#define YY_SHIFT_MAX 18
 static const signed char yy_shift_ofst[] = {
 static const signed char yy_shift_ofst[] = {
- /*     0 */    11,   -2,    4,    4,   24,   24,   24,   24,   24,   11,
- /*    10 */    24,   22,   23,   31,   30,   32,   29,   33,   26,   34,
- /*    20 */    36,   39,   27,   35,
+ /*     0 */     4,    2,    2,    2,    5,    5,    4,   13,    5,   19,
+ /*    10 */    18,   20,   17,   21,   22,   23,   24,   15,   25,
 };
 };
-#define YY_REDUCE_USE_DFLT (-13)
-#define YY_REDUCE_MAX 10
+#define YY_REDUCE_USE_DFLT (-15)
+#define YY_REDUCE_MAX 8
 static const signed char yy_reduce_ofst[] = {
 static const signed char yy_reduce_ofst[] = {
- /*     0 */   -11,  -12,   -6,   -4,    1,    3,    5,    7,    9,   15,
- /*    10 */    14,
+ /*     0 */    -9,  -14,   -8,   -4,    0,    3,    6,    7,    8,
 };
 };
 static const YYACTIONTYPE yy_default[] = {
 static const YYACTIONTYPE yy_default[] = {
- /*     0 */    49,   49,   49,   49,   49,   35,   39,   36,   40,   33,
- /*    10 */    49,   49,   49,   49,   49,   49,   49,   49,   43,   49,
- /*    20 */    49,   49,   45,   46,   34,   37,   44,   41,   38,   42,
- /*    30 */    48,   47,
+ /*     0 */    41,   33,   41,   41,   41,   29,   27,   39,   41,   41,
+ /*    10 */    41,   41,   41,   41,   41,   41,   31,   35,   36,   28,
+ /*    20 */    30,   32,   40,   34,   38,   37,
 };
 };
 #define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
 #define YY_SZ_ACTTAB (int)(sizeof(yy_action)/sizeof(yy_action[0]))
 
 
@@ -286,8 +282,8 @@ static const char *const yyTokenName[] = {
   "$",             "PROCESS",       "NAME",          "CURLY_OPEN",  
   "$",             "PROCESS",       "NAME",          "CURLY_OPEN",  
   "CURLY_CLOSE",   "ROUND_OPEN",    "ROUND_CLOSE",   "SEMICOLON",   
   "CURLY_CLOSE",   "ROUND_OPEN",    "ROUND_CLOSE",   "SEMICOLON",   
   "DOT",           "STRING",        "COMMA",         "error",       
   "DOT",           "STRING",        "COMMA",         "error",       
-  "interfaces",    "statements",    "statement_names",  "statement_args",
-  "input",       
+  "interfaces",    "statements",    "statement_names",  "statement_args_maybe",
+  "statement_args",  "name_maybe",    "input",       
 };
 };
 #endif /* NDEBUG */
 #endif /* NDEBUG */
 
 
@@ -298,20 +294,18 @@ static const char *const yyRuleName[] = {
  /*   0 */ "input ::= interfaces",
  /*   0 */ "input ::= interfaces",
  /*   1 */ "interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE",
  /*   1 */ "interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE",
  /*   2 */ "interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces",
  /*   2 */ "interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces",
- /*   3 */ "statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON",
- /*   4 */ "statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON",
- /*   5 */ "statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements",
- /*   6 */ "statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements",
- /*   7 */ "statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON",
- /*   8 */ "statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON",
- /*   9 */ "statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements",
- /*  10 */ "statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements",
- /*  11 */ "statement_names ::= NAME",
- /*  12 */ "statement_names ::= NAME DOT statement_names",
- /*  13 */ "statement_args ::= STRING",
- /*  14 */ "statement_args ::= statement_names",
- /*  15 */ "statement_args ::= STRING COMMA statement_args",
- /*  16 */ "statement_args ::= statement_names COMMA statement_args",
+ /*   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 */ "statement_names ::= NAME",
+ /*   6 */ "statement_names ::= NAME DOT statement_names",
+ /*   7 */ "statement_args_maybe ::=",
+ /*   8 */ "statement_args_maybe ::= statement_args",
+ /*   9 */ "statement_args ::= STRING",
+ /*  10 */ "statement_args ::= statement_names",
+ /*  11 */ "statement_args ::= STRING COMMA statement_args",
+ /*  12 */ "statement_args ::= statement_names COMMA statement_args",
+ /*  13 */ "name_maybe ::=",
+ /*  14 */ "name_maybe ::= NAME",
 };
 };
 #endif /* NDEBUG */
 #endif /* NDEBUG */
 
 
@@ -404,35 +398,43 @@ static void yy_destructor(
 {
 {
 #line 43 "NCDConfigParser_parse.y"
 #line 43 "NCDConfigParser_parse.y"
  free((yypminor->yy0)); 
  free((yypminor->yy0)); 
-#line 408 "NCDConfigParser_parse.c"
+#line 402 "NCDConfigParser_parse.c"
 }
 }
       break;
       break;
     case 12: /* interfaces */
     case 12: /* interfaces */
 {
 {
-#line 50 "NCDConfigParser_parse.y"
- NCDConfig_free_interfaces((yypminor->yy32)); 
-#line 415 "NCDConfigParser_parse.c"
+#line 52 "NCDConfigParser_parse.y"
+ NCDConfig_free_interfaces((yypminor->yy20)); 
+#line 409 "NCDConfigParser_parse.c"
 }
 }
       break;
       break;
     case 13: /* statements */
     case 13: /* statements */
 {
 {
-#line 51 "NCDConfigParser_parse.y"
- NCDConfig_free_statements((yypminor->yy18)); 
-#line 422 "NCDConfigParser_parse.c"
+#line 53 "NCDConfigParser_parse.y"
+ NCDConfig_free_statements((yypminor->yy26)); 
+#line 416 "NCDConfigParser_parse.c"
 }
 }
       break;
       break;
     case 14: /* statement_names */
     case 14: /* statement_names */
 {
 {
-#line 52 "NCDConfigParser_parse.y"
- NCDConfig_free_strings((yypminor->yy10)); 
-#line 429 "NCDConfigParser_parse.c"
+#line 54 "NCDConfigParser_parse.y"
+ NCDConfig_free_strings((yypminor->yy30)); 
+#line 423 "NCDConfigParser_parse.c"
 }
 }
       break;
       break;
-    case 15: /* statement_args */
+    case 15: /* statement_args_maybe */
+    case 16: /* statement_args */
 {
 {
-#line 53 "NCDConfigParser_parse.y"
- NCDConfig_free_arguments((yypminor->yy34)); 
-#line 436 "NCDConfigParser_parse.c"
+#line 55 "NCDConfigParser_parse.y"
+ NCDConfig_free_arguments((yypminor->yy36)); 
+#line 431 "NCDConfigParser_parse.c"
+}
+      break;
+    case 17: /* name_maybe */
+{
+#line 57 "NCDConfigParser_parse.y"
+ free((yypminor->yy9)); 
+#line 438 "NCDConfigParser_parse.c"
 }
 }
       break;
       break;
     default:  break;   /* If no destructor action specified: do nothing */
     default:  break;   /* If no destructor action specified: do nothing */
@@ -605,12 +607,12 @@ static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){
    while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
    while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser);
    /* Here code is inserted which will execute if the parser
    /* Here code is inserted which will execute if the parser
    ** stack every overflows */
    ** stack every overflows */
-#line 62 "NCDConfigParser_parse.y"
+#line 66 "NCDConfigParser_parse.y"
 
 
     if (yypMinor) {
     if (yypMinor) {
         free(yypMinor->yy0);
         free(yypMinor->yy0);
     }
     }
-#line 614 "NCDConfigParser_parse.c"
+#line 616 "NCDConfigParser_parse.c"
    ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
    ParseARG_STORE; /* Suppress warning about unused %extra_argument var */
 }
 }
 
 
@@ -667,23 +669,21 @@ static const struct {
   YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
   YYCODETYPE lhs;         /* Symbol on the left-hand side of the rule */
   unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
   unsigned char nrhs;     /* Number of right-hand side symbols in the rule */
 } yyRuleInfo[] = {
 } yyRuleInfo[] = {
-  { 16, 1 },
+  { 18, 1 },
   { 12, 5 },
   { 12, 5 },
   { 12, 6 },
   { 12, 6 },
-  { 13, 4 },
-  { 13, 5 },
-  { 13, 5 },
-  { 13, 6 },
-  { 13, 5 },
-  { 13, 6 },
   { 13, 6 },
   { 13, 6 },
   { 13, 7 },
   { 13, 7 },
   { 14, 1 },
   { 14, 1 },
   { 14, 3 },
   { 14, 3 },
+  { 15, 0 },
   { 15, 1 },
   { 15, 1 },
-  { 15, 1 },
-  { 15, 3 },
-  { 15, 3 },
+  { 16, 1 },
+  { 16, 1 },
+  { 16, 3 },
+  { 16, 3 },
+  { 17, 0 },
+  { 17, 1 },
 };
 };
 
 
 static void yy_accept(yyParser*);  /* Forward Declaration */
 static void yy_accept(yyParser*);  /* Forward Declaration */
@@ -739,21 +739,21 @@ static void yy_reduce(
   **     break;
   **     break;
   */
   */
       case 0: /* input ::= interfaces */
       case 0: /* input ::= interfaces */
-#line 68 "NCDConfigParser_parse.y"
+#line 72 "NCDConfigParser_parse.y"
 {
 {
-    parser_out->ast = yymsp[0].minor.yy32;
+    parser_out->ast = yymsp[0].minor.yy20;
 
 
-    if (!yymsp[0].minor.yy32) {
+    if (!yymsp[0].minor.yy20) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 #line 751 "NCDConfigParser_parse.c"
 #line 751 "NCDConfigParser_parse.c"
         break;
         break;
       case 1: /* interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE */
       case 1: /* interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE */
-#line 76 "NCDConfigParser_parse.y"
+#line 80 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy32 = NCDConfig_make_interfaces(yymsp[-3].minor.yy0, yymsp[-1].minor.yy18, 0, NULL);
-    if (!yygotominor.yy32) {
+    yygotominor.yy20 = NCDConfig_make_interfaces(yymsp[-3].minor.yy0, yymsp[-1].minor.yy26, 0, NULL);
+    if (!yygotominor.yy20) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
   yy_destructor(yypParser,1,&yymsp[-4].minor);
   yy_destructor(yypParser,1,&yymsp[-4].minor);
@@ -763,10 +763,10 @@ static void yy_reduce(
 #line 764 "NCDConfigParser_parse.c"
 #line 764 "NCDConfigParser_parse.c"
         break;
         break;
       case 2: /* interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces */
       case 2: /* interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces */
-#line 83 "NCDConfigParser_parse.y"
+#line 87 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy32 = NCDConfig_make_interfaces(yymsp[-4].minor.yy0, yymsp[-2].minor.yy18, 1, yymsp[0].minor.yy32);
-    if (!yygotominor.yy32) {
+    yygotominor.yy20 = NCDConfig_make_interfaces(yymsp[-4].minor.yy0, yymsp[-2].minor.yy26, 1, yymsp[0].minor.yy20);
+    if (!yygotominor.yy20) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
   yy_destructor(yypParser,1,&yymsp[-5].minor);
   yy_destructor(yypParser,1,&yymsp[-5].minor);
@@ -775,172 +775,122 @@ static void yy_reduce(
 }
 }
 #line 777 "NCDConfigParser_parse.c"
 #line 777 "NCDConfigParser_parse.c"
         break;
         break;
-      case 3: /* statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON */
-#line 90 "NCDConfigParser_parse.y"
+      case 3: /* statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */
+#line 94 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-3].minor.yy10, NULL, NULL, NULL);
-    if (!yygotominor.yy18) {
+    yygotominor.yy26 = NCDConfig_make_statements(yymsp[-5].minor.yy30, yymsp[-3].minor.yy36, yymsp[-1].minor.yy9, NULL);
+    if (!yygotominor.yy26) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
-  yy_destructor(yypParser,5,&yymsp[-2].minor);
-  yy_destructor(yypParser,6,&yymsp[-1].minor);
+  yy_destructor(yypParser,5,&yymsp[-4].minor);
+  yy_destructor(yypParser,6,&yymsp[-2].minor);
   yy_destructor(yypParser,7,&yymsp[0].minor);
   yy_destructor(yypParser,7,&yymsp[0].minor);
 }
 }
 #line 790 "NCDConfigParser_parse.c"
 #line 790 "NCDConfigParser_parse.c"
         break;
         break;
-      case 4: /* statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON */
-#line 97 "NCDConfigParser_parse.y"
+      case 4: /* statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements */
+#line 101 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-4].minor.yy10, yymsp[-2].minor.yy34, NULL, NULL);
-    if (!yygotominor.yy18) {
+    yygotominor.yy26 = NCDConfig_make_statements(yymsp[-6].minor.yy30, yymsp[-4].minor.yy36, yymsp[-2].minor.yy9, yymsp[0].minor.yy26);
+    if (!yygotominor.yy26) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
-  yy_destructor(yypParser,5,&yymsp[-3].minor);
-  yy_destructor(yypParser,6,&yymsp[-1].minor);
-  yy_destructor(yypParser,7,&yymsp[0].minor);
-}
-#line 803 "NCDConfigParser_parse.c"
-        break;
-      case 5: /* statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements */
-#line 104 "NCDConfigParser_parse.y"
-{
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-4].minor.yy10, NULL, NULL, yymsp[0].minor.yy18);
-    if (!yygotominor.yy18) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,5,&yymsp[-3].minor);
-  yy_destructor(yypParser,6,&yymsp[-2].minor);
-  yy_destructor(yypParser,7,&yymsp[-1].minor);
-}
-#line 816 "NCDConfigParser_parse.c"
-        break;
-      case 6: /* statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements */
-#line 111 "NCDConfigParser_parse.y"
-{
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-5].minor.yy10, yymsp[-3].minor.yy34, NULL, yymsp[0].minor.yy18);
-    if (!yygotominor.yy18) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,5,&yymsp[-4].minor);
-  yy_destructor(yypParser,6,&yymsp[-2].minor);
+  yy_destructor(yypParser,5,&yymsp[-5].minor);
+  yy_destructor(yypParser,6,&yymsp[-3].minor);
   yy_destructor(yypParser,7,&yymsp[-1].minor);
   yy_destructor(yypParser,7,&yymsp[-1].minor);
 }
 }
-#line 829 "NCDConfigParser_parse.c"
+#line 803 "NCDConfigParser_parse.c"
         break;
         break;
-      case 7: /* statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON */
-#line 118 "NCDConfigParser_parse.y"
+      case 5: /* statement_names ::= NAME */
+#line 108 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-4].minor.yy10, NULL, yymsp[-1].minor.yy0, NULL);
-    if (!yygotominor.yy18) {
+    yygotominor.yy30 = NCDConfig_make_strings(yymsp[0].minor.yy0, 0, NULL);
+    if (!yygotominor.yy30) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
-  yy_destructor(yypParser,5,&yymsp[-3].minor);
-  yy_destructor(yypParser,6,&yymsp[-2].minor);
-  yy_destructor(yypParser,7,&yymsp[0].minor);
 }
 }
-#line 842 "NCDConfigParser_parse.c"
+#line 813 "NCDConfigParser_parse.c"
         break;
         break;
-      case 8: /* statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON */
-#line 125 "NCDConfigParser_parse.y"
+      case 6: /* statement_names ::= NAME DOT statement_names */
+#line 115 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-5].minor.yy10, yymsp[-3].minor.yy34, yymsp[-1].minor.yy0, NULL);
-    if (!yygotominor.yy18) {
+    yygotominor.yy30 = NCDConfig_make_strings(yymsp[-2].minor.yy0, 1, yymsp[0].minor.yy30);
+    if (!yygotominor.yy30) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
-  yy_destructor(yypParser,5,&yymsp[-4].minor);
-  yy_destructor(yypParser,6,&yymsp[-2].minor);
-  yy_destructor(yypParser,7,&yymsp[0].minor);
+  yy_destructor(yypParser,8,&yymsp[-1].minor);
 }
 }
-#line 855 "NCDConfigParser_parse.c"
+#line 824 "NCDConfigParser_parse.c"
         break;
         break;
-      case 9: /* statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements */
-#line 132 "NCDConfigParser_parse.y"
+      case 7: /* statement_args_maybe ::= */
+#line 122 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-5].minor.yy10, NULL, yymsp[-2].minor.yy0, yymsp[0].minor.yy18);
-    if (!yygotominor.yy18) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,5,&yymsp[-4].minor);
-  yy_destructor(yypParser,6,&yymsp[-3].minor);
-  yy_destructor(yypParser,7,&yymsp[-1].minor);
+    yygotominor.yy36 = NULL;
 }
 }
-#line 868 "NCDConfigParser_parse.c"
+#line 831 "NCDConfigParser_parse.c"
         break;
         break;
-      case 10: /* statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements */
-#line 139 "NCDConfigParser_parse.y"
+      case 8: /* statement_args_maybe ::= statement_args */
+#line 126 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy18 = NCDConfig_make_statements(yymsp[-6].minor.yy10, yymsp[-4].minor.yy34, yymsp[-2].minor.yy0, yymsp[0].minor.yy18);
-    if (!yygotominor.yy18) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,5,&yymsp[-5].minor);
-  yy_destructor(yypParser,6,&yymsp[-3].minor);
-  yy_destructor(yypParser,7,&yymsp[-1].minor);
+    yygotominor.yy36 = yymsp[0].minor.yy36;
 }
 }
-#line 881 "NCDConfigParser_parse.c"
+#line 838 "NCDConfigParser_parse.c"
         break;
         break;
-      case 11: /* statement_names ::= NAME */
-#line 146 "NCDConfigParser_parse.y"
+      case 9: /* statement_args ::= STRING */
+#line 130 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy10 = NCDConfig_make_strings(yymsp[0].minor.yy0, 0, NULL);
-    if (!yygotominor.yy10) {
+    yygotominor.yy36 = NCDConfig_make_arguments_string(yymsp[0].minor.yy0, NULL);
+    if (!yygotominor.yy36) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
-#line 891 "NCDConfigParser_parse.c"
+#line 848 "NCDConfigParser_parse.c"
         break;
         break;
-      case 12: /* statement_names ::= NAME DOT statement_names */
-#line 153 "NCDConfigParser_parse.y"
+      case 10: /* statement_args ::= statement_names */
+#line 137 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy10 = NCDConfig_make_strings(yymsp[-2].minor.yy0, 1, yymsp[0].minor.yy10);
-    if (!yygotominor.yy10) {
+    yygotominor.yy36 = NCDConfig_make_arguments_var(yymsp[0].minor.yy30, NULL);
+    if (!yygotominor.yy36) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
-  yy_destructor(yypParser,8,&yymsp[-1].minor);
 }
 }
-#line 902 "NCDConfigParser_parse.c"
+#line 858 "NCDConfigParser_parse.c"
         break;
         break;
-      case 13: /* statement_args ::= STRING */
-#line 160 "NCDConfigParser_parse.y"
+      case 11: /* statement_args ::= STRING COMMA statement_args */
+#line 144 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy34 = NCDConfig_make_arguments_string(yymsp[0].minor.yy0, 0, NULL);
-    if (!yygotominor.yy34) {
+    yygotominor.yy36 = NCDConfig_make_arguments_string(yymsp[-2].minor.yy0, yymsp[0].minor.yy36);
+    if (!yygotominor.yy36) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
+  yy_destructor(yypParser,10,&yymsp[-1].minor);
 }
 }
-#line 912 "NCDConfigParser_parse.c"
+#line 869 "NCDConfigParser_parse.c"
         break;
         break;
-      case 14: /* statement_args ::= statement_names */
-#line 167 "NCDConfigParser_parse.y"
+      case 12: /* statement_args ::= statement_names COMMA statement_args */
+#line 151 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy34 = NCDConfig_make_arguments_var(yymsp[0].minor.yy10, 0, NULL);
-    if (!yygotominor.yy34) {
+    yygotominor.yy36 = NCDConfig_make_arguments_var(yymsp[-2].minor.yy30, yymsp[0].minor.yy36);
+    if (!yygotominor.yy36) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
+  yy_destructor(yypParser,10,&yymsp[-1].minor);
 }
 }
-#line 922 "NCDConfigParser_parse.c"
+#line 880 "NCDConfigParser_parse.c"
         break;
         break;
-      case 15: /* statement_args ::= STRING COMMA statement_args */
-#line 174 "NCDConfigParser_parse.y"
+      case 13: /* name_maybe ::= */
+#line 158 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy34 = NCDConfig_make_arguments_string(yymsp[-2].minor.yy0, 1, yymsp[0].minor.yy34);
-    if (!yygotominor.yy34) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,10,&yymsp[-1].minor);
+    yygotominor.yy9 = NULL;
 }
 }
-#line 933 "NCDConfigParser_parse.c"
+#line 887 "NCDConfigParser_parse.c"
         break;
         break;
-      case 16: /* statement_args ::= statement_names COMMA statement_args */
-#line 181 "NCDConfigParser_parse.y"
+      case 14: /* name_maybe ::= NAME */
+#line 162 "NCDConfigParser_parse.y"
 {
 {
-    yygotominor.yy34 = NCDConfig_make_arguments_var(yymsp[-2].minor.yy10, 1, yymsp[0].minor.yy34);
-    if (!yygotominor.yy34) {
-        parser_out->out_of_memory = 1;
-    }
-  yy_destructor(yypParser,10,&yymsp[-1].minor);
+    yygotominor.yy9 = yymsp[0].minor.yy0;
 }
 }
-#line 944 "NCDConfigParser_parse.c"
+#line 894 "NCDConfigParser_parse.c"
         break;
         break;
       default:
       default:
         break;
         break;
@@ -1002,10 +952,10 @@ static void yy_syntax_error(
 ){
 ){
   ParseARG_FETCH;
   ParseARG_FETCH;
 #define TOKEN (yyminor.yy0)
 #define TOKEN (yyminor.yy0)
-#line 57 "NCDConfigParser_parse.y"
+#line 61 "NCDConfigParser_parse.y"
 
 
     parser_out->syntax_error = 1;
     parser_out->syntax_error = 1;
-#line 1009 "NCDConfigParser_parse.c"
+#line 959 "NCDConfigParser_parse.c"
   ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
   ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */
 }
 }
 
 

+ 98 - 195
generated/NCDConfigParser_parse.out

@@ -3,31 +3,28 @@ State 0:
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces
 
 
-                       PROCESS shift  14
-                    interfaces shift  13
+                       PROCESS shift  10
+                    interfaces shift  9
                          input accept
                          input accept
 
 
 State 1:
 State 1:
-          statements ::= statement_names ROUND_OPEN * ROUND_CLOSE SEMICOLON
-          statements ::= statement_names ROUND_OPEN * statement_args ROUND_CLOSE SEMICOLON
-          statements ::= statement_names ROUND_OPEN * ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN * statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN * ROUND_CLOSE NAME SEMICOLON
-          statements ::= statement_names ROUND_OPEN * statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= statement_names ROUND_OPEN * ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN * statement_args ROUND_CLOSE NAME SEMICOLON statements
+          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_names ::= * NAME
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
           statement_names ::= * NAME DOT statement_names
+      (7) statement_args_maybe ::= *
+          statement_args_maybe ::= * statement_args
           statement_args ::= * STRING
           statement_args ::= * STRING
           statement_args ::= * statement_names
           statement_args ::= * statement_names
           statement_args ::= * STRING COMMA statement_args
           statement_args ::= * STRING COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
 
 
-                          NAME shift  18
-                   ROUND_CLOSE shift  11
-                        STRING shift  22
-               statement_names shift  23
-                statement_args shift  20
+                          NAME shift  16
+                        STRING shift  17
+               statement_names shift  18
+          statement_args_maybe shift  14
+                statement_args shift  23
+                     {default} reduce 7
 
 
 State 2:
 State 2:
           statement_names ::= * NAME
           statement_names ::= * NAME
@@ -38,10 +35,10 @@ State 2:
           statement_args ::= STRING COMMA * statement_args
           statement_args ::= STRING COMMA * statement_args
           statement_args ::= * statement_names COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
 
 
-                          NAME shift  18
-                        STRING shift  22
-               statement_names shift  23
-                statement_args shift  31
+                          NAME shift  16
+                        STRING shift  17
+               statement_names shift  18
+                statement_args shift  25
 
 
 State 3:
 State 3:
           statement_names ::= * NAME
           statement_names ::= * NAME
@@ -52,256 +49,160 @@ State 3:
           statement_args ::= * statement_names COMMA statement_args
           statement_args ::= * statement_names COMMA statement_args
           statement_args ::= statement_names COMMA * statement_args
           statement_args ::= statement_names COMMA * statement_args
 
 
-                          NAME shift  18
-                        STRING shift  22
-               statement_names shift  23
-                statement_args shift  30
+                          NAME shift  16
+                        STRING shift  17
+               statement_names shift  18
+                statement_args shift  24
 
 
 State 4:
 State 4:
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE interfaces
           interfaces ::= PROCESS NAME CURLY_OPEN * statements CURLY_CLOSE interfaces
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
+          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_names ::= * NAME
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
           statement_names ::= * NAME DOT statement_names
 
 
-                          NAME shift  18
-                    statements shift  16
-               statement_names shift  17
+                          NAME shift  16
+                    statements shift  12
+               statement_names shift  13
 
 
 State 5:
 State 5:
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON
-      (3) statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON *
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON * statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
+          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
           statement_names ::= * NAME
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
           statement_names ::= * NAME DOT statement_names
 
 
-                          NAME shift  18
-                    statements shift  25
-               statement_names shift  17
+                          NAME shift  16
+                    statements shift  20
+               statement_names shift  13
                      {default} reduce 3
                      {default} reduce 3
 
 
 State 6:
 State 6:
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-      (7) statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON *
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON * statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
-          statement_names ::= * NAME
-          statement_names ::= * NAME DOT statement_names
-
-                          NAME shift  18
-                    statements shift  27
-               statement_names shift  17
-                     {default} reduce 7
-
-State 7:
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-      (4) statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON *
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON * statements
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
-          statement_names ::= * NAME
-          statement_names ::= * NAME DOT statement_names
-
-                          NAME shift  18
-                    statements shift  28
-               statement_names shift  17
-                     {default} reduce 4
-
-State 8:
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-      (8) statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON *
-          statements ::= * statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= * statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON * statements
-          statement_names ::= * NAME
-          statement_names ::= * NAME DOT statement_names
-
-                          NAME shift  18
-                    statements shift  29
-               statement_names shift  17
-                     {default} reduce 8
-
-State 9:
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE
       (1) interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE *
       (1) interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE *
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces
           interfaces ::= * PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces
           interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE * interfaces
           interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE * interfaces
 
 
-                       PROCESS shift  14
-                    interfaces shift  24
+                       PROCESS shift  10
+                    interfaces shift  19
                      {default} reduce 1
                      {default} reduce 1
 
 
-State 10:
+State 7:
+          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
+     (13) name_maybe ::= *
+          name_maybe ::= * NAME
+
+                          NAME shift  22
+                    name_maybe shift  15
+                     {default} reduce 13
+
+State 8:
           statement_names ::= * NAME
           statement_names ::= * NAME
           statement_names ::= * NAME DOT statement_names
           statement_names ::= * NAME DOT statement_names
           statement_names ::= NAME DOT * statement_names
           statement_names ::= NAME DOT * statement_names
 
 
-                          NAME shift  18
-               statement_names shift  26
+                          NAME shift  16
+               statement_names shift  21
 
 
-State 11:
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE * SEMICOLON
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE * SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE * NAME SEMICOLON
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE * NAME SEMICOLON statements
-
-                          NAME shift  19
-                     SEMICOLON shift  5
-
-State 12:
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE * SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE * SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE * NAME SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE * NAME SEMICOLON statements
-
-                          NAME shift  21
-                     SEMICOLON shift  7
-
-State 13:
+State 9:
       (0) input ::= interfaces *
       (0) input ::= interfaces *
 
 
                              $ reduce 0
                              $ reduce 0
 
 
-State 14:
+State 10:
           interfaces ::= PROCESS * NAME CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= PROCESS * NAME CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= PROCESS * NAME CURLY_OPEN statements CURLY_CLOSE interfaces
           interfaces ::= PROCESS * NAME CURLY_OPEN statements CURLY_CLOSE interfaces
 
 
-                          NAME shift  15
+                          NAME shift  11
 
 
-State 15:
+State 11:
           interfaces ::= PROCESS NAME * CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= PROCESS NAME * CURLY_OPEN statements CURLY_CLOSE
           interfaces ::= PROCESS NAME * CURLY_OPEN statements CURLY_CLOSE interfaces
           interfaces ::= PROCESS NAME * CURLY_OPEN statements CURLY_CLOSE interfaces
 
 
                     CURLY_OPEN shift  4
                     CURLY_OPEN shift  4
 
 
-State 16:
+State 12:
           interfaces ::= PROCESS NAME CURLY_OPEN statements * CURLY_CLOSE
           interfaces ::= PROCESS NAME CURLY_OPEN statements * CURLY_CLOSE
           interfaces ::= PROCESS NAME CURLY_OPEN statements * CURLY_CLOSE interfaces
           interfaces ::= PROCESS NAME CURLY_OPEN statements * CURLY_CLOSE interfaces
 
 
-                   CURLY_CLOSE shift  9
+                   CURLY_CLOSE shift  6
 
 
-State 17:
-          statements ::= statement_names * ROUND_OPEN ROUND_CLOSE SEMICOLON
-          statements ::= statement_names * ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON
-          statements ::= statement_names * ROUND_OPEN ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names * ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names * ROUND_OPEN ROUND_CLOSE NAME SEMICOLON
-          statements ::= statement_names * ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON
-          statements ::= statement_names * ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements
-          statements ::= statement_names * ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements
+State 13:
+          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
 
 
                     ROUND_OPEN shift  1
                     ROUND_OPEN shift  1
 
 
-State 18:
-     (11) statement_names ::= NAME *
-          statement_names ::= NAME * DOT statement_names
-
-                           DOT shift  10
-                     {default} reduce 11
-
-State 19:
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME * SEMICOLON
-          statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME * SEMICOLON statements
+State 14:
+          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
 
 
-                     SEMICOLON shift  6
+                   ROUND_CLOSE shift  7
 
 
-State 20:
-          statements ::= statement_names ROUND_OPEN statement_args * ROUND_CLOSE SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args * ROUND_CLOSE SEMICOLON statements
-          statements ::= statement_names ROUND_OPEN statement_args * ROUND_CLOSE NAME SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args * ROUND_CLOSE NAME SEMICOLON statements
+State 15:
+          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
 
 
-                   ROUND_CLOSE shift  12
+                     SEMICOLON shift  5
 
 
-State 21:
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME * SEMICOLON
-          statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME * SEMICOLON statements
+State 16:
+      (5) statement_names ::= NAME *
+          statement_names ::= NAME * DOT statement_names
 
 
-                     SEMICOLON shift  8
+                           DOT shift  8
+                     {default} reduce 5
 
 
-State 22:
-     (13) statement_args ::= STRING *
+State 17:
+      (9) statement_args ::= STRING *
           statement_args ::= STRING * COMMA statement_args
           statement_args ::= STRING * COMMA statement_args
 
 
                          COMMA shift  2
                          COMMA shift  2
-                     {default} reduce 13
+                     {default} reduce 9
 
 
-State 23:
-     (14) statement_args ::= statement_names *
+State 18:
+     (10) statement_args ::= statement_names *
           statement_args ::= statement_names * COMMA statement_args
           statement_args ::= statement_names * COMMA statement_args
 
 
                          COMMA shift  3
                          COMMA shift  3
-                     {default} reduce 14
+                     {default} reduce 10
 
 
-State 24:
+State 19:
       (2) interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces *
       (2) interfaces ::= PROCESS NAME CURLY_OPEN statements CURLY_CLOSE interfaces *
 
 
                      {default} reduce 2
                      {default} reduce 2
 
 
-State 25:
-      (5) statements ::= statement_names ROUND_OPEN ROUND_CLOSE SEMICOLON statements *
-
-                     {default} reduce 5
-
-State 26:
-     (12) statement_names ::= NAME DOT statement_names *
+State 20:
+      (4) statements ::= statement_names ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statements *
 
 
-                     {default} reduce 12
+                     {default} reduce 4
 
 
-State 27:
-      (9) statements ::= statement_names ROUND_OPEN ROUND_CLOSE NAME SEMICOLON statements *
+State 21:
+      (6) statement_names ::= NAME DOT statement_names *
 
 
-                     {default} reduce 9
+                     {default} reduce 6
 
 
-State 28:
-      (6) statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE SEMICOLON statements *
+State 22:
+     (14) name_maybe ::= NAME *
 
 
-                     {default} reduce 6
+                     {default} reduce 14
 
 
-State 29:
-     (10) statements ::= statement_names ROUND_OPEN statement_args ROUND_CLOSE NAME SEMICOLON statements *
+State 23:
+      (8) statement_args_maybe ::= statement_args *
 
 
-                     {default} reduce 10
+                     {default} reduce 8
 
 
-State 30:
-     (16) statement_args ::= statement_names COMMA statement_args *
+State 24:
+     (12) statement_args ::= statement_names COMMA statement_args *
 
 
-                     {default} reduce 16
+                     {default} reduce 12
 
 
-State 31:
-     (15) statement_args ::= STRING COMMA statement_args *
+State 25:
+     (11) statement_args ::= STRING COMMA statement_args *
 
 
-                     {default} reduce 15
+                     {default} reduce 11
 
 
 ----------------------------------------------------
 ----------------------------------------------------
 Symbols:
 Symbols:
@@ -320,5 +221,7 @@ Symbols:
    12: interfaces: PROCESS
    12: interfaces: PROCESS
    13: statements: NAME
    13: statements: NAME
    14: statement_names: NAME
    14: statement_names: NAME
-   15: statement_args: NAME STRING
-   16: input: PROCESS
+   15: statement_args_maybe: <lambda> NAME STRING
+   16: statement_args: NAME STRING
+   17: name_maybe: <lambda> NAME
+   18: input: PROCESS

+ 26 - 48
generated/NCDConfigParser_parse.y

@@ -45,12 +45,16 @@ struct parser_out {
 %type interfaces {struct NCDConfig_interfaces *}
 %type interfaces {struct NCDConfig_interfaces *}
 %type statements {struct NCDConfig_statements *}
 %type statements {struct NCDConfig_statements *}
 %type statement_names {struct NCDConfig_strings *}
 %type statement_names {struct NCDConfig_strings *}
+%type statement_args_maybe {struct NCDConfig_arguments *}
 %type statement_args {struct NCDConfig_arguments *}
 %type statement_args {struct NCDConfig_arguments *}
+%type name_maybe {char *}
 
 
 %destructor interfaces { NCDConfig_free_interfaces($$); }
 %destructor interfaces { NCDConfig_free_interfaces($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
+%destructor statement_args_maybe { NCDConfig_free_arguments($$); }
 %destructor statement_args { NCDConfig_free_arguments($$); }
 %destructor statement_args { NCDConfig_free_arguments($$); }
+%destructor name_maybe { free($$); }
 
 
 %stack_size 0
 %stack_size 0
 
 
@@ -87,56 +91,14 @@ interfaces(R) ::= PROCESS NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE interface
     }
     }
 }
 }
 
 
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE SEMICOLON. {
-    R = NCDConfig_make_statements(A, NULL, NULL, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE SEMICOLON. {
-    R = NCDConfig_make_statements(A, B, NULL, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, NULL, NULL, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, B, NULL, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE NAME(C) SEMICOLON. {
-    R = NCDConfig_make_statements(A, NULL, C, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE NAME(C) SEMICOLON. {
+statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(A, B, C, NULL);
     R = NCDConfig_make_statements(A, B, C, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE NAME(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, NULL, C, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE NAME(C) SEMICOLON statements(N). {
+statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
     R = NCDConfig_make_statements(A, B, C, N);
     R = NCDConfig_make_statements(A, B, C, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
@@ -157,30 +119,46 @@ statement_names(R) ::= NAME(A) DOT statement_names(N). {
     }
     }
 }
 }
 
 
+statement_args_maybe(R) ::= . {
+    R = NULL;
+}
+
+statement_args_maybe(R) ::= statement_args(A). {
+    R = A;
+}
+
 statement_args(R) ::= STRING(A). {
 statement_args(R) ::= STRING(A). {
-    R = NCDConfig_make_arguments_string(A, 0, NULL);
+    R = NCDConfig_make_arguments_string(A, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= statement_names(A). {
 statement_args(R) ::= statement_names(A). {
-    R = NCDConfig_make_arguments_var(A, 0, NULL);
+    R = NCDConfig_make_arguments_var(A, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= STRING(A) COMMA statement_args(N). {
 statement_args(R) ::= STRING(A) COMMA statement_args(N). {
-    R = NCDConfig_make_arguments_string(A, 1, N);
+    R = NCDConfig_make_arguments_string(A, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= statement_names(A) COMMA statement_args(N). {
 statement_args(R) ::= statement_names(A) COMMA statement_args(N). {
-    R = NCDConfig_make_arguments_var(A, 1, N);
+    R = NCDConfig_make_arguments_var(A, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
+
+name_maybe(R) ::= . {
+    R = NULL;
+}
+
+name_maybe(R) ::= NAME(A). {
+    R = A;
+}

+ 2 - 10
ncdconfig/NCDConfig.c

@@ -135,12 +135,8 @@ fail:
     return NULL;
     return NULL;
 }
 }
 
 
-struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, int need_next, struct NCDConfig_arguments *next)
+struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, struct NCDConfig_arguments *next)
 {
 {
-    if (!str || (need_next && !next)) {
-        goto fail;
-    }
-    
     struct NCDConfig_arguments *v = malloc(sizeof(*v));
     struct NCDConfig_arguments *v = malloc(sizeof(*v));
     if (!v) {
     if (!v) {
         goto fail;
         goto fail;
@@ -158,12 +154,8 @@ fail:
     return NULL;
     return NULL;
 }
 }
 
 
-struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, int need_next, struct NCDConfig_arguments *next)
+struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, struct NCDConfig_arguments *next)
 {
 {
-    if (!var || (need_next && !next)) {
-        goto fail;
-    }
-    
     struct NCDConfig_arguments *v = malloc(sizeof(*v));
     struct NCDConfig_arguments *v = malloc(sizeof(*v));
     if (!v) {
     if (!v) {
         goto fail;
         goto fail;

+ 2 - 2
ncdconfig/NCDConfig.h

@@ -64,8 +64,8 @@ void NCDConfig_free_arguments (struct NCDConfig_arguments *v);
 void NCDConfig_free_strings (struct NCDConfig_strings *v);
 void NCDConfig_free_strings (struct NCDConfig_strings *v);
 struct NCDConfig_interfaces * NCDConfig_make_interfaces (char *name, struct NCDConfig_statements *statements, int have_next, struct NCDConfig_interfaces *next);
 struct NCDConfig_interfaces * NCDConfig_make_interfaces (char *name, struct NCDConfig_statements *statements, int have_next, struct NCDConfig_interfaces *next);
 struct NCDConfig_statements * NCDConfig_make_statements (struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next);
 struct NCDConfig_statements * NCDConfig_make_statements (struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next);
-struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, int have_next, struct NCDConfig_arguments *next);
-struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, int have_next, struct NCDConfig_arguments *next);
+struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, struct NCDConfig_arguments *next);
+struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, struct NCDConfig_arguments *next);
 struct NCDConfig_strings * NCDConfig_make_strings (char *value, int have_next, struct NCDConfig_strings *next);
 struct NCDConfig_strings * NCDConfig_make_strings (char *value, int have_next, struct NCDConfig_strings *next);
 
 
 int NCDConfig_statement_name_is (struct NCDConfig_statements *st, const char *needle);
 int NCDConfig_statement_name_is (struct NCDConfig_statements *st, const char *needle);

+ 8 - 4
ncdconfig/NCDConfigParser.c

@@ -90,17 +90,21 @@ static int tokenizer_output (void *user, int token, char *value, size_t position
         
         
         case NCD_TOKEN_NAME: {
         case NCD_TOKEN_NAME: {
             char *v = malloc(strlen(value) + 1);
             char *v = malloc(strlen(value) + 1);
-            if (v) {
-                strcpy(v, value);
+            if (!v) {
+                state->out.out_of_memory = 1;
+                break;
             }
             }
+            strcpy(v, value);
             Parse(state->parser, NAME, v, &state->out);
             Parse(state->parser, NAME, v, &state->out);
         } break;
         } break;
         
         
         case NCD_TOKEN_STRING: {
         case NCD_TOKEN_STRING: {
             char *v = malloc(strlen(value) + 1);
             char *v = malloc(strlen(value) + 1);
-            if (v) {
-                strcpy(v, value);
+            if (!v) {
+                state->out.out_of_memory = 1;
+                break;
             }
             }
+            strcpy(v, value);
             Parse(state->parser, STRING, v, &state->out);
             Parse(state->parser, STRING, v, &state->out);
         } break;
         } break;
         
         

+ 26 - 48
ncdconfig/NCDConfigParser_parse.y

@@ -45,12 +45,16 @@ struct parser_out {
 %type interfaces {struct NCDConfig_interfaces *}
 %type interfaces {struct NCDConfig_interfaces *}
 %type statements {struct NCDConfig_statements *}
 %type statements {struct NCDConfig_statements *}
 %type statement_names {struct NCDConfig_strings *}
 %type statement_names {struct NCDConfig_strings *}
+%type statement_args_maybe {struct NCDConfig_arguments *}
 %type statement_args {struct NCDConfig_arguments *}
 %type statement_args {struct NCDConfig_arguments *}
+%type name_maybe {char *}
 
 
 %destructor interfaces { NCDConfig_free_interfaces($$); }
 %destructor interfaces { NCDConfig_free_interfaces($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statements { NCDConfig_free_statements($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
 %destructor statement_names { NCDConfig_free_strings($$); }
+%destructor statement_args_maybe { NCDConfig_free_arguments($$); }
 %destructor statement_args { NCDConfig_free_arguments($$); }
 %destructor statement_args { NCDConfig_free_arguments($$); }
+%destructor name_maybe { free($$); }
 
 
 %stack_size 0
 %stack_size 0
 
 
@@ -87,56 +91,14 @@ interfaces(R) ::= PROCESS NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE interface
     }
     }
 }
 }
 
 
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE SEMICOLON. {
-    R = NCDConfig_make_statements(A, NULL, NULL, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE SEMICOLON. {
-    R = NCDConfig_make_statements(A, B, NULL, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, NULL, NULL, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, B, NULL, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE NAME(C) SEMICOLON. {
-    R = NCDConfig_make_statements(A, NULL, C, NULL);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE NAME(C) SEMICOLON. {
+statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON. {
     R = NCDConfig_make_statements(A, B, C, NULL);
     R = NCDConfig_make_statements(A, B, C, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
-statements(R) ::= statement_names(A) ROUND_OPEN ROUND_CLOSE NAME(C) SEMICOLON statements(N). {
-    R = NCDConfig_make_statements(A, NULL, C, N);
-    if (!R) {
-        parser_out->out_of_memory = 1;
-    }
-}
-
-statements(R) ::= statement_names(A) ROUND_OPEN statement_args(B) ROUND_CLOSE NAME(C) SEMICOLON statements(N). {
+statements(R) ::= statement_names(A) ROUND_OPEN statement_args_maybe(B) ROUND_CLOSE name_maybe(C) SEMICOLON statements(N). {
     R = NCDConfig_make_statements(A, B, C, N);
     R = NCDConfig_make_statements(A, B, C, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
@@ -157,30 +119,46 @@ statement_names(R) ::= NAME(A) DOT statement_names(N). {
     }
     }
 }
 }
 
 
+statement_args_maybe(R) ::= . {
+    R = NULL;
+}
+
+statement_args_maybe(R) ::= statement_args(A). {
+    R = A;
+}
+
 statement_args(R) ::= STRING(A). {
 statement_args(R) ::= STRING(A). {
-    R = NCDConfig_make_arguments_string(A, 0, NULL);
+    R = NCDConfig_make_arguments_string(A, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= statement_names(A). {
 statement_args(R) ::= statement_names(A). {
-    R = NCDConfig_make_arguments_var(A, 0, NULL);
+    R = NCDConfig_make_arguments_var(A, NULL);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= STRING(A) COMMA statement_args(N). {
 statement_args(R) ::= STRING(A) COMMA statement_args(N). {
-    R = NCDConfig_make_arguments_string(A, 1, N);
+    R = NCDConfig_make_arguments_string(A, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
 
 
 statement_args(R) ::= statement_names(A) COMMA statement_args(N). {
 statement_args(R) ::= statement_names(A) COMMA statement_args(N). {
-    R = NCDConfig_make_arguments_var(A, 1, N);
+    R = NCDConfig_make_arguments_var(A, N);
     if (!R) {
     if (!R) {
         parser_out->out_of_memory = 1;
         parser_out->out_of_memory = 1;
     }
     }
 }
 }
+
+name_maybe(R) ::= . {
+    R = NULL;
+}
+
+name_maybe(R) ::= NAME(A). {
+    R = A;
+}