sammine-lang
Loading...
Searching...
No Matches
GeneralSemanticsVisitor.h
Go to the documentation of this file.
1
2#pragma once
3#include "ast/Ast.h"
4#include "ast/AstBase.h"
5#include "ast/AstDecl.h"
7#include "util/Utilities.h"
8#include <map>
13namespace sammine_lang::AST {
15class GeneralSemanticsVisitor : public ScopedASTVisitor {
16 // Maps function blocks to whether they return unit (true) or a value (false)
17 std::map<BlockAST *, bool> func_blocks;
18 bool returned = false;
19
20public:
21 // A simple scoping class, doesn't differentiate between different names, like
22 // variable name, func name and all that
24 GeneralSemanticsVisitor() { scope_stack.push_context(); }
25
26 // Check if name contains "__" (reserved for C mangling)
27 void check_reserved_identifier(const std::string &name,
29
30 // INFO: CheckAndReg means: Check if there's redefinition, if not, register
31 // INFO: Check for castable means: Check if the name existed, if not, register
32
33 virtual void enter_new_scope() override { this->scope_stack.push_context(); }
34 virtual void exit_new_scope() override { this->scope_stack.pop_context(); }
35 virtual void preorder_walk(FuncDefAST *ast) override;
36 virtual void postorder_walk(BlockAST *ast) override;
37 virtual void preorder_walk(BlockAST *ast) override;
38 virtual void preorder_walk(ReturnExprAST *ast) override;
39
40 virtual void preorder_walk(ProgramAST *ast) override {}
41
42 virtual void preorder_walk(VarDefAST *ast) override;
43
44 virtual void preorder_walk(ExternAST *ast) override {}
45 virtual void preorder_walk(StructDefAST *ast) override;
46 virtual void preorder_walk(EnumDefAST *ast) override;
47 virtual void preorder_walk(TypeAliasDefAST *ast) override;
48 virtual void preorder_walk(PrototypeAST *ast) override {}
49 virtual void preorder_walk(CallExprAST *ast) override {}
50 virtual void preorder_walk(BinaryExprAST *ast) override {}
51 virtual void preorder_walk(NumberExprAST *ast) override {}
52 virtual void preorder_walk(StringExprAST *ast) override {}
53 virtual void preorder_walk(BoolExprAST *ast) override {}
54 virtual void preorder_walk(CharExprAST *ast) override {}
55
56 virtual void preorder_walk(VariableExprAST *ast) override {}
57 virtual void preorder_walk(IfExprAST *ast) override {}
58 virtual void preorder_walk(UnitExprAST *ast) override {}
59 virtual void preorder_walk(TypedVarAST *ast) override {}
60 virtual void preorder_walk(DerefExprAST *ast) override {}
61 virtual void preorder_walk(AddrOfExprAST *ast) override {}
62 virtual void preorder_walk(AllocExprAST *ast) override {}
63 virtual void preorder_walk(FreeExprAST *ast) override {}
64 virtual void preorder_walk(ArrayLiteralExprAST *ast) override {}
65 virtual void preorder_walk(IndexExprAST *ast) override {}
66 virtual void preorder_walk(LenExprAST *ast) override {}
67 virtual void preorder_walk(UnaryNegExprAST *ast) override {}
68 virtual void preorder_walk(StructLiteralExprAST *ast) override {}
69 virtual void preorder_walk(FieldAccessExprAST *ast) override {}
70 virtual void preorder_walk(CaseExprAST *ast) override {}
71 virtual void preorder_walk(WhileExprAST *ast) override {}
72 virtual void preorder_walk(TupleLiteralExprAST *ast) override {}
74 // Type class declarations: no-op (only prototypes, no bodies)
75 virtual void visit(TypeClassDeclAST *ast) override {}
76 // Instance methods need implicit return wrapping, so visit each FuncDefAST
77 virtual void visit(TypeClassInstanceAST *ast) override {
78 for (auto &method : ast->methods)
79 method->accept_vis(this);
80 }
81 virtual void preorder_walk(TypeClassDeclAST *ast) override {}
82 virtual void preorder_walk(TypeClassInstanceAST *ast) override {}
83
84 // post order
85 virtual void postorder_walk(ProgramAST *ast) override {}
86 virtual void postorder_walk(VarDefAST *ast) override {}
87 virtual void postorder_walk(ExternAST *ast) override {}
88 virtual void postorder_walk(FuncDefAST *ast) override {}
89 virtual void postorder_walk(StructDefAST *ast) override {}
90 virtual void postorder_walk(EnumDefAST *ast) override {}
91 virtual void postorder_walk(TypeAliasDefAST *ast) override {}
92 virtual void postorder_walk(PrototypeAST *ast) override {}
93 virtual void postorder_walk(CallExprAST *ast) override {}
94 virtual void postorder_walk(ReturnExprAST *ast) override {}
95 virtual void postorder_walk(BinaryExprAST *ast) override {}
96 virtual void postorder_walk(NumberExprAST *ast) override {}
97 virtual void postorder_walk(StringExprAST *ast) override {}
98 virtual void postorder_walk(BoolExprAST *ast) override {}
99 virtual void postorder_walk(CharExprAST *ast) override {}
100 virtual void postorder_walk(VariableExprAST *ast) override {}
101 virtual void postorder_walk(IfExprAST *ast) override {}
102 virtual void postorder_walk(UnitExprAST *ast) override {}
103 virtual void postorder_walk(TypedVarAST *ast) override {}
104 virtual void postorder_walk(DerefExprAST *ast) override {}
105 virtual void postorder_walk(AddrOfExprAST *ast) override {}
106 virtual void postorder_walk(AllocExprAST *ast) override {}
107 virtual void postorder_walk(FreeExprAST *ast) override {}
108 virtual void postorder_walk(ArrayLiteralExprAST *ast) override {}
109 virtual void postorder_walk(IndexExprAST *ast) override {}
110 virtual void postorder_walk(LenExprAST *ast) override {}
111 virtual void postorder_walk(UnaryNegExprAST *ast) override {}
112 virtual void postorder_walk(StructLiteralExprAST *ast) override {}
113 virtual void postorder_walk(FieldAccessExprAST *ast) override {}
114 virtual void postorder_walk(CaseExprAST *ast) override {}
115 virtual void postorder_walk(WhileExprAST *ast) override {}
116 virtual void postorder_walk(TupleLiteralExprAST *ast) override {}
117 virtual void postorder_walk(TypeClassDeclAST *ast) override {}
118 virtual void postorder_walk(TypeClassInstanceAST *ast) override {}
119};
120} // namespace sammine_lang::AST
Defines the AST Abstract class for printing out AST Nodes.
Holds declaration for all the AST Nodes.
Defined the AST Node classes (ProgramAST, StructDefAST, FuncDefAST) and a visitor interface for trave...
A simple scoping class, doesn't differentiate between different names, like variable name,...
Holds classes and functionalities for dealing with Error handling, source locations caching & indexin...
An AST to simulate a { } code block.
Definition Ast.h:317
Definition Ast.h:485
Definition Ast.h:548
Definition Ast.h:798
Definition Ast.h:495
Definition Ast.h:378
A Function Definition that has the prototype and definition in terms of a block.
Definition Ast.h:291
Definition Ast.h:667
Definition Ast.h:326
Definition Ast.h:598
Definition Ast.h:707
Definition AstBase.h:239
Definition Ast.h:197
A prototype to present "func func_name(...) -> type;".
Definition Ast.h:236
Definition AstBase.h:277
virtual void visit(FuncDefAST *ast)
Definition Ast.cpp:243
Definition Ast.h:205
Definition Ast.h:581
A variable definition: "var x = expression;" or "let (a, b) = expr;".
Definition Ast.h:420
Definition Utilities.h:70