summaryrefslogtreecommitdiff
path: root/src/curly_parser.mly
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2017-01-05 00:55:22 +0700
committerDaniil Baturin <daniil@baturin.org>2017-01-05 00:55:22 +0700
commit321d1548d46138afdb458c4646eb32ef8683d05b (patch)
tree85baed4c181e1424a2606e6ce8d4d6524d3350e8 /src/curly_parser.mly
parent1710c38d8a174698e5c68d876c8afb8dd91c2d4f (diff)
downloadvyconf-321d1548d46138afdb458c4646eb32ef8683d05b.tar.gz
vyconf-321d1548d46138afdb458c4646eb32ef8683d05b.zip
Initial implementation of the curly config parser.
Diffstat (limited to 'src/curly_parser.mly')
-rw-r--r--src/curly_parser.mly52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/curly_parser.mly b/src/curly_parser.mly
new file mode 100644
index 0000000..0053b56
--- /dev/null
+++ b/src/curly_parser.mly
@@ -0,0 +1,52 @@
+%{
+ open Config_tree
+%}
+
+%token <string> IDENTIFIER
+%token <string> STRING
+%token <string> COMMENT
+%token LEFT_BRACE
+%token RIGHT_BRACE
+%token LEFT_BRACKET
+%token RIGHT_BRACKET
+%token SEMI
+%token EOF
+
+%start <Config_tree.t> config
+%%
+
+opt_comment:
+ | (* empty *) { None }
+ | c = COMMENT { Some c }
+
+value:
+ | v = STRING
+ { v }
+ | v = IDENTIFIER
+ { v }
+;
+
+values:
+ | v = value { [v] }
+ | LEFT_BRACKET; vs = separated_nonempty_list(SEMI, value); RIGHT_BRACKET
+ { vs }
+;
+
+leaf_node:
+ | comment = opt_comment; name = IDENTIFIER; values = values; SEMI
+ { Vytree.make_full {default_data with values=values; comment=comment} name []}
+;
+
+node:
+ | comment = opt_comment; name = IDENTIFIER; LEFT_BRACE; children = list(node_content); RIGHT_BRACE
+ { let node = Vytree.make_full {default_data with comment=comment} name [] in List.fold_left Vytree.adopt node children }
+;
+
+node_content: n = node { n } | n = leaf_node { n };
+
+%public config:
+ ns = list(node); EOF
+ {
+ let root = make "root" in List.fold_left Vytree.adopt root ns
+ }
+;