-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcodegenerator.h
More file actions
72 lines (63 loc) · 2.62 KB
/
codegenerator.h
File metadata and controls
72 lines (63 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#ifndef CODEGENERATOR_H
#define CODEGENERATOR_H
#include "ast.h"
#include "semantic_analyzer.h"
#include "symbol_table.h"
#include <string>
#include <vector>
#include <sstream>
#include <map>
class CodeGenerator : public SemanticVisitor {
public:
std::string generateCode(ProgramNode& ast_root, SemanticAnalyzer& semanticAnalyzer);
private:
std::stringstream code;
int labelCounter = 0;
SymbolTable* symbolTable = nullptr;
SubprogramHead* currentFunctionContext = nullptr;
// ADDED: A pointer to the symbol entry for the current subprogram being generated.
SymbolEntry* currentSubprogramEntry = nullptr;
int local_offset = 0;
int param_offset = 0;
std::string currentSubprogramExitLabel;
// Helper Methods
std::string newLabel(const std::string& prefix);
void emit(const std::string& instruction);
void emit(const std::string& instruction, const std::string& arg);
void emitLabel(const std::string& label);
EntryTypeCategory astToSymbolType(TypeNode* astTypeNode, ArrayDetails& outArrayDetails);
// Visitor Method Overrides
void visit(ProgramNode& node) override;
void visit(Declarations& node) override;
void visit(VarDecl& node) override;
void visit(SubprogramDeclarations& node) override;
void visit(SubprogramDeclaration& node) override;
void visit(CompoundStatementNode& node) override;
void visit(StatementList& node) override;
void visit(AssignStatementNode& node) override;
void visit(IfStatementNode& node) override;
void visit(WhileStatementNode& node) override;
void visit(ProcedureCallStatementNode& node) override;
void visit(ReturnStatementNode& node) override;
void visit(IntNumNode& node) override;
void visit(RealNumNode& node) override;
void visit(BooleanLiteralNode& node) override;
void visit(StringLiteralNode& node) override;
void visit(BinaryOpNode& node) override;
void visit(UnaryOpNode& node) override;
void visit(VariableNode& node) override;
void visit(FunctionCallExprNode& node) override;
void visit(IdExprNode& node) override;
void visit(ArgumentsNode& node) override;
void visit(ParameterList& node) override;
void visit(ParameterDeclaration& node) override;
// Unused or trivial visitor methods
void visit(IdentifierList& node) override {}
void visit(IdentNode& node) override {}
void visit(StandardTypeNode& node) override {}
void visit(ArrayTypeNode& node) override {}
void visit(FunctionHeadNode& node) override {}
void visit(ProcedureHeadNode& node) override {}
void visit(ExpressionList& node) override {}
};
#endif // CODEGENERATOR_H