-
Notifications
You must be signed in to change notification settings - Fork 0
/
symbol_table.h
75 lines (65 loc) · 1.66 KB
/
symbol_table.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
/*
* Project 3
* Author: B10630221 Chang-Ting Kao
* Date: 2019/06/05
*/
#ifndef SYMBOL_TABLE_H
#define SYMBOL_TABLE_H
#include <string>
#include <map>
#include <vector>
#include "driver.h"
using namespace yy;
class SymbolTable;
// Symbol table 項目
struct SymbolTableEntry {
struct ArrayEntry {
// 值類型
ValueType valueType;
int low;
int high;
};
// 值類型
ValueType valueType;
// 陣列資料
struct ArrayEntry arrayEntry;
// 項目類型
EntryType entryType;
// Symbol table 指標
SymbolTable* symbolTable;
// 名稱
std::string name;
// 值
Value value;
};
typedef struct SymbolTableEntry SymbolTableEntry;
typedef struct SymbolTableEntry::ArrayEntry ArrayEntry;
class SymbolTable
{
public:
SymbolTable(const std::string str);
// 取得資料
SymbolTableEntry* Find(const std::string key);
// 加入資料
void Add(const std::string key, SymbolTableEntry* entry);
// 判斷是否有指定的 Key
bool HasKey (const std::string key);
// 輸出到 stdout
void Dump();
// 取得表中參數
std::vector<SymbolTableEntry*>& GetArgumentTable();
// 取得表中變數 (包含參數)
std::vector<SymbolTableEntry*>& GetVariableTable();
// 取得原始資料表
std::map<std::string, SymbolTableEntry*>& GetRawSymbolTable();
// 名稱
std::string scope;
private:
// SymbolTable 資料處存
std::map<std::string, SymbolTableEntry*> symbolTable;
// 參數表
std::vector<SymbolTableEntry*> argumentTable;
// 變數表(包含參數)
std::vector<SymbolTableEntry*> variableTable;
};
#endif // SYMBOL_TABLE_H