summaryrefslogtreecommitdiff
path: root/lib/vyos1x_parser.mly
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2018-05-28 04:48:30 +0700
committerDaniil Baturin <daniil@baturin.org>2018-05-28 04:48:30 +0700
commitd8f24a21fe821e6ce927fad66fb3f54821e9906a (patch)
tree5572d6171cce291279c028cbe5c3e480b5d18c38 /lib/vyos1x_parser.mly
parente0d21fa6bcce2ad0ea3b09015723fd9184a0be8c (diff)
downloadlibvyosconfig-d8f24a21fe821e6ce927fad66fb3f54821e9906a.tar.gz
libvyosconfig-d8f24a21fe821e6ce927fad66fb3f54821e9906a.zip
Integrate the parser/lexer and the renderer in the build setup.
Diffstat (limited to 'lib/vyos1x_parser.mly')
-rw-r--r--lib/vyos1x_parser.mly110
1 files changed, 0 insertions, 110 deletions
diff --git a/lib/vyos1x_parser.mly b/lib/vyos1x_parser.mly
deleted file mode 100644
index f786c7a..0000000
--- a/lib/vyos1x_parser.mly
+++ /dev/null
@@ -1,110 +0,0 @@
-%{
- 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)}
-%}
-
-%token <string> IDENTIFIER
-%token <string> STRING
-%token <string> COMMENT
-%token LEFT_BRACE
-%token RIGHT_BRACE
-%token NEWLINE
-%token EOF
-
-%start <Config_tree.t> config
-%%
-
-(* If there are multiple comments before a node, consider the last one its real comment *)
-comments:
- cs = list(COMMENT) { match cs with [] -> None | _ -> Some (List.rev cs |> List.hd) }
-
-value:
- | v = STRING
- { v }
- | v = IDENTIFIER
- { v }
-;
-
-
-leaf_node:
- | comment = comments;
- name = IDENTIFIER; value = value; NEWLINE;
- { Vytree.make_full {default_data with values=[value]; comment=comment} name []}
- | comment = comments;
- name = IDENTIFIER; NEWLINE (* valueless node *)
- { Vytree.make_full {default_data with comment=comment} name [] }
-;
-
-node:
- | comment = comments;
- name = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE;
- {
- 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)
- }
-;
-
-(* XXX: for the config to be loadable with the old CStore backend, what was formatted as a tag node
- in the original config, must remain formatted that way.
- Since fixing it there is more trouble than it's worth, and creating a separate version of
- Config_tree just for that seems strange, I reused the ephemeral flag for that, which
- is never used in the VyOS 1.x context anyway.
- *)
-tag_node:
- | comment = comments;
- name = IDENTIFIER; tag = value; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
- {
- 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)
- }
-
-node_content: n = node { n } | n = leaf_node { n } | n = tag_node { n };
-
-%public config:
- | ns = list(node); EOF
- {
- 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)
- }
-;