Просмотр исходного кода

ncd: NCDConfigParser: add support for parsing include_guard directives

ambrop7 13 лет назад
Родитель
Сommit
73082b3932

Разница между файлами не показана из-за своего большого размера
+ 562 - 523
generated/NCDConfigParser_parse.c


+ 20 - 19
generated/NCDConfigParser_parse.h

@@ -1,21 +1,22 @@
 #define INCLUDE                         1
 #define STRING                          2
-#define NAME                            3
-#define CURLY_OPEN                      4
-#define CURLY_CLOSE                     5
-#define ROUND_OPEN                      6
-#define ROUND_CLOSE                     7
-#define SEMICOLON                       8
-#define ARROW                           9
-#define IF                             10
-#define FOREACH                        11
-#define AS                             12
-#define COLON                          13
-#define ELIF                           14
-#define ELSE                           15
-#define DOT                            16
-#define COMMA                          17
-#define BRACKET_OPEN                   18
-#define BRACKET_CLOSE                  19
-#define PROCESS                        20
-#define TEMPLATE                       21
+#define INCLUDE_GUARD                   3
+#define NAME                            4
+#define CURLY_OPEN                      5
+#define CURLY_CLOSE                     6
+#define ROUND_OPEN                      7
+#define ROUND_CLOSE                     8
+#define SEMICOLON                       9
+#define ARROW                          10
+#define IF                             11
+#define FOREACH                        12
+#define AS                             13
+#define COLON                          14
+#define ELIF                           15
+#define ELSE                           16
+#define DOT                            17
+#define COMMA                          18
+#define BRACKET_OPEN                   19
+#define BRACKET_CLOSE                  20
+#define PROCESS                        21
+#define TEMPLATE                       22

+ 371 - 337
generated/NCDConfigParser_parse.out

@@ -2,15 +2,17 @@ State 0:
           input ::= * processes
       (1) processes ::= *
           processes ::= * INCLUDE STRING processes
+          processes ::= * INCLUDE_GUARD STRING processes
           processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes
           process_or_template ::= * PROCESS
           process_or_template ::= * TEMPLATE
 
-                       INCLUDE shift  33
-                       PROCESS shift  72
-                      TEMPLATE shift  73
-                     processes shift  32
-           process_or_template shift  34
+                       INCLUDE shift  34
+                 INCLUDE_GUARD shift  35
+                       PROCESS shift  75
+                      TEMPLATE shift  76
+                     processes shift  33
+           process_or_template shift  36
                          input accept
                      {default} reduce 1
 
@@ -18,7 +20,7 @@ State 1:
           statement ::= dotted_name ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
-     (19) statement_args_maybe ::= *
+     (20) statement_args_maybe ::= *
           statement_args_maybe ::= * list_contents
           list_contents ::= * value
           list_contents ::= * value COMMA list_contents
@@ -31,23 +33,23 @@ State 1:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-          statement_args_maybe shift  37
-                 list_contents shift  77
-                          list shift  84
-                           map shift  85
-                         value shift  40
-                     {default} reduce 19
+                   dotted_name shift  86
+          statement_args_maybe shift  39
+                 list_contents shift  80
+                          list shift  87
+                           map shift  88
+                         value shift  42
+                     {default} reduce 20
 
 State 2:
           statement ::= dotted_name ARROW dotted_name ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
-     (19) statement_args_maybe ::= *
+     (20) statement_args_maybe ::= *
           statement_args_maybe ::= * list_contents
           list_contents ::= * value
           list_contents ::= * value COMMA list_contents
@@ -60,17 +62,17 @@ State 2:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-          statement_args_maybe shift  46
-                 list_contents shift  77
-                          list shift  84
-                           map shift  85
-                         value shift  40
-                     {default} reduce 19
+                   dotted_name shift  86
+          statement_args_maybe shift  48
+                 list_contents shift  80
+                          list shift  87
+                           map shift  88
+                         value shift  42
+                     {default} reduce 20
 
 State 3:
           dotted_name ::= * NAME
