47 virtual void print(
int indent = 0)
const = 0;
66 void print(
int indent = 0)
const override
82 TypeNode(std::string n,
bool ptr =
false, std::vector<int> dims = {})
86 void print(
int indent = 0)
const override
88 std::cout << std::format(
"{:>{}}Type: {}\n",
"", indent,
name);
91 std::cout << std::format(
"{:>{}}ArrayDim: {}\n",
"", indent + 2, dim);
103 void print(
int indent = 0)
const override
105 std::cout << std::format(
"{:>{}}Number: {}\n",
"", indent,
value);
116 void print(
int indent = 0)
const override
119 std::cout << std::format(
"{:>{}}String: {}\n",
"", indent,
value);
130 void print(
int indent = 0)
const override
132 std::cout << std::format(
"{:>{}}Identifier: {}\n",
"", indent,
name);
143 void print(
int indent = 0)
const override
145 std::cout << std::format(
"{:>{}}Boolean: {}\n",
"", indent,
value);
152 void print(
int indent = 0)
const override
154 std::cout << std::string(indent,
' ') <<
"Null\n";
202 void print(
int indent = 0)
const override
204 std::cout << std::string(indent,
' ') <<
"PostfixExpr: ";
228 void print(
int indent = 0)
const override
230 std::cout << std::string(indent,
' ') <<
"UnaryExpr: ";
253 std::unique_ptr<Expression>
left;
262 void print(
int indent = 0)
const override
264 std::cout << std::string(indent,
' ') <<
"BinaryExpr: ";
307 left->print(indent + 2);
308 right->print(indent + 2);
319 :
array(std::move(arr)),
index(std::move(idx))
323 void print(
int indent = 0)
const override
325 std::cout << std::string(indent,
' ') <<
"ArrayAccess:\n";
326 array->print(indent + 2);
327 std::cout << std::string(indent + 2,
' ') <<
"Index:\n";
328 index->print(indent + 4);
339 void print(
int indent = 0)
const override
341 std::cout << std::string(indent,
' ') <<
"ArrayLiteral:\n";
344 elem->print(indent + 2);
359 void print(
int indent = 0)
const override
361 std::cout << std::string(indent,
' ') <<
"MemberAccess: ." <<
member <<
"\n";
362 object->print(indent + 2);
372 CallExpr(std::string name, std::vector<std::unique_ptr<Expression>> args)
377 void print(
int indent = 0)
const override
379 std::cout << std::string(indent,
' ') <<
"CallExpr: " <<
callee <<
"\n";
382 arg->print(indent + 2);
398 void print(
int indent = 0)
const override
400 std::cout << std::string(indent,
' ') <<
"AssignmentExpr:\n";
401 std::cout << std::string(indent + 2,
' ') <<
"Target:\n";
402 target->print(indent + 4);
403 std::cout << std::string(indent + 2,
' ') <<
"Value:\n";
404 value->print(indent + 4);
416 void print(
int indent = 0)
const override
418 std::cout << std::string(indent,
' ') <<
"VarDecl: " <<
name <<
"\n";
433 void print(
int indent = 0)
const override
446 void print(
int indent = 0)
const override
448 std::cout << std::string(indent,
' ') <<
"PrintStmt:\n";
460 void print(
int indent = 0)
const override
462 std::cout << std::format(
"{:>{}}IncludeStmt: {}\n",
"", indent,
modulePath.string());
473 void print(
int indent = 0)
const override
475 std::cout << std::string(indent,
' ') <<
"ImportStmt: " <<
modulePath <<
"\n";
486 void print(
int indent = 0)
const override
488 std::cout << std::string(indent,
' ') <<
"ExportStmt:\n";
500 void print(
int indent = 0)
const override
502 std::cout << std::string(indent,
' ') <<
"BlockStmt:\n";
505 stmt->print(indent + 2);
517 void print(
int indent = 0)
const override
519 std::cout << std::string(indent,
' ') <<
"ReturnStmt:\n";
522 value->print(indent + 2);
530 void print(
int indent = 0)
const override
532 std::cout << std::string(indent,
' ') <<
"BreakStmt\n";
539 void print(
int indent = 0)
const override
541 std::cout << std::string(indent,
' ') <<
"ContinueStmt\n";
552 IfStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> thenB, std::unique_ptr<Statement> elseB)
557 void print(
int indent = 0)
const override
559 std::cout << std::string(indent,
' ') <<
"IfStmt:\n";
564 std::cout << std::string(indent,
' ') <<
"Else:\n";
574 std::unique_ptr<Statement>
body;
576 WhileStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> b)
581 void print(
int indent = 0)
const override
583 std::cout << std::string(indent,
' ') <<
"WhileStmt:\n";
585 body->print(indent + 2);
595 std::unique_ptr<Statement>
body;
597 ForStmt(std::unique_ptr<Statement> init, std::unique_ptr<Expression> cond, std::unique_ptr<Expression> incr,
598 std::unique_ptr<Statement> b)
603 void print(
int indent = 0)
const override
605 std::cout << std::string(indent,
' ') <<
"ForStmt:\n";
618 body->print(indent + 2);
629 void print(
int indent = 0)
const override
631 std::cout << std::string(indent,
' ') <<
"UnsafeBlockStmt:\n";
632 block->print(indent + 2);
643 std::unique_ptr<TypeNode>
type;
647 std::unique_ptr<BlockStmt>
body;
649 FunctionDecl(std::string n, std::vector<Param> p, std::unique_ptr<TypeNode> rt, std::unique_ptr<BlockStmt> b)
654 void print(
int indent = 0)
const override
656 std::cout << std::string(indent,
' ') <<
"FunctionDecl: " <<
name <<
"\n";
657 for (
const auto ¶m :
params)
659 std::cout << std::string(indent + 2,
' ') <<
"Param: " << param.name <<
" Type: ";
660 param.type->print(0);
662 std::cout << std::string(indent + 2,
' ') <<
"Return Type: ";
669 std::cout <<
"void\n";
673 body->print(indent + 2);
682 std::unique_ptr<TypeNode>
type;
699 void print(
int indent = 0)
const override
701 std::cout << std::string(indent,
' ') <<
"StructDecl: " <<
name <<
"\n";
702 for (
const auto &field :
fields)
704 std::cout << std::string(indent + 2,
' ') << field.name <<
": ";
705 field.type->print(0);
714 std::vector<std::pair<std::string, std::unique_ptr<Expression>>>
fieldValues;
716 StructInstanceExpr(std::string name, std::vector<std::pair<std::string, std::unique_ptr<Expression>>> fields)
721 void print(
int indent = 0)
const override
723 std::cout << std::string(indent,
' ') <<
"StructInstance: " <<
structName <<
"\n";
726 std::cout << std::string(indent + 2,
' ') << field.first <<
":\n";
727 field.second->print(indent + 4);
743 void print(
int indent = 0)
const override
745 std::cout << std::string(indent,
' ') <<
"FieldAccess: ." <<
fieldName <<
"\n";
746 object->print(indent + 2);
756 CaseClause(std::unique_ptr<Expression> v, std::vector<std::unique_ptr<Statement>> stmts)
765 std::unique_ptr<Expression>
expr;
769 SwitchStmt(std::unique_ptr<Expression> e, std::vector<CaseClause> c, std::vector<std::unique_ptr<Statement>> d)
774 void print(
int indent = 0)
const override
776 std::cout << std::string(indent,
' ') <<
"SwitchStmt:\n";
777 expr->print(indent + 2);
778 for (
const auto &c :
cases)
780 std::cout << std::string(indent + 2,
' ') <<
"case:\n";
781 c.value->print(indent + 4);
782 for (
const auto &stmt : c.statements)
784 stmt->print(indent + 4);
789 std::cout << std::string(indent + 2,
' ') <<
"default:\n";
792 stmt->print(indent + 4);
Abstract Syntax Tree (AST) namespace.
UnaryOp
Unary operator types.
BinaryOp
Binary operator types.
PostfixOp
Postfix operator types.
The Phasor Programming Language and Runtime.
TokenType
Token types for the lexer.
ArrayAccessExpr(std::unique_ptr< Expression > arr, std::unique_ptr< Expression > idx)
std::unique_ptr< Expression > array
void print(int indent=0) const override
std::unique_ptr< Expression > index
void print(int indent=0) const override
std::vector< std::unique_ptr< Expression > > elements
ArrayLiteralExpr(std::vector< std::unique_ptr< Expression > > elems)
AssignmentExpr(std::unique_ptr< Expression > t, std::unique_ptr< Expression > v)
std::unique_ptr< Expression > target
std::unique_ptr< Expression > value
void print(int indent=0) const override
std::unique_ptr< Expression > right
BinaryExpr(std::unique_ptr< Expression > l, BinaryOp o, std::unique_ptr< Expression > r)
std::unique_ptr< Expression > left
void print(int indent=0) const override
std::vector< std::unique_ptr< Statement > > statements
void print(int indent=0) const override
BlockStmt(std::vector< std::unique_ptr< Statement > > stmts)
void print(int indent=0) const override
void print(int indent=0) const override
CallExpr(std::string name, std::vector< std::unique_ptr< Expression > > args)
std::vector< std::unique_ptr< Expression > > arguments
void print(int indent=0) const override
CaseClause(std::unique_ptr< Expression > v, std::vector< std::unique_ptr< Statement > > stmts)
std::vector< std::unique_ptr< Statement > > statements
std::unique_ptr< Expression > value
void print(int indent=0) const override
ExportStmt(std::unique_ptr< Statement > decl)
void print(int indent=0) const override
std::unique_ptr< Statement > declaration
std::unique_ptr< Expression > expression
ExpressionStmt(std::unique_ptr< Expression > expr)
void print(int indent=0) const override
FieldAccessExpr(std::unique_ptr< Expression > obj, std::string field)
void print(int indent=0) const override
std::unique_ptr< Expression > object
std::unique_ptr< Statement > initializer
std::unique_ptr< Expression > increment
void print(int indent=0) const override
std::unique_ptr< Statement > body
ForStmt(std::unique_ptr< Statement > init, std::unique_ptr< Expression > cond, std::unique_ptr< Expression > incr, std::unique_ptr< Statement > b)
std::unique_ptr< Expression > condition
std::unique_ptr< TypeNode > type
FunctionDecl(std::string n, std::vector< Param > p, std::unique_ptr< TypeNode > rt, std::unique_ptr< BlockStmt > b)
std::unique_ptr< TypeNode > returnType
void print(int indent=0) const override
std::vector< Param > params
std::unique_ptr< BlockStmt > body
IdentifierExpr(std::string n)
void print(int indent=0) const override
void print(int indent=0) const override
std::unique_ptr< Statement > elseBranch
std::unique_ptr< Expression > condition
IfStmt(std::unique_ptr< Expression > cond, std::unique_ptr< Statement > thenB, std::unique_ptr< Statement > elseB)
std::unique_ptr< Statement > thenBranch
ImportStmt(std::string path)
void print(int indent=0) const override
std::filesystem::path modulePath
IncludeStmt(std::filesystem::path path)
void print(int indent=0) const override
std::unique_ptr< Expression > object
void print(int indent=0) const override
MemberAccessExpr(std::unique_ptr< Expression > obj, std::string mem)
virtual void print(int indent=0) const =0
void print(int indent=0) const override
NumberExpr(std::string v)
void print(int indent=0) const override
PostfixExpr(PostfixOp o, std::unique_ptr< Expression > expr)
std::unique_ptr< Expression > operand
void print(int indent=0) const override
std::unique_ptr< Expression > expression
void print(int indent=0) const override
PrintStmt(std::unique_ptr< Expression > expr)
std::vector< std::unique_ptr< Statement > > statements
void print(int indent=0) const override
ReturnStmt(std::unique_ptr< Expression > val)
std::unique_ptr< Expression > value
void print(int indent=0) const override
void print(int indent=0) const override
StringExpr(std::string v)
void print(int indent=0) const override
std::vector< StructField > fields
StructDecl(std::string n, std::vector< StructField > f)
StructField(std::string n, std::unique_ptr< TypeNode > t)
std::unique_ptr< TypeNode > type
StructInstanceExpr(std::string name, std::vector< std::pair< std::string, std::unique_ptr< Expression > > > fields)
std::vector< std::pair< std::string, std::unique_ptr< Expression > > > fieldValues
void print(int indent=0) const override
SwitchStmt(std::unique_ptr< Expression > e, std::vector< CaseClause > c, std::vector< std::unique_ptr< Statement > > d)
void print(int indent=0) const override
std::vector< CaseClause > cases
std::vector< std::unique_ptr< Statement > > defaultStmts
std::unique_ptr< Expression > expr
TypeNode(std::string n, bool ptr=false, std::vector< int > dims={})
void print(int indent=0) const override
std::vector< int > arrayDimensions
UnaryExpr(UnaryOp o, std::unique_ptr< Expression > expr)
std::unique_ptr< Expression > operand
void print(int indent=0) const override
UnsafeBlockStmt(std::unique_ptr< BlockStmt > b)
void print(int indent=0) const override
std::unique_ptr< BlockStmt > block
void print(int indent=0) const override
VarDecl(std::string n, std::unique_ptr< Expression > init)
std::unique_ptr< Expression > initializer
WhileStmt(std::unique_ptr< Expression > cond, std::unique_ptr< Statement > b)
std::unique_ptr< Expression > condition
std::unique_ptr< Statement > body
void print(int indent=0) const override