MXVM 1.8.1
Virtual Machine, Compiler, and Pascal Frontend
Loading...
Searching...
No Matches
ast.hpp
Go to the documentation of this file.
1
6#ifndef __AST_HPP_X_
7#define __AST_HPP_X_
8
9#include "mxvm/instruct.hpp"
10#include <memory>
11#include <string>
12#include <vector>
13
14namespace mxvm {
15
16 class ASTVisitor;
17
19 class ASTNode {
20 public:
21 virtual ~ASTNode() = default;
22 virtual void accept(ASTVisitor &visitor) = 0;
23 virtual std::string toString() const = 0;
24 };
25
27 class SectionNode : public ASTNode {
28 public:
37 std::vector<std::unique_ptr<ASTNode>> statements;
38
39 SectionNode(SectionType sectionType) : type(sectionType) {}
40
41 void addStatement(std::unique_ptr<ASTNode> stmt) {
42 statements.push_back(std::move(stmt));
43 }
44
45 void accept(ASTVisitor &visitor) override;
46 std::string toString() const override;
47 };
48
50 class ProgramNode : public ASTNode {
51 public:
52 std::string name;
53 bool object = false;
54 std::string root_name;
55 std::vector<std::unique_ptr<SectionNode>> sections;
56 std::vector<std::unique_ptr<ProgramNode>> inlineObjects;
57
58 void addSection(std::unique_ptr<SectionNode> section) {
59 sections.push_back(std::move(section));
60 }
61
62 void addInlineObject(std::unique_ptr<ProgramNode> obj) {
63 inlineObjects.push_back(std::move(obj));
64 }
65
66 virtual void accept(ASTVisitor &visitor) override;
67 virtual std::string toString() const override;
68 };
69
71 class VariableNode : public ASTNode {
72 public:
73 std::string name;
75 std::string initialValue;
77 size_t buffer_size = 0;
78 bool is_global = false;
79 std::string object;
80
81 VariableNode(VarType varType, const std::string &varName)
82 : name(varName), type(varType), hasInitializer(false), buffer_size(0) {}
83
84 VariableNode(VarType varType, const std::string &varName, size_t buf_size)
85 : name(varName), type(varType), hasInitializer(false), buffer_size(buf_size) {}
86
87 VariableNode(VarType varType, const std::string &varName, const std::string &value)
88 : name(varName), type(varType), initialValue(value), hasInitializer(true), buffer_size(0) {}
89
90 void accept(ASTVisitor &visitor) override;
91 std::string toString() const override;
92 };
93
95 class ModuleNode : public ASTNode {
96 public:
97 std::string name;
98 ModuleNode(const std::string &n) : name(n) {}
99 void accept(ASTVisitor &visitor) override;
100 std::string toString() const override;
101 };
102
104 class ObjectNode : public ASTNode {
105 public:
106 std::string name;
107 ObjectNode(const std::string &o) : name(o) {}
108 void accept(ASTVisitor &visitor) override;
109 std::string toString() const override;
110 };
111
113 class InstructionNode : public ASTNode {
114 public:
116 std::vector<Operand> operands;
117
119
120 InstructionNode(Inc inst, const std::vector<Operand> &ops)
121 : instruction(inst), operands(ops) {}
122
123 void addOperand(const Operand &operand) {
124 operands.push_back(operand);
125 }
126
127 void accept(ASTVisitor &visitor) override;
128 std::string toString() const override;
129 };
130
132 class LabelNode : public ASTNode {
133 public:
134 std::string name;
135 bool function = false;
136 LabelNode(const std::string &labelName) : name(labelName) {}
137
138 void accept(ASTVisitor &visitor) override;
139 std::string toString() const override;
140 };
141
143 class ExpressionNode : public ASTNode {
144 public:
145 std::string value;
147
148 ExpressionNode(const std::string &val, bool numeric = false)
149 : value(val), isNumeric(numeric) {}
150
151 void accept(ASTVisitor &visitor) override;
152 std::string toString() const override;
153 };
154
156 class CommentNode : public ASTNode {
157 public:
158 std::string text;
159 CommentNode(const std::string &commentText) : text(commentText) {}
160
161 void accept(ASTVisitor &visitor) override;
162 std::string toString() const override;
163 };
164
167 public:
168 virtual ~ASTVisitor() = default;
169 virtual void visit(ProgramNode &node) = 0;
170 virtual void visit(SectionNode &node) = 0;
171 virtual void visit(InstructionNode &node) = 0;
172 virtual void visit(LabelNode &node) = 0;
173 virtual void visit(VariableNode &node) = 0;
174 virtual void visit(ExpressionNode &node) = 0;
175 virtual void visit(CommentNode &node) = 0;
176 virtual void visit(ModuleNode &node) = 0;
177 virtual void visit(ObjectNode &node) = 0;
178 };
179} // namespace mxvm
180
181#endif
Abstract base class for all AST nodes.
Definition ast.hpp:19
virtual std::string toString() const =0
virtual void accept(ASTVisitor &visitor)=0
virtual ~ASTNode()=default
Visitor interface for traversing the AST node hierarchy.
Definition ast.hpp:166
virtual void visit(ExpressionNode &node)=0
virtual ~ASTVisitor()=default
virtual void visit(VariableNode &node)=0
virtual void visit(ProgramNode &node)=0
virtual void visit(InstructionNode &node)=0
virtual void visit(ObjectNode &node)=0
virtual void visit(ModuleNode &node)=0
virtual void visit(LabelNode &node)=0
virtual void visit(SectionNode &node)=0
virtual void visit(CommentNode &node)=0
AST node for a source-level comment.
Definition ast.hpp:156
void accept(ASTVisitor &visitor) override
Definition ast.cpp:103
std::string toString() const override
Definition ast.cpp:107
std::string text
Definition ast.hpp:158
CommentNode(const std::string &commentText)
Definition ast.hpp:159
AST node for a literal expression value.
Definition ast.hpp:143
std::string toString() const override
Definition ast.cpp:99
std::string value
Definition ast.hpp:145
void accept(ASTVisitor &visitor) override
Definition ast.cpp:95
ExpressionNode(const std::string &val, bool numeric=false)
Definition ast.hpp:148
AST node representing a single MXVM instruction with its operands.
Definition ast.hpp:113
InstructionNode(Inc inst, const std::vector< Operand > &ops)
Definition ast.hpp:120
InstructionNode(Inc inst)
Definition ast.hpp:118
void accept(ASTVisitor &visitor) override
Definition ast.cpp:41
std::string toString() const override
Definition ast.cpp:45
std::vector< Operand > operands
Definition ast.hpp:116
void addOperand(const Operand &operand)
Definition ast.hpp:123
Inc instruction
instruction opcode
Definition ast.hpp:115
AST node for a label (or function entry point) in the code section.
Definition ast.hpp:132
std::string toString() const override
Definition ast.cpp:91
std::string name
Definition ast.hpp:134
void accept(ASTVisitor &visitor) override
Definition ast.cpp:87
bool function
true if this label marks a callable function
Definition ast.hpp:135
LabelNode(const std::string &labelName)
Definition ast.hpp:136
AST node for a module import declaration.
Definition ast.hpp:95
ModuleNode(const std::string &n)
Definition ast.hpp:98
void accept(ASTVisitor &visitor) override
Definition ast.cpp:67
std::string toString() const override
Definition ast.cpp:71
std::string name
Definition ast.hpp:97
AST node for an object import declaration.
Definition ast.hpp:104
std::string toString() const override
Definition ast.cpp:81
ObjectNode(const std::string &o)
Definition ast.hpp:107
void accept(ASTVisitor &visitor) override
Definition ast.cpp:77
std::string name
Definition ast.hpp:106
Root AST node representing an entire program or object.
Definition ast.hpp:50
virtual std::string toString() const override
Definition ast.cpp:16
std::vector< std::unique_ptr< SectionNode > > sections
Definition ast.hpp:55
void addInlineObject(std::unique_ptr< ProgramNode > obj)
Definition ast.hpp:62
std::string root_name
Definition ast.hpp:54
void addSection(std::unique_ptr< SectionNode > section)
Definition ast.hpp:58
std::vector< std::unique_ptr< ProgramNode > > inlineObjects
Definition ast.hpp:56
virtual void accept(ASTVisitor &visitor) override
Definition ast.cpp:12
std::string name
Definition ast.hpp:52
Represents a program section (.data, .code, .module, .object).
Definition ast.hpp:27
void accept(ASTVisitor &visitor) override
Definition ast.cpp:27
void addStatement(std::unique_ptr< ASTNode > stmt)
Definition ast.hpp:41
std::vector< std::unique_ptr< ASTNode > > statements
Definition ast.hpp:37
SectionType
Section type discriminator.
Definition ast.hpp:30
std::string toString() const override
Definition ast.cpp:31
SectionNode(SectionType sectionType)
Definition ast.hpp:39
SectionType type
Definition ast.hpp:36
AST node for a variable declaration in a .data section.
Definition ast.hpp:71
bool hasInitializer
Definition ast.hpp:76
std::string toString() const override
Definition ast.cpp:58
VariableNode(VarType varType, const std::string &varName, const std::string &value)
Definition ast.hpp:87
size_t buffer_size
buffer allocation size (for pointer/array types)
Definition ast.hpp:77
void accept(ASTVisitor &visitor) override
Definition ast.cpp:54
std::string name
Definition ast.hpp:73
VariableNode(VarType varType, const std::string &varName, size_t buf_size)
Definition ast.hpp:84
std::string object
owning object name, if any
Definition ast.hpp:79
VariableNode(VarType varType, const std::string &varName)
Definition ast.hpp:81
VarType type
Definition ast.hpp:74
std::string initialValue
Definition ast.hpp:75
Instruction set enum, operand/instruction structs, variable types, and Variable/Variable_Value defini...
Inc
MXVM instruction set opcodes.
Definition instruct.hpp:21
Definition ast.hpp:14
VarType
MXVM variable type discriminator.
Definition instruct.hpp:180
A single instruction operand (constant value or variable reference).
Definition instruct.hpp:159