1#ifndef INCLUDE_INJA_NODE_HPP_
2#define INCLUDE_INJA_NODE_HPP_
7#include <nlohmann/json.hpp>
9#include "function_storage.hpp"
10#include "string_view.hpp"
22class ExpressionListNode;
24class ForStatementNode;
25class ForArrayStatementNode;
26class ForObjectStatementNode;
28class IncludeStatementNode;
29class ExtendsStatementNode;
30class BlockStatementNode;
31class SetStatementNode;
38 virtual void visit(
const BlockNode& node) = 0;
39 virtual void visit(
const TextNode& node) = 0;
42 virtual void visit(
const JsonNode& node) = 0;
65 AstNode(
size_t pos) : pos(pos) { }
72 std::vector<std::shared_ptr<AstNode>> nodes;
85 explicit TextNode(
size_t pos,
size_t length):
AstNode(pos), length(length) { }
103 const nlohmann::json value;
114 const std::string name;
115 const json::json_pointer ptr;
117 static std::string convert_dot_to_json_ptr(nonstd::string_view ptr_name) {
120 nonstd::string_view part;
121 std::tie(part, ptr_name) = string_view::split(ptr_name,
'.');
122 result.push_back(
'/');
123 result.append(part.begin(), part.end());
124 }
while (!ptr_name.empty());
128 explicit JsonNode(nonstd::string_view ptr_name,
size_t pos) :
ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_json_ptr(ptr_name))) { }
136 using Op = FunctionStorage::Operation;
139 enum class Associativity {
144 unsigned int precedence;
145 Associativity associativity;
151 std::vector<std::shared_ptr<ExpressionNode>> arguments;
152 CallbackFunction callback;
154 explicit FunctionNode(nonstd::string_view name,
size_t pos) :
ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
160 associativity = Associativity::Left;
165 associativity = Associativity::Left;
170 associativity = Associativity::Left;
175 associativity = Associativity::Left;
180 associativity = Associativity::Left;
185 associativity = Associativity::Left;
190 associativity = Associativity::Left;
192 case Op::GreaterEqual: {
195 associativity = Associativity::Left;
200 associativity = Associativity::Left;
202 case Op::LessEqual: {
205 associativity = Associativity::Left;
210 associativity = Associativity::Left;
215 associativity = Associativity::Left;
217 case Op::Multiplication: {
220 associativity = Associativity::Left;
225 associativity = Associativity::Left;
230 associativity = Associativity::Right;
235 associativity = Associativity::Left;
240 associativity = Associativity::Left;
244 associativity = Associativity::Left;
256 std::shared_ptr<ExpressionNode> root;
286 const std::string value;
297 const std::string key;
298 const std::string value;
314 const bool is_nested;
315 bool has_false_statement {
false};
327 const std::string file;
338 const std::string file;
349 const std::string name;
362 const std::string key;
Base node class for the abstract syntax tree (AST).
Definition: node.hpp:59