@@ -88,16 +90,16 @@ State 3:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
-                   CURLY_CLOSE shift  79
+                   CURLY_CLOSE shift  82
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                 list_contents shift  41
-                          list shift  84
-                           map shift  85
-                         value shift  40
+                   dotted_name shift  86
+                 list_contents shift  43
+                          list shift  87
+                           map shift  88
+                         value shift  42
 
 State 4:
           dotted_name ::= * NAME
@@ -115,16 +117,16 @@ State 4:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                 BRACKET_CLOSE shift  86
-                   dotted_name shift  83
-                          list shift  84
-                  map_contents shift  44
-                           map shift  85
-                         value shift  42
+                 BRACKET_CLOSE shift  89
+                   dotted_name shift  86
+                          list shift  87
+                  map_contents shift  46
+                           map shift  88
+                         value shift  44
 
 State 5:
           dotted_name ::= * NAME
@@ -141,15 +143,15 @@ State 5:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                 list_contents shift  78
-                          list shift  84
-                           map shift  85
-                         value shift  40
+                   dotted_name shift  86
+                 list_contents shift  81
+                          list shift  87
+                           map shift  88
+                         value shift  42
 
 State 6:
           dotted_name ::= * NAME
@@ -166,15 +168,15 @@ State 6:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                          list shift  84
-                  map_contents shift  81
-                           map shift  85
-                         value shift  42
+                   dotted_name shift  86
+                          list shift  87
+                  map_contents shift  84
+                           map shift  88
+                         value shift  44
 
 State 7:
           dotted_name ::= * NAME
@@ -190,14 +192,14 @@ State 7:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                          list shift  84
-                           map shift  85
-                         value shift  43
+                   dotted_name shift  86
+                          list shift  87
+                           map shift  88
+                         value shift  45
 
 State 8:
           statement ::= IF ROUND_OPEN * value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON
@@ -212,14 +214,14 @@ State 8:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                          list shift  84
-                           map shift  85
-                         value shift  49
+                   dotted_name shift  86
+                          list shift  87
+                           map shift  88
+                         value shift  51
 
 State 9:
           statement ::= FOREACH ROUND_OPEN * value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
@@ -235,14 +237,14 @@ State 9:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                          list shift  84
-                           map shift  85
-                         value shift  55
+                   dotted_name shift  86
+                          list shift  87
+                           map shift  88
+                         value shift  57
 
 State 10:
           elif ::= ELIF ROUND_OPEN * value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE
@@ -258,14 +260,14 @@ State 10:
           value ::= * list
           value ::= * map
 
-                        STRING shift  82
-                          NAME shift  39
+                        STRING shift  85
+                          NAME shift  41
                     CURLY_OPEN shift  3
                   BRACKET_OPEN shift  4
-                   dotted_name shift  83
-                          list shift  84
-                           map shift  85
-                         value shift  67
+                   dotted_name shift  86
+                          list shift  87
+                           map shift  88
+                         value shift  69
 
 State 11:
           processes ::= process_or_template NAME CURLY_OPEN * statements CURLY_CLOSE processes
@@ -279,12 +281,12 @@ State 11:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  36
-                   dotted_name shift  30
+                    statements shift  38
+                   dotted_name shift  31
 
 State 12:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -298,12 +300,12 @@ State 12:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  51
-                   dotted_name shift  30
+                    statements shift  53
+                   dotted_name shift  31
 
 State 13:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -317,12 +319,12 @@ State 13:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  65
-                   dotted_name shift  30
+                    statements shift  67
+                   dotted_name shift  31
 
 State 14:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -336,12 +338,12 @@ State 14:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  58
-                   dotted_name shift  30
+                    statements shift  60
+                   dotted_name shift  31
 
 State 15:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -350,19 +352,19 @@ State 15:
           statement ::= * FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statement ::= * FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statements ::= * statement
