-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse.h
105 lines (94 loc) · 2.47 KB
/
parse.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
#pragma once
#include "common.h"
#include "lex.h"
#include "token.h"
#include "symbol.h"
#include "symtab.h"
#include "genir.h"
#include "error.h"
class Parser
{
//主程序
void Program();
void Segment();
Tag Type();
//总定义
void Def(Tag t, bool ext);
void DefTail(Tag t, bool ext, string name, bool ptr);
Var *Init(Tag t, bool ext, string name, bool ptr);
//变量定义
Var *NorVarDef(Tag t, bool ext, string name, bool ptr);
void VarList(Tag t, bool ext);
Var *VarDef(Tag t, bool ext);
//函数定义
void FunDef(); //其实不需要
void FunTail(Fun* fun);
void FunBody();
void FunProgram();
void LocalDef();
void Para(vector<Var*> ¶List);
Var *ParaDef(Tag t);
Var *ParaTail(Tag t, string name);
void ParaList(vector<Var*> ¶List);
//语句定义
void Statement();
void WhileStat();
void DoWhileStat();
void ForStat();
void ForInit();
void IfStat();
void ElseStat(Quaternion *_else, Quaternion *_exit);
void SwitchStat();
void CaseStat(Var* condition);
Var* SecloudStat();
int RadNum();
void ReadStat();
void WriteStat();
//表达式定义 lval表示左值 rval表示右值
//命名还是采用全小写吧...
Var *expr();
Var *altexpr();
Var *literal();
Var *assexpr();
Var *asstail(Var *leftVal);
Var *oorexpr();
Var *oortail(Var *leftVal);
Var *aandexpr();
Var *aandtail(Var *leftVal);
Var *orexpr();
Var *ortail(Var *leftVal);
Var *xorexpr();
Var *xortail(Var *leftVal);
Var *andexpr();
Var *andtail(Var *leftVal);
Var *cmpexpr();
Var *cmptail(Var *leftVal);
Tag cmps();
Var *aloexpr();
Var *alotail(Var *leftVal);
Tag alos();
Var *item();
Var *itemtail(Var *leftVal);
Tag its();
Var *factor();
Tag lop();
Tag rop();
Var *val();
Var *element();
Var *idexpr(string name);
void realarg(vector<Var*> &argList);
void arglist(vector<Var*> &argList);
bool match(int need); //判断是否匹配
void move(); //得到token
void recovery(bool real, Err errCode); //错误恢复
bool isInFollow(vector<int> a);
Tag GetTag();
Lex &lexer;
Token *lookahead;
SymTab &symtab;
GenIR &ir;
public:
Parser(Lex &lexer1, SymTab &symtab1, GenIR &ir1);
~Parser();
void Analysis();
};