1#ifndef PARSER_ABSTRACT_SYNTAX_TREE_H
2#define PARSER_ABSTRACT_SYNTAX_TREE_H
4#include "decorated_abstract_syntax_tree.h"
5#include "token_stream.h"
11#include <unordered_map>
19namespace downward::cli::parser {
24 virtual ~ASTNode() =
default;
26 DecoratedASTNodePtr decorate()
const;
27 virtual DecoratedASTNodePtr decorate(DecorateContext& context)
const = 0;
28 virtual void dump(std::string indent =
"+")
const = 0;
29 virtual const plugins::Type& get_type(DecorateContext& context)
const = 0;
31using ASTNodePtr = std::unique_ptr<ASTNode>;
33class LetNode :
public ASTNode {
34 std::string variable_name;
35 ASTNodePtr variable_definition;
36 ASTNodePtr nested_value;
40 const std::string& variable_name,
41 ASTNodePtr variable_definition,
42 ASTNodePtr nested_value);
43 DecoratedASTNodePtr decorate(DecorateContext& context)
const override;
44 void dump(std::string indent)
const override;
45 const plugins::Type& get_type(DecorateContext& context)
const override;
48class FunctionCallNode :
public ASTNode {
50 std::vector<ASTNodePtr> positional_arguments;
51 std::unordered_map<std::string, ASTNodePtr> keyword_arguments;
52 std::string unparsed_config;
54 using CollectedArguments =
55 std::unordered_map<std::string, FunctionArgument>;
56 bool collect_argument(
58 const plugins::ArgumentInfo& arg_info,
59 DecorateContext& context,
60 CollectedArguments& arguments)
const;
61 void collect_keyword_arguments(
62 const std::vector<plugins::ArgumentInfo>& argument_infos,
63 DecorateContext& context,
64 CollectedArguments& arguments)
const;
65 void collect_positional_arguments(
66 const std::vector<plugins::ArgumentInfo>& argument_infos,
67 DecorateContext& context,
68 CollectedArguments& arguments)
const;
69 void collect_default_values(
70 const std::vector<plugins::ArgumentInfo>& argument_infos,
71 DecorateContext& context,
72 CollectedArguments& arguments)
const;
76 const std::string& name,
77 std::vector<ASTNodePtr>&& positional_arguments,
78 std::unordered_map<std::string, ASTNodePtr>&& keyword_arguments,
79 const std::string& unparsed_config);
80 DecoratedASTNodePtr decorate(DecorateContext& context)
const override;
81 void dump(std::string indent)
const override;
82 const plugins::Type& get_type(DecorateContext& context)
const override;
85class ListNode :
public ASTNode {
86 std::vector<ASTNodePtr> elements;
89 explicit ListNode(std::vector<ASTNodePtr>&& elements);
90 DecoratedASTNodePtr decorate(DecorateContext& context)
const override;
91 void dump(std::string indent)
const override;
93 get_common_element_type(DecorateContext& context)
const;
94 const plugins::Type& get_type(DecorateContext& context)
const override;
97class LiteralNode :
public ASTNode {
101 explicit LiteralNode(
const Token& value);
102 DecoratedASTNodePtr decorate(DecorateContext& context)
const override;
103 void dump(std::string indent)
const override;
104 const plugins::Type& get_type(DecorateContext& context)
const override;