-     (15) statements ::= statement *
+     (16) statements ::= statement *
           statements ::= * statement statements
           statements ::= statement * statements
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  91
-                   dotted_name shift  30
-                     {default} reduce 15
+                    statements shift  94
+                   dotted_name shift  31
+                     {default} reduce 16
 
 State 16:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -376,12 +378,12 @@ State 16:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  63
-                   dotted_name shift  30
+                    statements shift  65
+                   dotted_name shift  31
 
 State 17:
           statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
@@ -396,521 +398,553 @@ State 17:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                            IF shift  48
-                       FOREACH shift  54
+                          NAME shift  41
+                            IF shift  50
+                       FOREACH shift  56
                      statement shift  15
-                    statements shift  69
-                   dotted_name shift  30
+                    statements shift  71
+                   dotted_name shift  31
 
 State 18:
       (1) processes ::= *
           processes ::= * INCLUDE STRING processes
           processes ::= INCLUDE STRING * processes
+          processes ::= * INCLUDE_GUARD STRING processes
           processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes
           process_or_template ::= * PROCESS
           process_or_template ::= * TEMPLATE
 
-                       INCLUDE shift  33
-                       PROCESS shift  72
-                      TEMPLATE shift  73
-                     processes shift  70
-           process_or_template shift  34
+                       INCLUDE shift  34
+                 INCLUDE_GUARD shift  35
+                       PROCESS shift  75
+                      TEMPLATE shift  76
+                     processes shift  72
+           process_or_template shift  36
                      {default} reduce 1
 
 State 19:
       (1) processes ::= *
           processes ::= * INCLUDE STRING processes
+          processes ::= * INCLUDE_GUARD STRING processes
+          processes ::= INCLUDE_GUARD STRING * processes
           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
 
-                       INCLUDE shift  33
-                       PROCESS shift  72
-                      TEMPLATE shift  73
-                     processes shift  71
-           process_or_template shift  34
+                       INCLUDE shift  34
+                 INCLUDE_GUARD shift  35
+                       PROCESS shift  75
+                      TEMPLATE shift  76
+                     processes shift  73
+           process_or_template shift  36
                      {default} reduce 1
 
 State 20:
+      (1) processes ::= *
+          processes ::= * INCLUDE STRING processes
+          processes ::= * INCLUDE_GUARD STRING processes
+          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
+
+                       INCLUDE shift  34
+                 INCLUDE_GUARD shift  35
+                       PROCESS shift  75
+                      TEMPLATE shift  76
+                     processes shift  74
+           process_or_template shift  36
+                     {default} reduce 1
+
+State 21:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE * elif_maybe else_maybe name_maybe SEMICOLON
-      (9) elif_maybe ::= *
+     (10) elif_maybe ::= *
           elif_maybe ::= * elif
           elif ::= * ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE
           elif ::= * ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif
 
-                          ELIF shift  66
-                    elif_maybe shift  25
-                          elif shift  94
-                     {default} reduce 9
+                          ELIF shift  68
+                    elif_maybe shift  26
+                          elif shift  97
+                     {default} reduce 10
 
-State 21:
+State 22:
           statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
-     (33) name_maybe ::= *
+     (34) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  75
-                    name_maybe shift  38
-                     {default} reduce 33
+                          NAME shift  78
+                    name_maybe shift  40
+                     {default} reduce 34
 
-State 22:
+State 23:
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
           dotted_name ::= NAME DOT * dotted_name
 
-                          NAME shift  39
-                   dotted_name shift  76
+                          NAME shift  41
+                   dotted_name shift  79
 
-State 23:
+State 24:
           statement ::= dotted_name ARROW * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           dotted_name ::= * NAME
           dotted_name ::= * NAME DOT dotted_name
 
-                          NAME shift  39
-                   dotted_name shift  45
+                          NAME shift  41
+                   dotted_name shift  47
 
-State 24:
+State 25:
           statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE * name_maybe SEMICOLON
