Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F117520259
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/parser/vyos1x_parser.mly b/parser/vyos1x_parser.mly
index 80ed4df76..17f4909c3 100644
--- a/parser/vyos1x_parser.mly
+++ b/parser/vyos1x_parser.mly
@@ -1,110 +1,111 @@
%{
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 |> String.trim) }
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
+ | ns = list(node_content); 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)
}
;
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Sep 26, 9:38 AM (1 d, 8 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4284814
Default Alt Text
(4 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment