-
Notifications
You must be signed in to change notification settings - Fork 0
/
semantic.h
147 lines (120 loc) · 4.94 KB
/
semantic.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#ifndef SEMANTIC_H
#define SEMANTIC_H
#pragma once
#include<stack>
#include "STree.h"
using namespace std;
class Semantic;
struct LT_Node {
char label[LABEL_LENGTH];
int line;
LT_Node* next;
};
class LabelTable{
private:
LT_Node* head;
LT_Node* tail;
public:
LabelTable();
void AddLabel(char label[LABEL_LENGTH]);
friend Semantic;
};
struct SymbolTable;
struct ST_Node {
char name[NAME_LENGTH];
char type[20];
int offset;
SymbolTable* child_table;
ST_Node* next;
};
struct SymbolTable {
ST_Node* head;
ST_Node* tail;
int OFFSET;
SymbolTable* parent_table;
};
class SymbolTableS {
private:
SymbolTable* Sroot;
SymbolTable* Scurrent;
public:
SymbolTableS();
void AddSymbol(ST_Node *S);
friend Semantic;
};
struct ERR_Node {
char ErrorMessage[100];
ERR_Node *next;
};
class ErrorTable {
private:
ERR_Node *head;
ERR_Node *tail;
public:
ErrorTable();
void AddError(ERR_Node* E);
friend Semantic;
friend MainWindow;
};
class Semantic {
private:
int line;
int LabelNo;
int TempNo;
LabelTable Ltable;
SymbolTableS Stable;
ErrorTable Etable;
stack <char*> Stemp;
public:
Semantic();
friend MainWindow;
void Num_to_Str(int num, char str[10]);
void NewTemp(char Temp[NAME_LENGTH]);
void NewLabel(char Label[LABEL_LENGTH]);
Quadruples* Generate(const char* op, const char* arg1, const char* arg2, const char* result); //生成一条四元式
void QList_Connect(int num, int No[MAX_CHILD_NUM], Quadruples_List* QLparent, Quadruples_List* QLchild[MAX_CHILD_NUM]); //用于拼接四元式链
void QList_Append(Quadruples_List* L1, Quadruples_List* L2); // 将Qlist L2接入到L1的尾部
void PostOrderTraverse(STree* T);
void Semantic_Analyze(STree* T);
void SemanticFun_Entrance(STree* T);
void SemanticFun_5(STree* T); //5: <声明> ::= int <ID> <声明类型>
void SemanticFun_6(STree* T); //6: <声明> ::= void <ID> <函数声明>
void SemanticFun_17(STree* T); //17: <参数> ::= int <ID>
//23: <内部变量声明> ::= int <ID> ;
void SemanticFun_18(STree* T); //18: <语句块> ::= { <内部声明> <语句串> }
void SemanticFun_24(STree* T); //24: <语句串> ::= <语句> <可选语句串>
void SemanticFun_25(STree* T); //25: <可选语句串> ::= <语句> <可选语句串>
void SemanticFun_26(STree* T); //26: <可选语句串> ::= 空
void SemanticFun_27(STree* T); //27: <语句> ::= <if语句>
//28: <语句> ::= <while语句>
//29: <语句> ::= <return语句>
//30: <语句> ::= <赋值语句>
void SemanticFun_31(STree* T); //31: <赋值语句> ::= <ID> = <表达式>
void SemanticFun_32(STree* T); //32: <return语句> ::= return <表达式>
void SemanticFun_34(STree* T); //34: <while语句> ::= while ( <表达式> ) <语句块>
void SemanticFun_35(STree* T); //35: <if语句> ::= if ( <表达式> ) <语句块> <可选else语句块>
void SemanticFun_36(STree* T); //36: <可选else语句块> ::= else <语句块>
void SemanticFun_39(STree* T); //39: <可选表达式> :: = <relop> <加法表达式> <可选表达式>
void SemanticFun_41(STree* T); //41: <relop> ::= <
//42: <relop> ::= <=
//43: <relop> ::= >
//44: <relop> ::= >=
//45: <relop> ::= ==
//46: <relop> ::= !=
void SemanticFun_47(STree* T); //47: <加法表达式> ::= <项> <可选加法表达式>
//51: <项> ::= <因子> <可选项>
void SemanticFun_48(STree* T); //48: <可选加法表达式> ::= + <项> <可选加法表达式>
//49: <可选加法表达式> ::= - <项> <可选加法表达式>
//52 : <可选项> :: = * <因子> <可选项>
//53 : <可选项> :: = / <因子> <可选项>
void SemanticFun_55(STree* T); //<因子> ::= num
void SemanticFun_56(STree* T); //<因子> ::= ( <表达式> )
void SemanticFun_57(STree* T); //<因子> ::= <ID> FTYPE
void SemanticFun_63(STree* T); //<实参列表> ::= <表达式> <可选实参列表>
void SemanticFun_64(STree* T); //<可选实参列表> ::= , <表达式> <可选实参列表>
void SemanticFun_Other(STree* T); //只传递四元式链
int Define_Check(char IDname[NAME_LENGTH]);
int Use_Check(char IDname[NAME_LENGTH]);
void StableOut();
};
#endif // SEMANTIC_H