-     (33) name_maybe ::= *
+     (34) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  75
-                    name_maybe shift  47
-                     {default} reduce 33
+                          NAME shift  78
+                    name_maybe shift  49
+                     {default} reduce 34
 
-State 25:
+State 26:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe * else_maybe name_maybe SEMICOLON
-     (13) else_maybe ::= *
+     (14) else_maybe ::= *
           else_maybe ::= * ELSE CURLY_OPEN statements CURLY_CLOSE
 
-                          ELSE shift  53
-                    else_maybe shift  26
-                     {default} reduce 13
+                          ELSE shift  55
+                    else_maybe shift  27
+                     {default} reduce 14
 
-State 26:
+State 27:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe * name_maybe SEMICOLON
-     (33) name_maybe ::= *
+     (34) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  75
-                    name_maybe shift  52
-                     {default} reduce 33
+                          NAME shift  78
+                    name_maybe shift  54
+                     {default} reduce 34
 
-State 27:
+State 28:
           statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE * name_maybe SEMICOLON
-     (33) name_maybe ::= *
+     (34) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  75
-                    name_maybe shift  59
-                     {default} reduce 33
+                          NAME shift  78
+                    name_maybe shift  61
+                     {default} reduce 34
 
-State 28:
+State 29:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE * name_maybe SEMICOLON
-     (33) name_maybe ::= *
+     (34) name_maybe ::= *
           name_maybe ::= * NAME
 
-                          NAME shift  75
-                    name_maybe shift  64
-                     {default} reduce 33
+                          NAME shift  78
+                    name_maybe shift  66
+                     {default} reduce 34
 
-State 29:
+State 30:
           elif ::= * ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE
-     (11) elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE *
+     (12) elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE *
           elif ::= * ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif
           elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE * elif
 
-                          ELIF shift  66
-                          elif shift  95
-                     {default} reduce 11
+                          ELIF shift  68
+                          elif shift  98
+                     {default} reduce 12
 
-State 30:
+State 31:
           statement ::= dotted_name * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
           statement ::= dotted_name * ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
 
                     ROUND_OPEN shift  1
-                         ARROW shift  23
+                         ARROW shift  24
 
-State 31:
+State 32:
           statement ::= FOREACH ROUND_OPEN value AS NAME * ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statement ::= FOREACH ROUND_OPEN value AS NAME * COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  57
-                         COLON shift  60
+                   ROUND_CLOSE shift  59
+                         COLON shift  62
 
-State 32:
+State 33:
       (0) input ::= processes *
 
                              $ reduce 0
 
-State 33:
+State 34:
           processes ::= INCLUDE * STRING processes
 
                         STRING shift  18
 
-State 34:
+State 35:
+          processes ::= INCLUDE_GUARD * STRING processes
+
+                        STRING shift  19
+
+State 36:
           processes ::= process_or_template * NAME CURLY_OPEN statements CURLY_CLOSE processes
 
-                          NAME shift  35
+                          NAME shift  37
 
-State 35:
+State 37:
           processes ::= process_or_template NAME * CURLY_OPEN statements CURLY_CLOSE processes
 
                     CURLY_OPEN shift  11
 
-State 36:
+State 38:
           processes ::= process_or_template NAME CURLY_OPEN statements * CURLY_CLOSE processes
 
-                   CURLY_CLOSE shift  19
+                   CURLY_CLOSE shift  20
 
-State 37:
+State 39:
           statement ::= dotted_name ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  21
+                   ROUND_CLOSE shift  22
 
-State 38:
+State 40:
           statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  74
+                     SEMICOLON shift  77
 
-State 39:
-     (17) dotted_name ::= NAME *
+State 41:
+     (18) dotted_name ::= NAME *
           dotted_name ::= NAME * DOT dotted_name
 
-                           DOT shift  22
-                     {default} reduce 17
+                           DOT shift  23
+                     {default} reduce 18
 
-State 40:
-     (21) list_contents ::= value *
+State 42:
+     (22) list_contents ::= value *
           list_contents ::= value * COMMA list_contents
 
                          COMMA shift  5
