18 for (
int i = 0; i < indent; ++i)
28 return "Program: " +
name;
36 return "Unit: " +
name;
44 return "Block with " + std::to_string(
declarations.size()) +
" declarations";
52 std::ostringstream 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>) {
64 }
else if constexpr (std::is_same_v<T, std::unique_ptr<ASTNode>>) {
80 return "ProcDecl: " +
name +
" (" + std::to_string(
parameters.size()) +
" params)";
96 std::ostringstream oss;
105 oss <<
" : " <<
type;
110 visitor.
visit(*
this);
114 return "CompoundStmt: " + std::to_string(
statements.size()) +
" statements";
118 visitor.
visit(*
this);
126 visitor.
visit(*
this);
134 return "IfStmt " + s;
138 visitor.
visit(*
this);
146 visitor.
visit(*
this);
154 visitor.
visit(*
this);
158 visitor.
visit(*
this);
162 return "ProcCall: " +
name +
" (" + std::to_string(
arguments.size()) +
" args)";
166 visitor.
visit(*
this);
211 visitor.
visit(*
this);
232 visitor.
visit(*
this);
236 return "FuncCall: " +
name +
" (" + std::to_string(
arguments.size()) +
" args)";
240 visitor.
visit(*
this);
244 return "Variable: " +
name;
248 visitor.
visit(*
this);
256 visitor.
visit(*
this);
260 return "String: \"" +
value +
"\"";
264 visitor.
visit(*
this);
274 return "Boolean: " + s;
278 visitor.
visit(*
this);
286 visitor.
visit(*
this);
294 visitor.
visit(*
this);
298 return "CaseStmt: " + std::to_string(
branches.size()) +
" branches";
302 visitor.
visit(*
this);
306 std::string elemTypeStr =
"unknown";
311 std::string lowerStr =
"?";
316 std::string upperStr =
"?";
321 return "ArrayType: " + elemTypeStr +
"[" + lowerStr +
".." + upperStr +
"]";
327 visitor.
visit(*
this);
331 return "ArrayDecl: " +
name +
" of " +
arrayType->toString();
335 visitor.
visit(*
this);
339 return "ArrayAccess: ";
343 visitor.
visit(*
this);
347 return "ArrayAssignment: " +
arrayName +
"[" +
index->toString() +
"] := " +
value->toString();
372 visitor.
visit(*
this);
376 visitor.
visit(*
this);
380 std::string result =
"TypeDeclNode(";
382 result += decl->toString() +
", ";
385 result.pop_back(), result.pop_back();
395 visitor.
visit(*
this);
403 visitor.
visit(*
this);
407 visitor.
visit(*
this);
411 visitor.
visit(*
this);
415 return "Continue Node";
419 visitor.
visit(*
this);
423 return "Continue Node";
427 visitor.
visit(*
this);
431 visitor.
visit(*
this);
435 visitor.
visit(*
this);
439 visitor.
visit(*
this);
443 visitor.
visit(*
this);
447 visitor.
visit(*
this);
451 visitor.
visit(*
this);
455 visitor.
visit(*
this);
459 visitor.
visit(*
this);
463 visitor.
visit(*
this);
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.
Abstract visitor interface for the AST (double-dispatch).
virtual void visit(ProgramNode &node)=0
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string arrayName
array variable name
std::unique_ptr< ASTNode > index
index expression
std::string toString() const override
Return a human-readable description of this node.
std::unique_ptr< ASTNode > value
value expression
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string name
array variable name
std::string toString() const override
Return a human-readable description of this node.
std::unique_ptr< ArrayTypeNode > arrayType
array type (bounds + element)
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string name
type name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::unique_ptr< ASTNode > lowerBound
lower index bound expression
std::string toString() const override
Return a human-readable description of this node.
std::unique_ptr< ASTNode > upperBound
upper index bound expression
std::unique_ptr< ASTNode > elementType
element type node
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
OpType operator_
operator kind
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
static std::string opToString(OpType op)
Convert an OpType to its string representation.
OpType
Binary operator kinds.
std::string toString() const override
Return a human-readable description of this node.
std::unique_ptr< CompoundStmtNode > compoundStatement
the begin..end compound statement
std::vector< std::unique_ptr< ASTNode > > declarations
variable / type / const / procedure / function declarations
BlockNode(std::vector< std::unique_ptr< ASTNode > > decls, std::unique_ptr< CompoundStmtNode > stmt)
Construct a block node.
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
bool value
the boolean value
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< CaseBranch > > branches
case branches
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::vector< std::unique_ptr< ASTNode > > statements
ordered list of statements
std::string toString() const override
Return a human-readable description of this node.
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string fieldName
name of the accessed field
FieldAccessNode(std::unique_ptr< ASTNode > recordExpr, const std::string &fieldName)
std::string toString() const override
Return a human-readable description of this node.
std::unique_ptr< ASTNode > recordExpr
expression yielding a record
std::string toString() const override
Return a human-readable description of this node.
std::string variable
loop variable name
bool isDownto
true if downto, false if to
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< ASTNode > > arguments
actual arguments
std::string name
function name
std::string returnType
return type name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::string name
function name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::unique_ptr< ASTNode > elseStatement
optional else branch
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
bool isInteger
true if integer literal
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string value
textual representation of the number
std::string type
parameter type name
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::vector< std::string > identifiers
parameter names
bool isVar
true if passed by reference (var parameter)
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< ASTNode > > arguments
actual arguments
std::string name
procedure name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< ASTNode > > parameters
formal parameters
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string name
procedure name
ProgramNode(const std::string &name, std::unique_ptr< BlockNode > blk)
std::string name
program identifier
std::unique_ptr< BlockNode > block
the program body
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
RecordDeclarationNode(const std::string &name, std::unique_ptr< RecordTypeNode > recordType)
std::string toString() const override
Return a human-readable description of this node.
std::string name
record type name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::unique_ptr< RecordTypeNode > recordType
the record body
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< ASTNode > > fields
fixed field declarations
RecordTypeNode(std::vector< std::unique_ptr< ASTNode > > fields)
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::string value
the string contents (without quotes)
std::string typeName
the new type name
std::string toString() const override
Return a human-readable description of this node.
std::string baseType
the existing type being aliased
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::vector< std::unique_ptr< ASTNode > > typeDeclarations
list of individual type declarations
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
static std::string opToString(Operator op)
Convert a unary Operator to its string representation.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
Operator operator_
the unary operator
Operator
Unary operator kinds.
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
std::string name
unit identifier
std::vector< std::string > identifiers
declared variable names
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::variant< std::string, std::unique_ptr< ASTNode > > type
type (simple name or complex type node)
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string name
variable name
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
std::string toString() const override
Return a human-readable description of this node.
void accept(ASTVisitor &visitor) override
Accept an ASTVisitor (double-dispatch).
AST node hierarchy for the Pascal-to-MXVM frontend parser.