-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathirgen.h
118 lines (110 loc) · 5.28 KB
/
irgen.h
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/****************************************************/
/*File: irgen.h */
/*The class of Intermediate Representation Generator*/
/*for the jason compiller */
/*This genrator classs will evaluate all nodes and */
/*generate the Intermedia Representation in Eeyore */
/*Yueyang (Jason) Pan */
/****************************************************/
#ifndef __IRGEN_H
#define __IRGEN_H
#include <memory>
#include <sstream>
#include "ir.h"
#include "global.h"
#include "guard.h"
#include "nested.h"
#include "source.tab.hpp"
using ConVarPTR = std::shared_ptr<std::vector<int> >;
class IRGen{
public:
IRGen() : _error_num(0){
//register the lib functions
//To do
//getint
_lib_funcs.insert({"getint",std::make_shared<FunctionDef>("getint", 0, yy::parser::token_type::TOK_INT)});
//getch
_lib_funcs.insert({"getch",std::make_shared<FunctionDef>("getch", 0, yy::parser::token_type::TOK_INT)});
//getarray
_lib_funcs.insert({"getarray",std::make_shared<FunctionDef>("getarray", 1, yy::parser::token_type::TOK_INT)});
//putint
_lib_funcs.insert({"putint",std::make_shared<FunctionDef>("putint", 1, yy::parser::token_type::TOK_VOID)});
//putchar
_lib_funcs.insert({"putch",std::make_shared<FunctionDef>("putch", 1, yy::parser::token_type::TOK_VOID)});
//putarray
_lib_funcs.insert({"putarray",std::make_shared<FunctionDef>("putarray", 2, yy::parser::token_type::TOK_VOID)});
//starttime
_lib_funcs.insert({"starttime",std::make_shared<FunctionDef>("starttime", 0, yy::parser::token_type::TOK_VOID)});
//stoptime
_lib_funcs.insert({"stoptime",std::make_shared<FunctionDef>("stoptime", 0, yy::parser::token_type::TOK_VOID)});
}
//dump eeyore representations
void Dump_Eeyore(std::ostream &os) const;
void Dump_Tigger(std::ostream &os);
void Dump_RISC_V(std::ostream &os);
//vistor methods here
ValPtr GenerateOn(const CompUnitAST& ast);
ValPtr GenerateOn(const ConstDeclAST& ast);
ValPtr GenerateOn(const ConstDefAST& ast);
ValPtr GenerateOn(const ConstDefListAST& ast);
//ValPtr GenerateOn(const ConstInitValArrayAST& ast);
//ValPtr GenerateOn(const ConstInitValAST& ast);
ValPtr GenerateOn(const VarDeclAST& ast);
ValPtr GenerateOn(const VarDefListAST& ast);
ValPtr GenerateOn(const VarDefAST& ast);
//ValPtr GenerateOn(const InitValArrayAST& ast);
//ValPtr GenerateOn(const InitValAST& ast);
ValPtr GenerateOn(const FuncDefAST& ast);
//ValPtr GenerateOn(const FuncFParamsAST& ast);
//ValPtr GenerateOn(const FuncFParamVarAST& ast);
//ValPtr GenerateOn(const FuncFParamArrayAST& ast);
//ValPtr GenerateOn(const DimensionAST& ast);
ValPtr GenerateOn(const BlockAST& ast);
ValPtr GenerateOn(const BlockItemsAST& ast);
ValPtr GenerateOn(const AssignAST& ast);
ValPtr GenerateOn(const ExpAST& ast);
ValPtr GenerateOn(const IfAST& ast);
ValPtr GenerateOn(const WhileAST& ast);
ValPtr GenerateOn(const CondAST& ast);
ValPtr GenerateOn(const ReturnAST& ast);
ValPtr GenerateOn(const BinaryAST& ast);
ValPtr GenerateOn(const UnaryAST& ast);
ValPtr GenerateOn(const FuncCallAST& ast);
//ValPtr GenerateOn(const FuncRParamsAST& ast);
ValPtr GenerateOn(const IntAST& ast);
ValPtr GenerateOn(const IdAST& ast);
ValPtr GenerateOn(const ArrayAST& ast);
std::optional<int> EvalOn(const IdAST& ast);
std::optional<int> EvalOn(const IntAST& ast);
std::optional<int> EvalOn(const ArrayAST& ast);
std::optional<int> EvalOn(const UnaryAST& ast);
std::optional<int> EvalOn(const BinaryAST& ast);
ValPtr process_value(std::shared_ptr<ConstInitValArrayAST> ast, std::vector<std::size_t>& shape, std::size_t dim, std::vector<int>& result);
ValPtr process_slot(std::shared_ptr<InitValArrayAST> ast, std::vector<std::size_t>& shape, std::size_t dim, ValPtrList& result);
ValPtr process_init_val(std::shared_ptr<InitValArrayAST> ast, std::vector<std::size_t>& shape, std::size_t dim, std::vector<int>& result);
std::size_t error_num() const {return _error_num;}
private:
std::size_t _error_num;
ValPtr LogError(std::string_view message);
xstl::Guard NewEnvironment();
xstl::Guard NewLoopEnv();
//The symbol Table inside a block;
xstl::Guard NewSymTable();
xstl::Guard NewConstVars();
//Continuously insert labesl into _now_func, which could be later translated easilly.
FuncDefPtr _now_func;
std::unordered_map<std::string_view, FuncDefPtr> _funcs;
std::unordered_map<std::string_view, FuncDefPtr> _lib_funcs;
xstl::NestedMapPtr<std::string, ValPtr> _vars;
xstl::NestedMapPtr<std::string, ValPtr> _loop_labels;
//Add a new symbol table.
//This should also be nested!
xstl::NestedMapPtr<std::string, STEPtr> _symbol_table;
//The function table don't have to be nested because we don't have nested functions
std::unordered_map<std::string, std::unordered_map<std::string, FTEPtr> > _func_table;
//This map is used to store the values of const variables and arrays.
xstl::NestedMapPtr<std::string, ConVarPTR > _const_vars;
std::stringstream global_assign_Tigger;
std::stringstream global_assign_RISC_V;
};
#endif