-                     {default} reduce 21
+                     {default} reduce 22
 
-State 41:
+State 43:
           list ::= CURLY_OPEN list_contents * CURLY_CLOSE
 
-                   CURLY_CLOSE shift  80
+                   CURLY_CLOSE shift  83
 
-State 42:
+State 44:
           map_contents ::= value * COLON value
           map_contents ::= value * COLON value COMMA map_contents
 
                          COLON shift  7
 
-State 43:
-     (25) map_contents ::= value COLON value *
+State 45:
+     (26) map_contents ::= value COLON value *
           map_contents ::= value COLON value * COMMA map_contents
 
                          COMMA shift  6
-                     {default} reduce 25
+                     {default} reduce 26
 
-State 44:
+State 46:
           map ::= BRACKET_OPEN map_contents * BRACKET_CLOSE
 
-                 BRACKET_CLOSE shift  87
+                 BRACKET_CLOSE shift  90
 
-State 45:
+State 47:
           statement ::= dotted_name ARROW dotted_name * ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON
 
                     ROUND_OPEN shift  2
 
-State 46:
+State 48:
           statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe * ROUND_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  24
+                   ROUND_CLOSE shift  25
 
-State 47:
+State 49:
           statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  88
+                     SEMICOLON shift  91
 
-State 48:
+State 50:
           statement ::= IF * ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON
 
                     ROUND_OPEN shift  8
 
-State 49:
+State 51:
           statement ::= IF ROUND_OPEN value * ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  50
+                   ROUND_CLOSE shift  52
 
-State 50:
+State 52:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE * CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON
 
                     CURLY_OPEN shift  12
 
-State 51:
+State 53:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements * CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON
 
-                   CURLY_CLOSE shift  20
+                   CURLY_CLOSE shift  21
 
-State 52:
+State 54:
           statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe * SEMICOLON
 
-                     SEMICOLON shift  89
+                     SEMICOLON shift  92
 
-State 53:
+State 55:
           else_maybe ::= ELSE * CURLY_OPEN statements CURLY_CLOSE
 
                     CURLY_OPEN shift  13
 
-State 54:
+State 56:
           statement ::= FOREACH * ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statement ::= FOREACH * ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
                     ROUND_OPEN shift  9
 
-State 55:
+State 57:
           statement ::= FOREACH ROUND_OPEN value * AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statement ::= FOREACH ROUND_OPEN value * AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
-                            AS shift  56
+                            AS shift  58
 
-State 56:
+State 58:
           statement ::= FOREACH ROUND_OPEN value AS * NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
           statement ::= FOREACH ROUND_OPEN value AS * NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
-                          NAME shift  31
+                          NAME shift  32
 
-State 57:
+State 59:
           statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE * CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
                     CURLY_OPEN shift  14
 
-State 58:
+State 60:
           statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements * CURLY_CLOSE name_maybe SEMICOLON
 
-                   CURLY_CLOSE shift  27
+                   CURLY_CLOSE shift  28
 
-State 59:
+State 61:
           statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  90
+                     SEMICOLON shift  93
 
-State 60:
+State 62:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON * NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
-                          NAME shift  61
+                          NAME shift  63
 
-State 61:
+State 63:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME * ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
-                   ROUND_CLOSE shift  62
+                   ROUND_CLOSE shift  64
 
-State 62:
+State 64:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE * CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON
 
                     CURLY_OPEN shift  16
 
-State 63:
+State 65:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements * CURLY_CLOSE name_maybe SEMICOLON
 
-                   CURLY_CLOSE shift  28
+                   CURLY_CLOSE shift  29
 
-State 64:
+State 66:
           statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe * SEMICOLON
 
-                     SEMICOLON shift  92
+                     SEMICOLON shift  95
 
-State 65:
+State 67:
           else_maybe ::= ELSE CURLY_OPEN statements * CURLY_CLOSE
 
-                   CURLY_CLOSE shift  93
+                   CURLY_CLOSE shift  96
 
-State 66:
+State 68:
           elif ::= ELIF * ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE
           elif ::= ELIF * ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif
 
                     ROUND_OPEN shift  10
 
-State 67:
+State 69:
           elif ::= ELIF ROUND_OPEN value * ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE
           elif ::= ELIF ROUND_OPEN value * ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif
 
-                   ROUND_CLOSE shift  68
+                   ROUND_CLOSE shift  70
 
-State 68:
+State 70:
           elif ::= ELIF ROUND_OPEN value ROUND_CLOSE * CURLY_OPEN statements CURLY_CLOSE
           elif ::= ELIF ROUND_OPEN value ROUND_CLOSE * CURLY_OPEN statements CURLY_CLOSE elif
 
                     CURLY_OPEN shift  17
 
-State 69:
+State 71:
           elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements * CURLY_CLOSE
           elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements * CURLY_CLOSE elif
 
-                   CURLY_CLOSE shift  29
+                   CURLY_CLOSE shift  30
 
-State 70:
+State 72:
       (2) processes ::= INCLUDE STRING processes *
 
                      {default} reduce 2
 
-State 71:
-      (3) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes *
-
-                     {default} reduce 3
-
-State 72:
-     (35) process_or_template ::= PROCESS *
-
-                     {default} reduce 35
-
 State 73:
-     (36) process_or_template ::= TEMPLATE *
+      (3) processes ::= INCLUDE_GUARD STRING processes *
 
-                     {default} reduce 36
+                     {default} reduce 3
 
 State 74:
-      (4) statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
+      (4) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes *
 
                      {default} reduce 4
 
 State 75:
-     (34) name_maybe ::= NAME *
+     (36) process_or_template ::= PROCESS *
 
-                     {default} reduce 34
+                     {default} reduce 36
 
 State 76:
-     (18) dotted_name ::= NAME DOT dotted_name *
+     (37) process_or_template ::= TEMPLATE *
 
-                     {default} reduce 18
+                     {default} reduce 37
 
 State 77:
-     (20) statement_args_maybe ::= list_contents *
+      (5) statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
 
-                     {default} reduce 20
+                     {default} reduce 5
 
 State 78:
-     (22) list_contents ::= value COMMA list_contents *
+     (35) name_maybe ::= NAME *
 
-                     {default} reduce 22
+                     {default} reduce 35
 
 State 79:
-     (23) list ::= CURLY_OPEN CURLY_CLOSE *
+     (19) dotted_name ::= NAME DOT dotted_name *
 
-                     {default} reduce 23
+                     {default} reduce 19
 
 State 80:
-     (24) list ::= CURLY_OPEN list_contents CURLY_CLOSE *
+     (21) statement_args_maybe ::= list_contents *
 
-                     {default} reduce 24
+                     {default} reduce 21
 
 State 81:
-     (26) map_contents ::= value COLON value COMMA map_contents *
+     (23) list_contents ::= value COMMA list_contents *
 
-                     {default} reduce 26
+                     {default} reduce 23
 
 State 82:
-     (29) value ::= STRING *
+     (24) list ::= CURLY_OPEN CURLY_CLOSE *
 
-                     {default} reduce 29
+                     {default} reduce 24
 
 State 83:
-     (30) value ::= dotted_name *
+     (25) list ::= CURLY_OPEN list_contents CURLY_CLOSE *
 
-                     {default} reduce 30
+                     {default} reduce 25
 
 State 84:
-     (31) value ::= list *
+     (27) map_contents ::= value COLON value COMMA map_contents *
 
-                     {default} reduce 31
+                     {default} reduce 27
 
 State 85:
-     (32) value ::= map *
+     (30) value ::= STRING *
 
-                     {default} reduce 32
+                     {default} reduce 30
 
 State 86:
-     (27) map ::= BRACKET_OPEN BRACKET_CLOSE *
+     (31) value ::= dotted_name *
 
