summaryrefslogtreecommitdiff
path: root/src/curly_parser.mly
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2017-01-13 23:48:56 +0700
committerDaniil Baturin <daniil@baturin.org>2017-01-13 23:48:56 +0700
commit621d7bb43a9bb2c0941f91c7c3a5aa082aa87e1b (patch)
tree4f7eafda2c04c61e59640c1dd1f951cccef6b125 /src/curly_parser.mly
parent3de4790370ec8ee485c3f723c3471116dd094019 (diff)
downloadvyconf-621d7bb43a9bb2c0941f91c7c3a5aa082aa87e1b.tar.gz
vyconf-621d7bb43a9bb2c0941f91c7c3a5aa082aa87e1b.zip
T249: add support for inactive and ephemeral nodes to the curly config parser.
Diffstat (limited to 'src/curly_parser.mly')
-rw-r--r--src/curly_parser.mly31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/curly_parser.mly b/src/curly_parser.mly
index 7daa082..560d84c 100644
--- a/src/curly_parser.mly
+++ b/src/curly_parser.mly
@@ -25,6 +25,8 @@
%token <string> IDENTIFIER
%token <string> STRING
%token <string> COMMENT
+%token INACTIVE
+%token EPHEMERAL
%token LEFT_BRACE
%token RIGHT_BRACE
%token LEFT_BRACKET
@@ -35,9 +37,22 @@
%start <Config_tree.t> config
%%
+(* Shift-reduce conflicts are reduced to shift by default,
+ so it should be fine *)
opt_comment:
| (* empty *) { None }
| c = COMMENT { Some (String.trim c) }
+;
+
+opt_inactive:
+ | (* empty *) { false }
+ | INACTIVE { true }
+;
+
+opt_ephemeral:
+ | (* empty *) { false }
+ | EPHEMERAL { true }
+;
value:
| v = STRING
@@ -53,16 +68,16 @@ values:
;
leaf_node:
- | comment = opt_comment; name = IDENTIFIER; values = values; SEMI
- { Vytree.make_full {default_data with values=(List.rev values); comment=comment} name []}
- | comment = opt_comment; name = IDENTIFIER; SEMI (* valueless node *)
- { Vytree.make_full {default_data with comment=comment} name [] }
+ | comment = opt_comment; inactive = opt_inactive; ephemeral = opt_ephemeral; name = IDENTIFIER; values = values; SEMI
+ { Vytree.make_full {values=(List.rev values); comment=comment; inactive=inactive; ephemeral=ephemeral} name []}
+ | comment = opt_comment; inactive = opt_inactive; ephemeral = opt_ephemeral; name = IDENTIFIER; SEMI (* valueless node *)
+ { Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} name [] }
;
node:
- | comment = opt_comment; name = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
+ | comment = opt_comment; inactive = opt_inactive; ephemeral = opt_ephemeral; name = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
{
- let node = Vytree.make_full {default_data with comment=comment} name [] in
+ let node = Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} 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);
@@ -74,10 +89,10 @@ node:
;
tag_node:
- | comment = opt_comment; name = IDENTIFIER; tag = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
+ | comment = opt_comment; inactive = opt_inactive; ephemeral = opt_ephemeral; name = IDENTIFIER; tag = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
{
let outer_node = Vytree.make_full default_data name [] in
- let inner_node = Vytree.make_full {default_data with comment=comment} tag [] in
+ let inner_node = Vytree.make_full {default_data with comment=comment; inactive=inactive; ephemeral=ephemeral} 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