blob: ab410c89442b1b22e8591e0ca0b11db696a7f44e [file] [log] [blame]
Václav Kubernát0a2a2e82018-05-11 13:59:12 +02001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
3 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
4 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8
9#pragma once
10
Václav Kubernát24df80e2018-06-06 15:18:03 +020011#include "ast_commands.hpp"
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020012#include "ast_handlers.hpp"
13
Václav Kubernát60d6f292018-05-25 09:45:32 +020014
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020015x3::rule<keyValue_class, keyValue_> const keyValue = "keyValue";
16x3::rule<identifier_class, std::string> const identifier = "identifier";
17x3::rule<listPrefix_class, std::string> const listPrefix = "listPrefix";
18x3::rule<listSuffix_class, std::vector<keyValue_>> const listSuffix = "listSuffix";
19x3::rule<listElement_class, listElement_> const listElement = "listElement";
Václav Kubernát60d6f292018-05-25 09:45:32 +020020x3::rule<nodeup_class, nodeup_> const nodeup = "nodeup";
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020021x3::rule<container_class, container_> const container = "container";
Václav Kubernát07204242018-06-04 18:12:09 +020022x3::rule<leaf_class, leaf_> const leaf = "leaf";
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020023x3::rule<path_class, path_> const path = "path";
Václav Kubernát07204242018-06-04 18:12:09 +020024x3::rule<data_string_class, std::string> const data_string = "data_string";
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020025x3::rule<cd_class, cd_> const cd = "cd";
Václav Kubernát07204242018-06-04 18:12:09 +020026x3::rule<set_class, set_> const set = "set";
Václav Kubernátb61336d2018-05-28 17:35:03 +020027x3::rule<create_class, create_> const create = "create";
28x3::rule<delete_class, delete_> const delete_rule = "delete_rule";
29x3::rule<command_class, command_> const command = "command";
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020030
Václav Kubernát41378452018-06-06 16:29:40 +020031#if __clang__
32#pragma GCC diagnostic push
33#pragma GCC diagnostic ignored "-Woverloaded-shift-op-parentheses"
34#endif
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020035
36auto const keyValue_def =
Václav Kubernát41378452018-06-06 16:29:40 +020037 lexeme[+alnum > '=' > +alnum];
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020038
39auto const identifier_def =
40 lexeme[
41 ((alpha | char_("_")) >> *(alnum | char_("_") | char_("-") | char_(".")))
42 ];
43
44auto const listPrefix_def =
45 identifier >> '[';
46
Václav Kubernát7e4e82f2018-05-14 20:04:58 +020047// even though we don't allow no keys to be supplied, the star allows me to check which keys are missing
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020048auto const listSuffix_def =
Václav Kubernát7e4e82f2018-05-14 20:04:58 +020049 *keyValue > ']';
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020050
51auto const listElement_def =
52 listPrefix > listSuffix;
53
Václav Kubernát60d6f292018-05-25 09:45:32 +020054auto const nodeup_def =
55 lit("..") > x3::attr(nodeup_());
56
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020057auto const container_def =
58 identifier;
59
Václav Kubernát07204242018-06-04 18:12:09 +020060auto const leaf_def =
61 identifier;
62
63// leaf cannot be in the middle of a path, however, I need the grammar's attribute to be a vector of variants
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020064auto const path_def =
Václav Kubernát41378452018-06-06 16:29:40 +020065 (x3::expect[container | listElement | nodeup | leaf]) % '/';
Václav Kubernát07204242018-06-04 18:12:09 +020066
67auto const data_string_def =
68 lexeme[+char_];
69
70auto const space_separator =
71 x3::omit[x3::no_skip[space]];
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020072
73auto const cd_def =
Václav Kubernát41378452018-06-06 16:29:40 +020074 lit("cd") >> space_separator > path;
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020075
Václav Kubernátb61336d2018-05-28 17:35:03 +020076auto const create_def =
Václav Kubernát41378452018-06-06 16:29:40 +020077 lit("create") >> space_separator > path;
Václav Kubernátb61336d2018-05-28 17:35:03 +020078
79auto const delete_rule_def =
Václav Kubernát41378452018-06-06 16:29:40 +020080 lit("delete") >> space_separator > path;
Václav Kubernát07204242018-06-04 18:12:09 +020081
82auto const set_def =
Václav Kubernát41378452018-06-06 16:29:40 +020083 lit("set") >> space_separator > path > data_string;
Václav Kubernátb61336d2018-05-28 17:35:03 +020084
85auto const command_def =
Václav Kubernát41378452018-06-06 16:29:40 +020086 x3::expect[cd | create | delete_rule | set] >> x3::eoi;
87
88#if __clang__
89#pragma GCC diagnostic pop
90#endif
Václav Kubernátb61336d2018-05-28 17:35:03 +020091
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020092BOOST_SPIRIT_DEFINE(keyValue)
93BOOST_SPIRIT_DEFINE(identifier)
94BOOST_SPIRIT_DEFINE(listPrefix)
95BOOST_SPIRIT_DEFINE(listSuffix)
96BOOST_SPIRIT_DEFINE(listElement)
Václav Kubernát60d6f292018-05-25 09:45:32 +020097BOOST_SPIRIT_DEFINE(nodeup)
Václav Kubernát0a2a2e82018-05-11 13:59:12 +020098BOOST_SPIRIT_DEFINE(container)
Václav Kubernát07204242018-06-04 18:12:09 +020099BOOST_SPIRIT_DEFINE(leaf)
Václav Kubernát0a2a2e82018-05-11 13:59:12 +0200100BOOST_SPIRIT_DEFINE(path)
Václav Kubernát07204242018-06-04 18:12:09 +0200101BOOST_SPIRIT_DEFINE(data_string)
102BOOST_SPIRIT_DEFINE(set)
Václav Kubernát0a2a2e82018-05-11 13:59:12 +0200103BOOST_SPIRIT_DEFINE(cd)
Václav Kubernátb61336d2018-05-28 17:35:03 +0200104BOOST_SPIRIT_DEFINE(create)
105BOOST_SPIRIT_DEFINE(delete_rule)
106BOOST_SPIRIT_DEFINE(command)