-                     {default} reduce 27
+                     {default} reduce 31
 
 State 87:
-     (28) map ::= BRACKET_OPEN map_contents BRACKET_CLOSE *
+     (32) value ::= list *
 
-                     {default} reduce 28
+                     {default} reduce 32
 
 State 88:
-      (5) statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
+     (33) value ::= map *
 
-                     {default} reduce 5
+                     {default} reduce 33
 
 State 89:
-      (6) statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON *
+     (28) map ::= BRACKET_OPEN BRACKET_CLOSE *
 
-                     {default} reduce 6
+                     {default} reduce 28
 
 State 90:
-      (7) statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON *
+     (29) map ::= BRACKET_OPEN map_contents BRACKET_CLOSE *
 
-                     {default} reduce 7
+                     {default} reduce 29
 
 State 91:
-     (16) statements ::= statement statements *
+      (6) statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON *
 
-                     {default} reduce 16
+                     {default} reduce 6
 
 State 92:
-      (8) statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON *
+      (7) statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON *
 
-                     {default} reduce 8
+                     {default} reduce 7
 
 State 93:
-     (14) else_maybe ::= ELSE CURLY_OPEN statements CURLY_CLOSE *
+      (8) statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON *
 
-                     {default} reduce 14
+                     {default} reduce 8
 
 State 94:
-     (10) elif_maybe ::= elif *
+     (17) statements ::= statement statements *
 
-                     {default} reduce 10
+                     {default} reduce 17
 
 State 95:
-     (12) elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif *
+      (9) statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON *
 
-                     {default} reduce 12
+                     {default} reduce 9
+
+State 96:
+     (15) else_maybe ::= ELSE CURLY_OPEN statements CURLY_CLOSE *
+
+                     {default} reduce 15
+
+State 97:
+     (11) elif_maybe ::= elif *
+
+                     {default} reduce 11
+
+State 98:
+     (13) elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif *
+
+                     {default} reduce 13
 
 ----------------------------------------------------
 Symbols:
     0: $:
     1: INCLUDE
     2: STRING
-    3: NAME
-    4: CURLY_OPEN
-    5: CURLY_CLOSE
-    6: ROUND_OPEN
-    7: ROUND_CLOSE
-    8: SEMICOLON
-    9: ARROW
-   10: IF
-   11: FOREACH
-   12: AS
-   13: COLON
-   14: ELIF
-   15: ELSE
-   16: DOT
-   17: COMMA
-   18: BRACKET_OPEN
-   19: BRACKET_CLOSE
-   20: PROCESS
-   21: TEMPLATE
-   22: error:
-   23: processes: <lambda> INCLUDE PROCESS TEMPLATE
-   24: statement: NAME IF FOREACH
-   25: elif_maybe: <lambda> ELIF
-   26: elif: ELIF
-   27: else_maybe: <lambda> ELSE
-   28: statements: NAME IF FOREACH
-   29: dotted_name: NAME
-   30: statement_args_maybe: <lambda> STRING NAME CURLY_OPEN BRACKET_OPEN
-   31: list_contents: STRING NAME CURLY_OPEN BRACKET_OPEN
-   32: list: CURLY_OPEN
-   33: map_contents: STRING NAME CURLY_OPEN BRACKET_OPEN
-   34: map: BRACKET_OPEN
-   35: value: STRING NAME CURLY_OPEN BRACKET_OPEN
-   36: name_maybe: <lambda> NAME
-   37: process_or_template: PROCESS TEMPLATE
-   38: input: INCLUDE PROCESS TEMPLATE
+    3: INCLUDE_GUARD
+    4: NAME
+    5: CURLY_OPEN
+    6: CURLY_CLOSE
+    7: ROUND_OPEN
+    8: ROUND_CLOSE
+    9: SEMICOLON
+   10: ARROW
+   11: IF
+   12: FOREACH
+   13: AS
+   14: COLON
+   15: ELIF
+   16: ELSE
+   17: DOT
+   18: COMMA
+   19: BRACKET_OPEN
+   20: BRACKET_CLOSE
+   21: PROCESS
+   22: TEMPLATE
+   23: error:
+   24: processes: <lambda> INCLUDE INCLUDE_GUARD PROCESS TEMPLATE
+   25: statement: NAME IF FOREACH
+   26: elif_maybe: <lambda> ELIF
+   27: elif: ELIF
+   28: else_maybe: <lambda> ELSE
+   29: statements: NAME IF FOREACH
+   30: dotted_name: NAME
+   31: statement_args_maybe: <lambda> STRING NAME CURLY_OPEN BRACKET_OPEN
+   32: list_contents: STRING NAME CURLY_OPEN BRACKET_OPEN
+   33: list: CURLY_OPEN
+   34: map_contents: STRING NAME CURLY_OPEN BRACKET_OPEN
+   35: map: BRACKET_OPEN
+   36: value: STRING NAME CURLY_OPEN BRACKET_OPEN
+   37: name_maybe: <lambda> NAME
+   38: process_or_template: PROCESS TEMPLATE
+   39: input: INCLUDE INCLUDE_GUARD PROCESS TEMPLATE

