23 virtual void print(
int indent = 0)
const = 0;
40 void print(
int indent = 0)
const override
59 void print(
int indent = 0)
const override
61 std::cout << std::string(indent,
' ') <<
"Type: " <<
name << (
isPointer ?
"*" :
"") <<
"\n";
63 std::cout << std::string(indent + 2,
' ') <<
"ArrayDim: " << dim <<
"\n";
75 void print(
int indent = 0)
const override
77 std::cout << std::string(indent,
' ') <<
"Number: " <<
value <<
"\n";
88 void print(
int indent = 0)
const override
90 std::cout << std::string(indent,
' ') <<
"String: " <<
value <<
"\n";
101 void print(
int indent = 0)
const override
103 std::cout << std::string(indent,
' ') <<
"Identifier: " <<
name <<
"\n";
114 void print(
int indent = 0)
const override
116 std::cout << std::string(indent,
' ') <<
"Boolean: " << (
value ?
"true" :
"false") <<
"\n";
123 void print(
int indent = 0)
const override
125 std::cout << std::string(indent,
' ') <<
"Null\n";
173 void print(
int indent = 0)
const override
175 std::cout << std::string(indent,
' ') <<
"PostfixExpr: ";
199 void print(
int indent = 0)
const override
201 std::cout << std::string(indent,
' ') <<
"UnaryExpr: ";
224 std::unique_ptr<Expression>
left;
233 void print(
int indent = 0)
const override
235 std::cout << std::string(indent,
' ') <<
"BinaryExpr: ";
278 left->print(indent + 2);
279 right->print(indent + 2);
290 :
array(std::move(arr)),
index(std::move(idx))
294 void print(
int indent = 0)
const override
296 std::cout << std::string(indent,
' ') <<
"ArrayAccess:\n";
297 array->print(indent + 2);
298 std::cout << std::string(indent + 2,
' ') <<
"Index:\n";
299 index->print(indent + 4);
308 void print(
int indent = 0)
const override
310 std::cout << std::string(indent,
' ') <<
"ArrayLiteral:\n";
311 for (
const auto &elem :
elements) elem->print(indent + 2);
325 void print(
int indent = 0)
const override
327 std::cout << std::string(indent,
' ') <<
"MemberAccess: ." <<
member <<
"\n";
328 object->print(indent + 2);
342 void print(
int indent = 0)
const override
344 std::cout << std::string(indent,
' ') <<
"CallExpr: " <<
callee <<
"\n";
347 arg->print(indent + 2);
363 void print(
int indent = 0)
const override
365 std::cout << std::string(indent,
' ') <<
"AssignmentExpr:\n";
366 std::cout << std::string(indent + 2,
' ') <<
"Target:\n";
367 target->print(indent + 4);
368 std::cout << std::string(indent + 2,
' ') <<
"Value:\n";
369 value->print(indent + 4);
381 void print(
int indent = 0)
const override
383 std::cout << std::string(indent,
' ') <<
"VarDecl: " <<
name <<
"\n";
396 void print(
int indent = 0)
const override
409 void print(
int indent = 0)
const override
411 std::cout << std::string(indent,
' ') <<
"PrintStmt:\n";
423 void print(
int indent = 0)
const override
425 std::cout << std::string(indent,
' ') <<
"ImportStmt: " <<
modulePath <<
"\n";
436 void print(
int indent = 0)
const override
438 std::cout << std::string(indent,
' ') <<
"ExportStmt:\n";
450 void print(
int indent = 0)
const override
452 std::cout << std::string(indent,
' ') <<
"BlockStmt:\n";
455 stmt->print(indent + 2);
467 void print(
int indent = 0)
const override
469 std::cout << std::string(indent,
' ') <<
"ReturnStmt:\n";
471 value->print(indent + 2);
478 void print(
int indent = 0)
const override
480 std::cout << std::string(indent,
' ') <<
"BreakStmt\n";
487 void print(
int indent = 0)
const override
489 std::cout << std::string(indent,
' ') <<
"ContinueStmt\n";
500 IfStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> thenB, std::unique_ptr<Statement> elseB)
505 void print(
int indent = 0)
const override
507 std::cout << std::string(indent,
' ') <<
"IfStmt:\n";
512 std::cout << std::string(indent,
' ') <<
"Else:\n";
522 std::unique_ptr<Statement>
body;
524 WhileStmt(std::unique_ptr<Expression> cond, std::unique_ptr<Statement> b)
529 void print(
int indent = 0)
const override
531 std::cout << std::string(indent,
' ') <<
"WhileStmt:\n";
533 body->print(indent + 2);
543 std::unique_ptr<Statement>
body;
545 ForStmt(std::unique_ptr<Statement> init, std::unique_ptr<Expression> cond, std::unique_ptr<Expression> incr,
546 std::unique_ptr<Statement> b)
551 void print(
int indent = 0)
const override
553 std::cout << std::string(indent,
' ') <<
"ForStmt:\n";
560 body->print(indent + 2);
571 void print(
int indent = 0)
const override
573 std::cout << std::string(indent,
' ') <<
"UnsafeBlockStmt:\n";
574 block->print(indent + 2);
585 std::unique_ptr<TypeNode>
type;
589 std::unique_ptr<BlockStmt>
body;
591 FunctionDecl(std::string n, std::vector<Param> p, std::unique_ptr<TypeNode> rt, std::unique_ptr<BlockStmt> b)
596 void print(
int indent = 0)
const override
598 std::cout << std::string(indent,
' ') <<
"FunctionDecl: " <<
name <<
"\n";
599 for (
const auto ¶m :
params)
601 std::cout << std::string(indent + 2,
' ') <<
"Param: " << param.name <<
" Type: ";
602 param.type->print(0);
604 std::cout << std::string(indent + 2,
' ') <<
"Return Type: ";
608 std::cout <<
"void\n";
610 body->print(indent + 2);
618 std::unique_ptr<TypeNode>
type;
635 void print(
int indent = 0)
const override
637 std::cout << std::string(indent,
' ') <<
"StructDecl: " <<
name <<
"\n";
638 for (
const auto &field :
fields)
640 std::cout << std::string(indent + 2,
' ') << field.name <<
": ";
641 field.type->print(0);
650 std::vector<std::pair<std::string, std::unique_ptr<Expression>>>
fieldValues;
652 StructInstanceExpr(std::string name, std::vector<std::pair<std::string, std::unique_ptr<Expression>>> fields)
657 void print(
int indent = 0)
const override
659 std::cout << std::string(indent,
' ') <<
"StructInstance: " <<
structName <<
"\n";
662 std::cout << std::string(indent + 2,
' ') << field.first <<
":\n";
663 field.second->print(indent + 4);
679 void print(
int indent = 0)
const override
681 std::cout << std::string(indent,
' ') <<
"FieldAccess: ." <<
fieldName <<
"\n";
682 object->print(indent + 2);
692 CaseClause(std::unique_ptr<Expression> v, std::vector<std::unique_ptr<Statement>> stmts)
701 std::unique_ptr<Expression>
expr;
705 SwitchStmt(std::unique_ptr<Expression> e, std::vector<CaseClause> c, std::vector<std::unique_ptr<Statement>> d)
710 void print(
int indent = 0)
const override
712 std::cout << std::string(indent,
' ') <<
"SwitchStmt:\n";
713 expr->print(indent + 2);
714 for (
const auto &c :
cases)
716 std::cout << std::string(indent + 2,
' ') <<
"case:\n";
717 c.value->print(indent + 4);
718 for (
const auto &stmt : c.statements)
720 stmt->print(indent + 4);
725 std::cout << std::string(indent + 2,
' ') <<
"default:\n";
728 stmt->print(indent + 4);
Abstract Syntax Tree (AST) namespace.
BinaryOp
Binary operator types.
UnaryOp
Unary operator types.
PostfixOp
Postfix operator types.
The Phasor Programming Language and Runtime.
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::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