AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
abstract_syntax_tree.h
1#ifndef PARSER_ABSTRACT_SYNTAX_TREE_H
2#define PARSER_ABSTRACT_SYNTAX_TREE_H
3
4#include "decorated_abstract_syntax_tree.h"
5#include "token_stream.h"
6
7#include <cassert>
8#include <memory>
9#include <string>
10#include <typeindex>
11#include <unordered_map>
12#include <vector>
13
14namespace plugins {
15struct ArgumentInfo;
16class Type;
17} // namespace plugins
18
19namespace downward::cli::parser {
20class DecorateContext;
21
22class ASTNode {
23public:
24 virtual ~ASTNode() = default;
25
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;
30};
31using ASTNodePtr = std::unique_ptr<ASTNode>;
32
33class LetNode : public ASTNode {
34 std::string variable_name;
35 ASTNodePtr variable_definition;
36 ASTNodePtr nested_value;
37
38public:
39 LetNode(
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;
46};
47
48class FunctionCallNode : public ASTNode {
49 std::string name;
50 std::vector<ASTNodePtr> positional_arguments;
51 std::unordered_map<std::string, ASTNodePtr> keyword_arguments;
52 std::string unparsed_config;
53
54 using CollectedArguments =
55 std::unordered_map<std::string, FunctionArgument>;
56 bool collect_argument(
57 const ASTNode& arg,
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;
73
74public:
75 FunctionCallNode(
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;
83};
84
85class ListNode : public ASTNode {
86 std::vector<ASTNodePtr> elements;
87
88public:
89 explicit ListNode(std::vector<ASTNodePtr>&& elements);
90 DecoratedASTNodePtr decorate(DecorateContext& context) const override;
91 void dump(std::string indent) const override;
92 const plugins::Type*
93 get_common_element_type(DecorateContext& context) const;
94 const plugins::Type& get_type(DecorateContext& context) const override;
95};
96
97class LiteralNode : public ASTNode {
98 Token value;
99
100public:
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;
105};
106} // namespace downward::cli::parser
107#endif