+ 30 - 0
generated/NCDConfigParser_parse.y

@@ -180,6 +180,36 @@ doneA:
     free_program(N);
 }
 
+processes(R) ::= INCLUDE_GUARD STRING(A) processes(N). {
+    ASSERT(A.str)
+    if (!N.have) {
+        goto failZ0;
+    }
+    
+    NCDProgramElem elem;
+    if (!NCDProgramElem_InitIncludeGuard(&elem, A.str, A.len)) {
+        goto failZ0;
+    }
+    
+    if (!NCDProgram_PrependElem(&N.v, elem)) {
+        goto failZ1;
+    }
+    
+    R.have = 1;
+    R.v = N.v;
+    N.have = 0;
+    goto doneZ;
+
+failZ1:
+    NCDProgramElem_Free(&elem);
+failZ0:
+    R.have = 0;
+    parser_out->out_of_memory = 1;
+doneZ:
+    free_token(A);
+    free_program(N);
+}
+
 processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE processes(N). {
     ASSERT(A.str)
     if (!B.have || !N.have) {

+ 4 - 0
ncd/NCDConfigParser.c

@@ -154,6 +154,10 @@ static int tokenizer_output (void *user, int token, char *value, size_t value_le
             Parse(state->parser, INCLUDE, minor, &state->out);
         } break;
         
+        case NCD_TOKEN_INCLUDE_GUARD: {
+            Parse(state->parser, INCLUDE_GUARD, minor, &state->out);
+        } break;
+        
         default:
             BLog(BLOG_ERROR, "line %zu, character %zu: invalid token", line, line_char);
             free(minor.str);

+ 30 - 0
ncd/NCDConfigParser_parse.y

@@ -180,6 +180,36 @@ doneA:
     free_program(N);
 }
 
+processes(R) ::= INCLUDE_GUARD STRING(A) processes(N). {
+    ASSERT(A.str)
+    if (!N.have) {
+        goto failZ0;
+    }
+    
+    NCDProgramElem elem;
+    if (!NCDProgramElem_InitIncludeGuard(&elem, A.str, A.len)) {
+        goto failZ0;
+    }
+    
+    if (!NCDProgram_PrependElem(&N.v, elem)) {
+        goto failZ1;
+    }
+    
+    R.have = 1;
+    R.v = N.v;
+    N.have = 0;
+    goto doneZ;
+
+failZ1:
+    NCDProgramElem_Free(&elem);
+failZ0:
+    R.have = 0;
+    parser_out->out_of_memory = 1;
+doneZ:
+    free_token(A);
+    free_program(N);
+}
+
 processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE processes(N). {
     ASSERT(A.str)
     if (!B.have || !N.have) {

Некоторые файлы не были показаны из-за большого количества измененных файлов