46 virtual void print(
int indent = 0)
const = 0;
65 void print(
int indent = 0)
const override
81 TypeNode(std::string n,
bool ptr =
false, std::vector<int> dims = {})
85 void print(
int indent = 0)
const override
87 std::cout << std::format(
"{:>{}}Type: {}\n",
"", indent,
name);
90 std::cout << std::format(
"{:>{}}ArrayDim: {}\n",
"", indent + 2, dim);
102 void print(
int indent = 0)
const override
104 std::cout << std::format(
"{:>{}}Number: {}\n",
"", indent,
value);
115 void print(
int indent = 0)
const override
118 std::cout << std::format(
"{:>{}}String: {}\n",
"", indent,
value);
129 void print(
int indent = 0)
const override
131 std::cout << std::format(
"{:>{}}Identifier: {}\n",
"", indent,
name);
142 void print(
int indent = 0)
const override
144 std::cout << std::format(
"{:>{}}Boolean: {}\n",
"", indent,
value);
151 void print(
int indent = 0)
const override
153 std::cout << std::string(indent,
' ') <<
"Null\n";
201 void print(
int indent = 0)
const override
203 std::cout << std::string(indent,
' ') <<
"PostfixExpr: ";
227 void print(
int indent = 0)
const override
229 std::cout << std::string(indent,
' ') <<
"UnaryExpr: ";
252 std::unique_ptr<Expression>
left;
261 void print(
int indent = 0)
const override
263 std::cout << std::string(indent,
' ') <<
"BinaryExpr: ";
306 left->print(indent + 2);
307 right->print(indent + 2);
318 :
array(std::move(arr)),
index(std::move(idx))
322 void print(
int indent = 0)
const override
324 std::cout << std::string(indent,
' ') <<
"ArrayAccess:\n";
325 array->print(indent + 2);
326 std::cout << std::string(indent + 2,
' ') <<
"Index:\n";
327 index->print(indent + 4);
338 void print(
int indent = 0)
const override
340 std::cout << std::string(indent,
' ') <<
"ArrayLiteral:\n";
342 elem->print(indent + 2);
356 void print(
int indent = 0)
const override
358 std::cout << std::string(indent,
' ') <<
"MemberAccess: ." <<
member <<
"\n";
359 object->print(indent + 2);
373 void print(
int indent = 0)
const override
375 std::cout << std::string(indent,
' ') <<
"CallExpr: " <<
callee <<
"\n";
378 arg->print(indent + 2);
394 void print(
int indent = 0)
const override
396 std::cout << std::string(indent,
' ') <<
"AssignmentExpr:\n";
397 std::cout << std::string(indent + 2,
' ') <<
"Target:\n";
398 target->print(indent + 4);
399 std::cout << std::string(indent + 2,
' ') <<
"Value:\n";
400 value->print(indent + 4);
412 void print(
int indent = 0)
const override
414 std::cout << std::string(indent,
' ') <<
"VarDecl: " <<
name <<
"\n";
427 void print(
int indent = 0)
const override
440 void print(
int indent = 0)
const override
442 std::cout << std::string(indent,
' ') <<
"PrintStmt:\n";
454 void print(
int indent = 0)
const override
456 std::cout << std::format(
"{:>{}}IncludeStmt: {}\n",
"", indent,
modulePath.string());
467 void print(
int indent = 0)
const override
469 std::cout << std::string(indent,
' ') <<
"ImportStmt: " <<
modulePath <<
"\n";
480 void print(
int indent = 0)
const override
482 std::cout << std::string(indent,
' ') <<
"ExportStmt:\n";
494 void print(
int indent = 0)
const override
496 std::cout << std::string(indent,
' ') <<
"BlockStmt:\n";
499 stmt->print(indent + 2);
511 void print(
int indent = 0)
const override
513 std::cout << std::string(indent,
' ') <<
"ReturnStmt:\n";
515 value->print(indent + 2);
522 void print(
int indent = 0)
const override
524 std::cout << std::string(indent,
' ') <<
"BreakStmt\n";
531 void print(
int indent = 0)
const override
533 std::cout << std::string(indent,
' ') <<
"ContinueStmt\n";
544 IfStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> thenB, std::unique_ptr<Statement> elseB)
549 void print(
int indent = 0)
const override
551 std::cout << std::string(indent,
' ') <<
"IfStmt:\n";
556 std::cout << std::string(indent,
' ') <<
"Else:\n";
566 std::unique_ptr<Statement>
body;
568 WhileStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> b)
573 void print(
int indent = 0)
const override
575 std::cout << std::string(indent,
' ') <<
"WhileStmt:\n";
577 body->print(indent + 2);
587 std::unique_ptr<Statement>
body;
589 ForStmt(std::unique_ptr<Statement> init, std::unique_ptr<Expression> cond, std::unique_ptr<Expression> incr,
590 std::unique_ptr<Statement> b)
595 void print(
int indent = 0)
const override
597 std::cout << std::string(indent,
' ') <<
"ForStmt:\n";
604 body->print(indent + 2);
615 void print(
int indent = 0)
const override
617 std::cout << std::string(indent,
' ') <<
"UnsafeBlockStmt:\n";
618 block->print(indent + 2);
629 std::unique_ptr<TypeNode>
type;
633 std::unique_ptr<BlockStmt>
body;
635 FunctionDecl(std::string n, std::vector<Param> p, std::unique_ptr<TypeNode> rt, std::unique_ptr<BlockStmt> b)
640 void print(
int indent = 0)
const override
642 std::cout << std::string(indent,
' ') <<
"FunctionDecl: " <<
name <<
"\n";
643 for (
const auto ¶m :
params)
645 std::cout << std::string(indent + 2,
' ') <<
"Param: " << param.name <<
" Type: ";
646 param.type->print(0);
648 std::cout << std::string(indent + 2,
' ') <<
"Return Type: ";
652 std::cout <<
"void\n";
654 body->print(indent + 2);
662 std::unique_ptr<TypeNode>
type;
679 void print(
int indent = 0)
const override
681 std::cout << std::string(indent,
' ') <<
"StructDecl: " <<
name <<
"\n";
682 for (
const auto &field :
fields)
684 std::cout << std::string(indent + 2,
' ') << field.name <<
": ";
685 field.type->print(0);
694 std::vector<std::pair<std::string, std::unique_ptr<Expression>>>
fieldValues;
696 StructInstanceExpr(std::string name, std::vector<std::pair<std::string, std::unique_ptr<Expression>>> fields)
701 void print(
int indent = 0)
const override
703 std::cout << std::string(indent,
' ') <<
"StructInstance: " <<
structName <<
"\n";
706 std::cout << std::string(indent + 2,
' ') << field.first <<
":\n";
707 field.second->print(indent + 4);
723 void print(
int indent = 0)
const override
725 std::cout << std::string(indent,
' ') <<
"FieldAccess: ." <<
fieldName <<
"\n";
726 object->print(indent + 2);
736 CaseClause(std::unique_ptr<Expression> v, std::vector<std::unique_ptr<Statement>> stmts)
745 std::unique_ptr<Expression>
expr;
749 SwitchStmt(std::unique_ptr<Expression> e, std::vector<CaseClause> c, std::vector<std::unique_ptr<Statement>> d)
754 void print(
int indent = 0)
const override
756 std::cout << std::string(indent,
' ') <<
"SwitchStmt:\n";
757 expr->print(indent + 2);
758 for (
const auto &c :
cases)
760 std::cout << std::string(indent + 2,
' ') <<
"case:\n";
761 c.value->print(indent + 4);
762 for (
const auto &stmt : c.statements)
764 stmt->print(indent + 4);
769 std::cout << std::string(indent + 2,
' ') <<
"default:\n";
772 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