summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2018-05-27 22:39:29 +0700
committerDaniil Baturin <daniil@baturin.org>2018-05-27 22:39:29 +0700
commitc5176efc2817f8a43cd2d28f28dfcfdff249a85c (patch)
tree086b74a1f4af28885055020a786d241a3ae8e80f
parentc1e6da134ee9208333a4626107273c956f25d13c (diff)
downloadlibvyosconfig-c5176efc2817f8a43cd2d28f28dfcfdff249a85c.tar.gz
libvyosconfig-c5176efc2817f8a43cd2d28f28dfcfdff249a85c.zip
Use the ephemeral flag (which is never used in VyOS 1.x for lack of the concept) to mark tag nodes at parsing time.
-rw-r--r--lib/vyos1x_parser.ml829
1 files changed, 829 insertions, 0 deletions
diff --git a/lib/vyos1x_parser.ml b/lib/vyos1x_parser.ml
new file mode 100644
index 0000000..c1a097c
--- /dev/null
+++ b/lib/vyos1x_parser.ml
@@ -0,0 +1,829 @@
+
+module MenhirBasics = struct
+
+ exception Error
+
+ type token =
+ | STRING of (
+# 26 "lib/vyos1x_parser.mly"
+ (string)
+# 11 "lib/vyos1x_parser.ml"
+ )
+ | RIGHT_BRACE
+ | NEWLINE
+ | LEFT_BRACE
+ | IDENTIFIER of (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 19 "lib/vyos1x_parser.ml"
+ )
+ | EOF
+ | COMMENT of (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 25 "lib/vyos1x_parser.ml"
+ )
+
+end
+
+include MenhirBasics
+
+let _eRR =
+ MenhirBasics.Error
+
+type _menhir_env = {
+ _menhir_lexer: Lexing.lexbuf -> token;
+ _menhir_lexbuf: Lexing.lexbuf;
+ _menhir_token: token;
+ mutable _menhir_error: bool
+}
+
+and _menhir_state =
+ | MenhirState21
+ | MenhirState10
+ | MenhirState8
+ | MenhirState3
+ | MenhirState1
+ | MenhirState0
+
+# 1 "lib/vyos1x_parser.mly"
+
+ open Config_tree
+
+ exception Duplicate_child of (string * string)
+
+ (* Used for checking if after merging immediate children,
+ any of them have duplicate children inside,
+ e.g. "interfaces { ethernet eth0 {...} ethernet eth0 {...} }" *)
+ let find_duplicate_children n =
+ let rec aux xs =
+ let xs = List.sort compare xs in
+ match xs with
+ | [] | [_] -> ()
+ | x :: x' :: xs ->
+ if x = x' then raise (Duplicate_child (Vytree.name_of_node n, x))
+ else aux (x' :: xs)
+ in
+ aux @@ Vytree.list_children n
+
+ (* When merging nodes with values, append values of subsequent nodes to the
+ first one *)
+ let merge_data l r = {l with values=(List.append l.values r.values)}
+
+# 74 "lib/vyos1x_parser.ml"
+
+let rec _menhir_goto_list_node_content_ : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_list_node_content_ -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ match _menhir_s with
+ | MenhirState10 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv89 * _menhir_state * 'tv_node_content) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv87 * _menhir_state * 'tv_node_content) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, (x : 'tv_node_content)), _, (xs : 'tv_list_node_content_)) = _menhir_stack in
+ let _v : 'tv_list_node_content_ =
+# 187 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( x :: xs )
+# 89 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_node_content_ _menhir_env _menhir_stack _menhir_s _v) : 'freshtv88)) : 'freshtv90)
+ | MenhirState21 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (((('freshtv103 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 97 "lib/vyos1x_parser.ml"
+ )) * 'tv_value)) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | RIGHT_BRACE ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (((('freshtv99 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 107 "lib/vyos1x_parser.ml"
+ )) * 'tv_value)) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (((('freshtv97 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 114 "lib/vyos1x_parser.ml"
+ )) * 'tv_value)) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let ((((_menhir_stack, _menhir_s, (comment : 'tv_comments)), (name : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 119 "lib/vyos1x_parser.ml"
+ ))), (tag : 'tv_value)), _, (children : 'tv_list_node_content_)) = _menhir_stack in
+ let _6 = () in
+ let _4 = () in
+ let _v : 'tv_tag_node =
+# 82 "lib/vyos1x_parser.mly"
+ (
+ let outer_node = Vytree.make_full {default_data with ephemeral=true} name [] in
+ let inner_node =
+ Vytree.make_full {default_data with comment=comment} tag [] in
+ let inner_node = List.fold_left Vytree.adopt inner_node (List.rev children) |> Vytree.merge_children merge_data in
+ let node = Vytree.adopt outer_node inner_node in
+ try
+ List.iter find_duplicate_children (Vytree.children_of_node inner_node);
+ node
+ with
+ | Duplicate_child (child, dup) ->
+ failwith (Printf.sprintf "Node \"%s %s %s\" has two children named \"%s\"" name tag child dup)
+ )
+# 138 "lib/vyos1x_parser.ml"
+ in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv95) = _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_tag_node) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv93) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_tag_node) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv91) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let ((n : 'tv_tag_node) : 'tv_tag_node) = _v in
+ ((let _v : 'tv_node_content =
+# 96 "lib/vyos1x_parser.mly"
+ ( n )
+# 155 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_node_content _menhir_env _menhir_stack _menhir_s _v) : 'freshtv92)) : 'freshtv94)) : 'freshtv96)) : 'freshtv98)) : 'freshtv100)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (((('freshtv101 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 165 "lib/vyos1x_parser.ml"
+ )) * 'tv_value)) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv102)) : 'freshtv104)
+ | MenhirState8 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ((('freshtv119 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 174 "lib/vyos1x_parser.ml"
+ ))) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | RIGHT_BRACE ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ((('freshtv115 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 184 "lib/vyos1x_parser.ml"
+ ))) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ((('freshtv113 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 191 "lib/vyos1x_parser.ml"
+ ))) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let (((_menhir_stack, _menhir_s, (comment : 'tv_comments)), (name : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 196 "lib/vyos1x_parser.ml"
+ ))), _, (children : 'tv_list_node_content_)) = _menhir_stack in
+ let _5 = () in
+ let _3 = () in
+ let _v : 'tv_node =
+# 60 "lib/vyos1x_parser.mly"
+ (
+ let node =
+ Vytree.make_full {default_data with comment=comment} name [] in
+ let node = List.fold_left Vytree.adopt node (List.rev children) |> Vytree.merge_children merge_data in
+ try
+ List.iter find_duplicate_children (Vytree.children_of_node node);
+ node
+ with
+ | Duplicate_child (child, dup) ->
+ failwith (Printf.sprintf "Node \"%s %s\" has two children named \"%s\"" name child dup)
+ )
+# 213 "lib/vyos1x_parser.ml"
+ in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv111) = _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_node) = _v in
+ ((let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ match _menhir_s with
+ | MenhirState3 | MenhirState0 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv105 * _menhir_state * 'tv_node) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState3 _v
+ | EOF ->
+ _menhir_reduce7 _menhir_env (Obj.magic _menhir_stack) MenhirState3
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState3
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState3) : 'freshtv106)
+ | MenhirState8 | MenhirState21 | MenhirState10 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv109 * _menhir_state * 'tv_node) = Obj.magic _menhir_stack in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv107 * _menhir_state * 'tv_node) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, (n : 'tv_node)) = _menhir_stack in
+ let _v : 'tv_node_content =
+# 96 "lib/vyos1x_parser.mly"
+ ( n )
+# 246 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_node_content _menhir_env _menhir_stack _menhir_s _v) : 'freshtv108)) : 'freshtv110)
+ | _ ->
+ _menhir_fail ()) : 'freshtv112)) : 'freshtv114)) : 'freshtv116)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ((('freshtv117 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 258 "lib/vyos1x_parser.ml"
+ ))) * _menhir_state * 'tv_list_node_content_) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv118)) : 'freshtv120)
+ | _ ->
+ _menhir_fail ()
+
+and _menhir_goto_node_content : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_node_content -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv85 * _menhir_state * 'tv_node_content) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState10 _v
+ | RIGHT_BRACE ->
+ _menhir_reduce9 _menhir_env (Obj.magic _menhir_stack) MenhirState10
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState10
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState10) : 'freshtv86)
+
+and _menhir_reduce9 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s ->
+ let _v : 'tv_list_node_content_ =
+# 185 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( [] )
+# 289 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_node_content_ _menhir_env _menhir_stack _menhir_s _v
+
+and _menhir_goto_leaf_node : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_leaf_node -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv83) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_leaf_node) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv81) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let ((n : 'tv_leaf_node) : 'tv_leaf_node) = _v in
+ ((let _v : 'tv_node_content =
+# 96 "lib/vyos1x_parser.mly"
+ ( n )
+# 306 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_node_content _menhir_env _menhir_stack _menhir_s _v) : 'freshtv82)) : 'freshtv84)
+
+and _menhir_goto_value : _menhir_env -> 'ttv_tail -> 'tv_value -> 'ttv_return =
+ fun _menhir_env _menhir_stack _v ->
+ let _menhir_stack = (_menhir_stack, _v) in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv79 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 317 "lib/vyos1x_parser.ml"
+ )) * 'tv_value) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | LEFT_BRACE ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv71 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 327 "lib/vyos1x_parser.ml"
+ )) * 'tv_value) = Obj.magic _menhir_stack in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState21 _v
+ | RIGHT_BRACE ->
+ _menhir_reduce9 _menhir_env (Obj.magic _menhir_stack) MenhirState21
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState21
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState21) : 'freshtv72)
+ | NEWLINE ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv75 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 347 "lib/vyos1x_parser.ml"
+ )) * 'tv_value) = Obj.magic _menhir_stack in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv73 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 354 "lib/vyos1x_parser.ml"
+ )) * 'tv_value) = Obj.magic _menhir_stack in
+ ((let (((_menhir_stack, _menhir_s, (comment : 'tv_comments)), (name : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 359 "lib/vyos1x_parser.ml"
+ ))), (value : 'tv_value)) = _menhir_stack in
+ let _4 = () in
+ let _v : 'tv_leaf_node =
+# 51 "lib/vyos1x_parser.mly"
+ ( Vytree.make_full {default_data with values=[value]; comment=comment} name [])
+# 365 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_leaf_node _menhir_env _menhir_stack _menhir_s _v) : 'freshtv74)) : 'freshtv76)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv77 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 375 "lib/vyos1x_parser.ml"
+ )) * 'tv_value) = Obj.magic _menhir_stack in
+ ((let (((_menhir_stack, _menhir_s, _), _), _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv78)) : 'freshtv80)
+
+and _menhir_run8 : _menhir_env -> ('ttv_tail * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 383 "lib/vyos1x_parser.ml"
+) -> 'ttv_return =
+ fun _menhir_env _menhir_stack ->
+ let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState8 _v
+ | RIGHT_BRACE ->
+ _menhir_reduce9 _menhir_env (Obj.magic _menhir_stack) MenhirState8
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState8
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState8
+
+and _menhir_fail : unit -> 'a =
+ fun () ->
+ Printf.fprintf Pervasives.stderr "Internal failure -- please contact the parser generator's developers.\n%!";
+ assert false
+
+and _menhir_goto_list_COMMENT_ : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_list_COMMENT_ -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ match _menhir_s with
+ | MenhirState1 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv35 * _menhir_state * (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 413 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_list_COMMENT_) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv33 * _menhir_state * (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 421 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ let (_ : _menhir_state) = _menhir_s in
+ let ((xs : 'tv_list_COMMENT_) : 'tv_list_COMMENT_) = _v in
+ ((let (_menhir_stack, _menhir_s, (x : (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 428 "lib/vyos1x_parser.ml"
+ ))) = _menhir_stack in
+ let _v : 'tv_list_COMMENT_ =
+# 187 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( x :: xs )
+# 433 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_COMMENT_ _menhir_env _menhir_stack _menhir_s _v) : 'freshtv34)) : 'freshtv36)
+ | MenhirState0 | MenhirState8 | MenhirState21 | MenhirState10 | MenhirState3 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv69) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_list_COMMENT_) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv67) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let ((cs : 'tv_list_COMMENT_) : 'tv_list_COMMENT_) = _v in
+ ((let _v : 'tv_comments =
+# 38 "lib/vyos1x_parser.mly"
+ ( match cs with [] -> None | _ -> Some (List.rev cs |> List.hd) )
+# 448 "lib/vyos1x_parser.ml"
+ in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv65) = _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : 'tv_comments) = _v in
+ ((let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ match _menhir_s with
+ | MenhirState0 | MenhirState3 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv43 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | IDENTIFIER _v ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv39 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ let (_v : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 468 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _menhir_stack = (_menhir_stack, _v) in
+ let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | LEFT_BRACE ->
+ _menhir_run8 _menhir_env (Obj.magic _menhir_stack)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv37 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 483 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, _), _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv38)) : 'freshtv40)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv41 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv42)) : 'freshtv44)
+ | MenhirState8 | MenhirState21 | MenhirState10 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv63 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | IDENTIFIER _v ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv59 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ let (_v : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 506 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _menhir_stack = (_menhir_stack, _v) in
+ let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | IDENTIFIER _v ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv47) = Obj.magic _menhir_stack in
+ let (_v : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 518 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv45) = Obj.magic _menhir_stack in
+ let ((v : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 526 "lib/vyos1x_parser.ml"
+ )) : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 530 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _v : 'tv_value =
+# 44 "lib/vyos1x_parser.mly"
+ ( v )
+# 535 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_value _menhir_env _menhir_stack _v) : 'freshtv46)) : 'freshtv48)
+ | LEFT_BRACE ->
+ _menhir_run8 _menhir_env (Obj.magic _menhir_stack)
+ | NEWLINE ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv51 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 545 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv49 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 552 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, (comment : 'tv_comments)), (name : (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 557 "lib/vyos1x_parser.ml"
+ ))) = _menhir_stack in
+ let _3 = () in
+ let _v : 'tv_leaf_node =
+# 54 "lib/vyos1x_parser.mly"
+ ( Vytree.make_full {default_data with comment=comment} name [] )
+# 563 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_leaf_node _menhir_env _menhir_stack _menhir_s _v) : 'freshtv50)) : 'freshtv52)
+ | STRING _v ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv55) = Obj.magic _menhir_stack in
+ let (_v : (
+# 26 "lib/vyos1x_parser.mly"
+ (string)
+# 572 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv53) = Obj.magic _menhir_stack in
+ let ((v : (
+# 26 "lib/vyos1x_parser.mly"
+ (string)
+# 580 "lib/vyos1x_parser.ml"
+ )) : (
+# 26 "lib/vyos1x_parser.mly"
+ (string)
+# 584 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let _v : 'tv_value =
+# 42 "lib/vyos1x_parser.mly"
+ ( v )
+# 589 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_value _menhir_env _menhir_stack _v) : 'freshtv54)) : 'freshtv56)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv57 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 599 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, _), _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv58)) : 'freshtv60)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv61 * _menhir_state * 'tv_comments) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv62)) : 'freshtv64)
+ | _ ->
+ _menhir_fail ()) : 'freshtv66)) : 'freshtv68)) : 'freshtv70)
+
+and _menhir_goto_list_node_ : _menhir_env -> 'ttv_tail -> _menhir_state -> 'tv_list_node_ -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ match _menhir_s with
+ | MenhirState3 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv17 * _menhir_state * 'tv_node) * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ('freshtv15 * _menhir_state * 'tv_node) * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, (x : 'tv_node)), _, (xs : 'tv_list_node_)) = _menhir_stack in
+ let _v : 'tv_list_node_ =
+# 187 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( x :: xs )
+# 626 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_node_ _menhir_env _menhir_stack _menhir_s _v) : 'freshtv16)) : 'freshtv18)
+ | MenhirState0 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv31 * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((assert (not _menhir_env._menhir_error);
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | EOF ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv27 * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv25 * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, (ns : 'tv_list_node_)) = _menhir_stack in
+ let _2 = () in
+ let _v : (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 645 "lib/vyos1x_parser.ml"
+ ) =
+# 100 "lib/vyos1x_parser.mly"
+ (
+ let root = make "root" in
+ let root = List.fold_left Vytree.adopt root (List.rev ns) |> Vytree.merge_children merge_data in
+ try
+ List.iter find_duplicate_children (Vytree.children_of_node root);
+ root
+ with
+ | Duplicate_child (child, dup) ->
+ failwith (Printf.sprintf "Node \"%s\" has two children named \"%s\"" child dup)
+ )
+# 658 "lib/vyos1x_parser.ml"
+ in
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv23) = _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 666 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv21) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let (_v : (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 674 "lib/vyos1x_parser.ml"
+ )) = _v in
+ ((let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv19) = Obj.magic _menhir_stack in
+ let (_menhir_s : _menhir_state) = _menhir_s in
+ let ((_1 : (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 682 "lib/vyos1x_parser.ml"
+ )) : (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 686 "lib/vyos1x_parser.ml"
+ )) = _v in
+ (Obj.magic _1 : 'freshtv20)) : 'freshtv22)) : 'freshtv24)) : 'freshtv26)) : 'freshtv28)
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv29 * _menhir_state * 'tv_list_node_) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv30)) : 'freshtv32)
+ | _ ->
+ _menhir_fail ()
+
+and _menhir_errorcase : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s ->
+ match _menhir_s with
+ | MenhirState21 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : ((('freshtv3 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 707 "lib/vyos1x_parser.ml"
+ )) * 'tv_value)) = Obj.magic _menhir_stack in
+ ((let (((_menhir_stack, _menhir_s, _), _), _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv4)
+ | MenhirState10 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv5 * _menhir_state * 'tv_node_content) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv6)
+ | MenhirState8 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : (('freshtv7 * _menhir_state * 'tv_comments) * (
+# 25 "lib/vyos1x_parser.mly"
+ (string)
+# 721 "lib/vyos1x_parser.ml"
+ ))) = Obj.magic _menhir_stack in
+ ((let ((_menhir_stack, _menhir_s, _), _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv8)
+ | MenhirState3 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv9 * _menhir_state * 'tv_node) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv10)
+ | MenhirState1 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv11 * _menhir_state * (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 735 "lib/vyos1x_parser.ml"
+ )) = Obj.magic _menhir_stack in
+ ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv12)
+ | MenhirState0 ->
+ let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv13) = Obj.magic _menhir_stack in
+ (raise _eRR : 'freshtv14)
+
+and _menhir_reduce5 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s ->
+ let _v : 'tv_list_COMMENT_ =
+# 185 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( [] )
+# 749 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_COMMENT_ _menhir_env _menhir_stack _menhir_s _v
+
+and _menhir_reduce7 : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s ->
+ let _v : 'tv_list_node_ =
+# 185 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+ ( [] )
+# 758 "lib/vyos1x_parser.ml"
+ in
+ _menhir_goto_list_node_ _menhir_env _menhir_stack _menhir_s _v
+
+and _menhir_run1 : _menhir_env -> 'ttv_tail -> _menhir_state -> (
+# 27 "lib/vyos1x_parser.mly"
+ (string)
+# 765 "lib/vyos1x_parser.ml"
+) -> 'ttv_return =
+ fun _menhir_env _menhir_stack _menhir_s _v ->
+ let _menhir_stack = (_menhir_stack, _menhir_s, _v) in
+ let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState1 _v
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState1
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState1
+
+and _menhir_discard : _menhir_env -> _menhir_env =
+ fun _menhir_env ->
+ let lexer = _menhir_env._menhir_lexer in
+ let lexbuf = _menhir_env._menhir_lexbuf in
+ let _tok = lexer lexbuf in
+ {
+ _menhir_lexer = lexer;
+ _menhir_lexbuf = lexbuf;
+ _menhir_token = _tok;
+ _menhir_error = false;
+ }
+
+and config : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (
+# 33 "lib/vyos1x_parser.mly"
+ (Config_tree.t)
+# 796 "lib/vyos1x_parser.ml"
+) =
+ fun lexer lexbuf ->
+ let _menhir_env =
+ let (lexer : Lexing.lexbuf -> token) = lexer in
+ let (lexbuf : Lexing.lexbuf) = lexbuf in
+ ((let _tok = Obj.magic () in
+ {
+ _menhir_lexer = lexer;
+ _menhir_lexbuf = lexbuf;
+ _menhir_token = _tok;
+ _menhir_error = false;
+ }) : _menhir_env)
+ in
+ Obj.magic (let (_menhir_env : _menhir_env) = _menhir_env in
+ let (_menhir_stack : 'freshtv1) = ((), _menhir_env._menhir_lexbuf.Lexing.lex_curr_p) in
+ ((let _menhir_env = _menhir_discard _menhir_env in
+ let _tok = _menhir_env._menhir_token in
+ match _tok with
+ | COMMENT _v ->
+ _menhir_run1 _menhir_env (Obj.magic _menhir_stack) MenhirState0 _v
+ | EOF ->
+ _menhir_reduce7 _menhir_env (Obj.magic _menhir_stack) MenhirState0
+ | IDENTIFIER _ ->
+ _menhir_reduce5 _menhir_env (Obj.magic _menhir_stack) MenhirState0
+ | _ ->
+ assert (not _menhir_env._menhir_error);
+ _menhir_env._menhir_error <- true;
+ _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState0) : 'freshtv2))
+
+# 219 "/home/dmbaturin/.opam/4.05.0/lib/menhir/standard.mly"
+
+
+
+# 830 "lib/vyos1x_parser.ml"