1#ifndef PARSER_DECORATED_ABSTRACT_SYNTAX_TREE_H
2#define PARSER_DECORATED_ABSTRACT_SYNTAX_TREE_H
4#include "downward/cli/plugins/plugin.h"
6#include "downward/utils/logging.h"
17namespace downward::cli::parser {
21class ConstructContext :
public utils::Context {
22 std::unordered_map<std::string, std::any> variables;
25 void set_variable(
const std::string& name,
const std::any& value);
26 void remove_variable(
const std::string& name);
27 bool has_variable(
const std::string& name)
const;
28 std::any get_variable(
const std::string& name)
const;
31class DecoratedASTNode {
33 virtual ~DecoratedASTNode() =
default;
34 std::any construct()
const;
35 virtual std::any construct(ConstructContext& context)
const = 0;
36 virtual void dump(std::string indent =
"+")
const = 0;
40 virtual std::unique_ptr<DecoratedASTNode> clone()
const = 0;
41 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const = 0;
43using DecoratedASTNodePtr = std::unique_ptr<DecoratedASTNode>;
46 ConstructContext context;
47 DecoratedASTNodePtr node;
48 std::any construct_any()
const;
51 LazyValue(
const DecoratedASTNode& node,
const ConstructContext& context);
52 LazyValue(
const LazyValue& other);
57 std::any constructed = construct_any();
58 return plugins::OptionsAnyCaster<T>::cast(constructed);
61 std::vector<LazyValue> construct_lazy_list();
64class FunctionArgument {
66 DecoratedASTNodePtr value;
70 bool lazy_construction;
74 const std::string& key,
75 DecoratedASTNodePtr value,
76 bool lazy_construction);
78 std::string get_key()
const;
79 const DecoratedASTNode& get_value()
const;
80 void dump(
const std::string& indent)
const;
84 bool is_lazily_constructed()
const;
85 FunctionArgument(
const FunctionArgument& other);
88class DecoratedLetNode :
public DecoratedASTNode {
89 std::string variable_name;
90 DecoratedASTNodePtr variable_definition;
91 DecoratedASTNodePtr nested_value;
95 const std::string& variable_name,
96 DecoratedASTNodePtr variable_definition,
97 DecoratedASTNodePtr nested_value);
99 std::any construct(ConstructContext& context)
const override;
100 void dump(std::string indent)
const override;
104 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
105 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
106 DecoratedLetNode(
const DecoratedLetNode& other);
109class DecoratedFunctionCallNode :
public DecoratedASTNode {
110 std::shared_ptr<const plugins::Feature> feature;
111 std::vector<FunctionArgument> arguments;
112 std::string unparsed_config;
115 DecoratedFunctionCallNode(
116 const std::shared_ptr<const plugins::Feature>& feature,
117 std::vector<FunctionArgument>&& arguments,
118 const std::string& unparsed_config);
120 std::any construct(ConstructContext& context)
const override;
121 void dump(std::string indent)
const override;
125 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
126 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
127 DecoratedFunctionCallNode(
const DecoratedFunctionCallNode& other);
130class DecoratedListNode :
public DecoratedASTNode {
131 std::vector<DecoratedASTNodePtr> elements;
134 DecoratedListNode(std::vector<DecoratedASTNodePtr>&& elements);
136 std::any construct(ConstructContext& context)
const override;
137 void dump(std::string indent)
const override;
141 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
142 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
143 DecoratedListNode(
const DecoratedListNode& other);
144 const std::vector<DecoratedASTNodePtr>& get_elements()
const
150class VariableNode :
public DecoratedASTNode {
154 VariableNode(
const std::string& name);
156 std::any construct(ConstructContext& context)
const override;
157 void dump(std::string indent)
const override;
161 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
162 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
163 VariableNode(
const VariableNode& other);
166class BoolLiteralNode :
public DecoratedASTNode {
170 BoolLiteralNode(
const std::string& value);
172 std::any construct(ConstructContext& context)
const override;
173 void dump(std::string indent)
const override;
177 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
178 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
179 BoolLiteralNode(
const BoolLiteralNode& other);
182class StringLiteralNode :
public DecoratedASTNode {
186 StringLiteralNode(
const std::string& value);
188 std::any construct(ConstructContext& context)
const override;
189 void dump(std::string indent)
const override;
193 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
194 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
195 StringLiteralNode(
const StringLiteralNode& other);
198class IntLiteralNode :
public DecoratedASTNode {
202 IntLiteralNode(
const std::string& value);
204 std::any construct(ConstructContext& context)
const override;
205 void dump(std::string indent)
const override;
209 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
210 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
211 IntLiteralNode(
const IntLiteralNode& other);
214class FloatLiteralNode :
public DecoratedASTNode {
218 FloatLiteralNode(
const std::string& value);
220 std::any construct(ConstructContext& context)
const override;
221 void dump(std::string indent)
const override;
225 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
226 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
227 FloatLiteralNode(
const FloatLiteralNode& other);
230class SymbolNode :
public DecoratedASTNode {
234 SymbolNode(
const std::string& value);
236 std::any construct(ConstructContext& context)
const override;
237 void dump(std::string indent)
const override;
241 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
242 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
243 SymbolNode(
const SymbolNode& other);
246class ConvertNode :
public DecoratedASTNode {
247 DecoratedASTNodePtr value;
248 const plugins::Type& from_type;
249 const plugins::Type& to_type;
253 DecoratedASTNodePtr value,
254 const plugins::Type& from_type,
255 const plugins::Type& to_type);
257 std::any construct(ConstructContext& context)
const override;
258 void dump(std::string indent)
const override;
262 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
263 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
264 ConvertNode(
const ConvertNode& other);
267class CheckBoundsNode :
public DecoratedASTNode {
268 DecoratedASTNodePtr value;
269 DecoratedASTNodePtr min_value;
270 DecoratedASTNodePtr max_value;
274 DecoratedASTNodePtr value,
275 DecoratedASTNodePtr min_value,
276 DecoratedASTNodePtr max_value);
278 std::any construct(ConstructContext& context)
const override;
279 void dump(std::string indent)
const override;
283 virtual std::unique_ptr<DecoratedASTNode> clone()
const override;
284 virtual std::shared_ptr<DecoratedASTNode> clone_shared()
const override;
285 CheckBoundsNode(
const CheckBoundsNode& other);