MXVM 1.8.1
Virtual Machine, Compiler, and Pascal Frontend
Loading...
Searching...
No Matches
ast.cpp
Go to the documentation of this file.
1
6#include "ast.hpp"
7#include <sstream>
8
9namespace pascal {
10
11 BlockNode::BlockNode(std::vector<std::unique_ptr<ASTNode>> decls, std::unique_ptr<CompoundStmtNode> stmt)
12 : declarations(std::move(decls)), compoundStatement(std::move(stmt)) {}
13
14 ProgramNode::ProgramNode(const std::string &p_name, std::unique_ptr<BlockNode> blk)
15 : name(p_name), block(std::move(blk)) {}
16
17 void ASTNode::print(std::ostream &out, int indent) const {
18 for (int i = 0; i < indent; ++i)
19 out << " ";
20 out << toString() << std::endl;
21 }
22
24 visitor.visit(*this);
25 }
26
27 std::string ProgramNode::toString() const {
28 return "Program: " + name;
29 }
30
32 visitor.visit(*this);
33 }
34
35 std::string UnitNode::toString() const {
36 return "Unit: " + name;
37 }
38
40 visitor.visit(*this);
41 }
42
43 std::string BlockNode::toString() const {
44 return "Block with " + std::to_string(declarations.size()) + " declarations";
45 }
46
48 visitor.visit(*this);
49 }
50
51 std::string VarDeclNode::toString() const {
52 std::ostringstream oss;
53 oss << "VarDecl: ";
54 for (size_t i = 0; i < identifiers.size(); ++i) {
55 if (i > 0)
56 oss << ", ";
57 oss << identifiers[i];
58 }
59 oss << " : ";
60 std::visit([&oss](const auto &t) {
61 using T = std::decay_t<decltype(t)>;
62 if constexpr (std::is_same_v<T, std::string>) {
63 oss << t;
64 } else if constexpr (std::is_same_v<T, std::unique_ptr<ASTNode>>) {
65 if (t)
66 oss << t->toString();
67 else
68 oss << "<null>";
69 }
70 },
71 type);
72 return oss.str();
73 }
74
76 visitor.visit(*this);
77 }
78
79 std::string ProcDeclNode::toString() const {
80 return "ProcDecl: " + name + " (" + std::to_string(parameters.size()) + " params)";
81 }
82
84 visitor.visit(*this);
85 }
86
87 std::string FuncDeclNode::toString() const {
88 return "FuncDecl: " + name + " -> " + returnType;
89 }
90
92 visitor.visit(*this);
93 }
94
95 std::string ParameterNode::toString() const {
96 std::ostringstream oss;
97 oss << "Param: ";
98 if (isVar)
99 oss << "var ";
100 for (size_t i = 0; i < identifiers.size(); ++i) {
101 if (i > 0)
102 oss << ", ";
103 oss << identifiers[i];
104 }
105 oss << " : " << type;
106 return oss.str();
107 }
108
110 visitor.visit(*this);
111 }
112
113 std::string CompoundStmtNode::toString() const {
114 return "CompoundStmt: " + std::to_string(statements.size()) + " statements";
115 }
116
118 visitor.visit(*this);
119 }
120
121 std::string AssignmentNode::toString() const {
122 return "Assignment";
123 }
124
126 visitor.visit(*this);
127 }
128
129 std::string IfStmtNode::toString() const {
130 std::string s;
131 if (elseStatement != nullptr) {
132 s = "with else";
133 }
134 return "IfStmt " + s;
135 }
136
138 visitor.visit(*this);
139 }
140
141 std::string WhileStmtNode::toString() const {
142 return "WhileStmt";
143 }
144
146 visitor.visit(*this);
147 }
148
149 std::string ForStmtNode::toString() const {
150 return "ForStmt: " + variable + (isDownto ? " downto" : " to");
151 }
152
154 visitor.visit(*this);
155 }
156
158 visitor.visit(*this);
159 }
160
161 std::string ProcCallNode::toString() const {
162 return "ProcCall: " + name + " (" + std::to_string(arguments.size()) + " args)";
163 }
164
166 visitor.visit(*this);
167 }
168
169 std::string BinaryOpNode::toString() const {
170 return "BinaryOp: " + opToString(operator_);
171 }
172
174 switch (op) {
175 case PLUS:
176 return "+";
177 case MINUS:
178 return "-";
179 case MULTIPLY:
180 return "*";
181 case DIVIDE:
182 return "/";
183 case DIV:
184 return "div";
185 case MOD:
186 return "mod";
187 case EQUAL:
188 return "=";
189 case NOT_EQUAL:
190 return "<>";
191 case LESS:
192 return "<";
193 case LESS_EQUAL:
194 return "<=";
195 case GREATER:
196 return ">";
197 case GREATER_EQUAL:
198 return ">=";
199 case AND:
200 return "and";
201 case OR:
202 return "or";
203 case IN:
204 return "in";
205 default:
206 return "unknown";
207 }
208 }
209
211 visitor.visit(*this);
212 }
213
214 std::string UnaryOpNode::toString() const {
215 return "UnaryOp: " + opToString(operator_);
216 }
217
219 switch (op) {
220 case PLUS:
221 return "+";
222 case MINUS:
223 return "-";
224 case NOT:
225 return "not";
226 default:
227 return "unknown";
228 }
229 }
230
232 visitor.visit(*this);
233 }
234
235 std::string FuncCallNode::toString() const {
236 return "FuncCall: " + name + " (" + std::to_string(arguments.size()) + " args)";
237 }
238
240 visitor.visit(*this);
241 }
242
243 std::string VariableNode::toString() const {
244 return "Variable: " + name;
245 }
246
248 visitor.visit(*this);
249 }
250
251 std::string NumberNode::toString() const {
252 return "Number: " + value + (isInteger ? " (int)" : " (real)");
253 }
254
256 visitor.visit(*this);
257 }
258
259 std::string StringNode::toString() const {
260 return "String: \"" + value + "\"";
261 }
262
264 visitor.visit(*this);
265 }
266
267 std::string BooleanNode::toString() const {
268 std::string s;
269 if (value) {
270 s = "true";
271 } else {
272 s = "false";
273 }
274 return "Boolean: " + s;
275 }
276
278 visitor.visit(*this);
279 }
280
281 std::string EmptyStmtNode::toString() const {
282 return "EmptyStmt";
283 }
284
286 visitor.visit(*this);
287 }
288
289 std::string ConstDeclNode::toString() const {
290 return "ConstDecl";
291 }
292
294 visitor.visit(*this);
295 }
296
297 std::string CaseStmtNode::toString() const {
298 return "CaseStmt: " + std::to_string(branches.size()) + " branches";
299 }
300
302 visitor.visit(*this);
303 }
304
305 std::string ArrayTypeNode::toString() const {
306 std::string elemTypeStr = "unknown";
307 if (elementType) {
308 elemTypeStr = elementType->toString();
309 }
310
311 std::string lowerStr = "?";
312 if (lowerBound) {
313 lowerStr = lowerBound->toString();
314 }
315
316 std::string upperStr = "?";
317 if (upperBound) {
318 upperStr = upperBound->toString();
319 }
320
321 return "ArrayType: " + elemTypeStr + "[" + lowerStr + ".." + upperStr + "]";
322 }
323
324 std::string ExitNode::toString() const { return "exit"; }
325
327 visitor.visit(*this);
328 }
329
330 std::string ArrayDeclarationNode::toString() const {
331 return "ArrayDecl: " + name + " of " + arrayType->toString();
332 }
333
335 visitor.visit(*this);
336 }
337
338 std::string ArrayAccessNode::toString() const {
339 return "ArrayAccess: ";
340 }
341
343 visitor.visit(*this);
344 }
345
346 std::string ArrayAssignmentNode::toString() const {
347 return "ArrayAssignment: " + arrayName + "[" + index->toString() + "] := " + value->toString();
348 }
349
350 RecordTypeNode::RecordTypeNode(std::vector<std::unique_ptr<ASTNode>> fields)
351 : fields(std::move(fields)) {}
352
353 void RecordTypeNode::accept(ASTVisitor &visitor) { visitor.visit(*this); }
354
355 std::string RecordTypeNode::toString() const { return "RecordType"; }
356
357 RecordDeclarationNode::RecordDeclarationNode(const std::string &name, std::unique_ptr<RecordTypeNode> recordType)
358 : name(name), recordType(std::move(recordType)) {}
359
360 void RecordDeclarationNode::accept(ASTVisitor &visitor) { visitor.visit(*this); }
361
362 std::string RecordDeclarationNode::toString() const { return "RecordDeclaration: " + name; }
363
364 FieldAccessNode::FieldAccessNode(std::unique_ptr<ASTNode> recordExpr, const std::string &fieldName)
365 : recordExpr(std::move(recordExpr)), fieldName(fieldName) {}
366
367 void FieldAccessNode::accept(ASTVisitor &visitor) { visitor.visit(*this); }
368
369 std::string FieldAccessNode::toString() const { return "FieldAccess: " + fieldName; }
370
372 visitor.visit(*this);
373 }
374
376 visitor.visit(*this);
377 }
378
379 std::string TypeDeclNode::toString() const {
380 std::string result = "TypeDeclNode(";
381 for (const auto &decl : typeDeclarations) {
382 result += decl->toString() + ", ";
383 }
384 if (!typeDeclarations.empty())
385 result.pop_back(), result.pop_back();
386 result += ")";
387 return result;
388 }
389
390 std::string TypeAliasNode::toString() const {
391 return "TypeAliasNode(" + typeName + " = " + baseType + ")";
392 }
393
395 visitor.visit(*this);
396 }
397
399 return name;
400 }
401
403 visitor.visit(*this);
404 }
405
407 visitor.visit(*this);
408 }
409
411 visitor.visit(*this);
412 }
413
414 std::string ContinueNode::toString() const {
415 return "Continue Node";
416 }
417
419 visitor.visit(*this);
420 }
421
422 std::string BreakNode::toString() const {
423 return "Continue Node";
424 }
425
427 visitor.visit(*this);
428 }
429
431 visitor.visit(*this);
432 }
433
435 visitor.visit(*this);
436 }
437
439 visitor.visit(*this);
440 }
441
443 visitor.visit(*this);
444 }
445
447 visitor.visit(*this);
448 }
449
451 visitor.visit(*this);
452 }
453
455 visitor.visit(*this);
456 }
457
459 visitor.visit(*this);
460 }
461
463 visitor.visit(*this);
464 }
465
466} // namespace pascal
virtual std::string toString() const =0
Return a human-readable description of this node.
virtual void print(std::ostream &out, int indent=0) const
Pretty-print this node to a stream with indentation.
Definition ast.cpp:17
Abstract visitor interface for the AST (double-dispatch).
Definition ast.hpp:741
virtual void visit(ProgramNode &node)=0
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:438
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:334
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:338
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:342
std::string arrayName
array variable name
Definition ast.hpp:336
std::unique_ptr< ASTNode > index
index expression
Definition ast.hpp:337
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:346
std::unique_ptr< ASTNode > value
value expression
Definition ast.hpp:338
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:326
std::string name
array variable name
Definition ast.hpp:294
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:330
std::unique_ptr< ArrayTypeNode > arrayType
array type (bounds + element)
Definition ast.hpp:295
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:398
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:394
std::string name
type name
Definition ast.hpp:310
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:301
std::unique_ptr< ASTNode > lowerBound
lower index bound expression
Definition ast.hpp:278
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:305
std::unique_ptr< ASTNode > upperBound
upper index bound expression
Definition ast.hpp:279
std::unique_ptr< ASTNode > elementType
element type node
Definition ast.hpp:277
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:121
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:117
OpType operator_
operator kind
Definition ast.hpp:460
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:165
static std::string opToString(OpType op)
Convert an OpType to its string representation.
Definition ast.cpp:173
OpType
Binary operator kinds.
Definition ast.hpp:441
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:169
std::unique_ptr< CompoundStmtNode > compoundStatement
the begin..end compound statement
Definition ast.hpp:82
std::vector< std::unique_ptr< ASTNode > > declarations
variable / type / const / procedure / function declarations
Definition ast.hpp:81
BlockNode(std::vector< std::unique_ptr< ASTNode > > decls, std::unique_ptr< CompoundStmtNode > stmt)
Construct a block node.
Definition ast.cpp:11
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:43
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:39
bool value
the boolean value
Definition ast.hpp:551
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:267
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:263
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:422
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:418
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:297
std::vector< std::unique_ptr< CaseBranch > > branches
case branches
Definition ast.hpp:412
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:293
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:109
std::vector< std::unique_ptr< ASTNode > > statements
ordered list of statements
Definition ast.hpp:239
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:113
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:289
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:285
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:410
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:414
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:277
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:281
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:462
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:324
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:402
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:367
std::string fieldName
name of the accessed field
Definition ast.hpp:729
FieldAccessNode(std::unique_ptr< ASTNode > recordExpr, const std::string &fieldName)
Definition ast.cpp:364
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:369
std::unique_ptr< ASTNode > recordExpr
expression yielding a record
Definition ast.hpp:728
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:149
std::string variable
loop variable name
Definition ast.hpp:381
bool isDownto
true if downto, false if to
Definition ast.hpp:384
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:145
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:231
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:235
std::vector< std::unique_ptr< ASTNode > > arguments
actual arguments
Definition ast.hpp:503
std::string name
function name
Definition ast.hpp:502
std::string returnType
return type name
Definition ast.hpp:198
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:83
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:87
std::string name
function name
Definition ast.hpp:196
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:446
std::unique_ptr< ASTNode > elseStatement
optional else branch
Definition ast.hpp:354
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:125
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:129
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:450
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:426
bool isInteger
true if integer literal
Definition ast.hpp:527
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:251
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:247
std::string value
textual representation of the number
Definition ast.hpp:526
std::string type
parameter type name
Definition ast.hpp:226
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:95
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:91
std::vector< std::string > identifiers
parameter names
Definition ast.hpp:225
bool isVar
true if passed by reference (var parameter)
Definition ast.hpp:227
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:434
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:430
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:161
std::vector< std::unique_ptr< ASTNode > > arguments
actual arguments
Definition ast.hpp:428
std::string name
procedure name
Definition ast.hpp:427
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:157
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:79
std::vector< std::unique_ptr< ASTNode > > parameters
formal parameters
Definition ast.hpp:212
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:75
std::string name
procedure name
Definition ast.hpp:211
ProgramNode(const std::string &name, std::unique_ptr< BlockNode > blk)
Definition ast.cpp:14
std::string name
program identifier
Definition ast.hpp:100
std::unique_ptr< BlockNode > block
the program body
Definition ast.hpp:101
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:23
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:27
RecordDeclarationNode(const std::string &name, std::unique_ptr< RecordTypeNode > recordType)
Definition ast.cpp:357
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:362
std::string name
record type name
Definition ast.hpp:660
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:360
std::unique_ptr< RecordTypeNode > recordType
the record body
Definition ast.hpp:661
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:353
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:355
std::vector< std::unique_ptr< ASTNode > > fields
fixed field declarations
Definition ast.hpp:648
RecordTypeNode(std::vector< std::unique_ptr< ASTNode > > fields)
Definition ast.cpp:350
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:153
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:454
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:458
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:406
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:255
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:259
std::string value
the string contents (without quotes)
Definition ast.hpp:540
std::string typeName
the new type name
Definition ast.hpp:163
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:390
std::string baseType
the existing type being aliased
Definition ast.hpp:164
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:375
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:379
std::vector< std::unique_ptr< ASTNode > > typeDeclarations
list of individual type declarations
Definition ast.hpp:151
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:371
static std::string opToString(Operator op)
Convert a unary Operator to its string representation.
Definition ast.cpp:218
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:210
Operator operator_
the unary operator
Definition ast.hpp:486
Operator
Unary operator kinds.
Definition ast.hpp:480
@ NOT
logical not
Definition ast.hpp:483
@ MINUS
unary -
Definition ast.hpp:482
@ PLUS
unary +
Definition ast.hpp:481
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:214
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:31
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:35
std::string name
unit identifier
Definition ast.hpp:118
std::vector< std::string > identifiers
declared variable names
Definition ast.hpp:134
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:51
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:47
std::variant< std::string, std::unique_ptr< ASTNode > > type
type (simple name or complex type node)
Definition ast.hpp:135
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:243
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:239
std::string name
variable name
Definition ast.hpp:515
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:137
std::string toString() const override
Return a human-readable description of this node.
Definition ast.cpp:141
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Definition ast.cpp:442
Definition ast.cpp:9
AST node hierarchy for the Pascal-to-MXVM frontend parser.