-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLexer.h
153 lines (139 loc) · 3.43 KB
/
Lexer.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
148
149
150
151
152
153
//
// Created by hzt on 2023/9/19.
//
#ifndef LEX_LEXER_H
#define LEX_LEXER_H
#include <fstream>
#include <map>
using namespace std;
enum Type{
FINISH,
NOTE,
ILLEGAL,
IDENFR,
INTCON,
STRCON,
MAINTK,
CONSTTK,
INTTK,
BREAKTK,
CONTINUETK,
IFTK,
ELSETK,
NOT,
AND,
OR,
FORTK,
GETINTTK,
PRINTFTK,
RETURNTK,
PLUS,
MINU,
VOIDTK,
MULT,
DIV,
MOD,
LSS,
LEQ,
GRE,
GEQ,
EQL,
NEQ,
ASSIGN,
SEMICN,//;
COMMA,//,
LPARENT,// (
RPARENT,//)
LBRACK,// [
RBRACK,//]
LBRACE,//{
RBRACE//}
};
enum PIECE{
CONSTDECL,
CONSTDEF,
VARDECL,
VARDEF,
FUNCDEF,
MAINFUNCDEF,
FUNCFPARAM,
STMT,
FORSTMT,
LVAL,
UNARYEXP,
FORMATSTRING
};
class Lexer {
private:
bool count_flag;
bool enableOutput;
map<string, Type> wordCategory;
//私有化-构造函数
Lexer(ifstream & sourceFile,ofstream & outputFile);
public:
//暴露给语法分析程序
string ident;//save the ident name because not using ch in parser
char ch;
Type token_type;
struct Token{
int number;
string *symbol;///? 如果不是指针 似乎有关构造函数会出问题
}token;
int printf_format_count = 0;
int line;
int line_lastWord;
ifstream &sourceFile;
ofstream &outputFile;
static Lexer& initLexer(ifstream& sourceFile,ofstream & outputFile);//为什么要对外一个?
//symbol 是符号 包括标识符、保留字、以及所有其他除了单引号、双引号之间的字符串
void nextSymbol();
//单引号之间的
void nextChar();
//双引号之间的
void nextString();
void analyze ();//核心函数 进行解析词法 并且根据编译开关进行输出
void printOutput();//token_type token{number string}
};
#define ENUM_TO_STRING(enumVal) \
(enumVal == FINISH ? "FINISH" : \
(enumVal == NOTE ? "NOTE" : \
(enumVal == ILLEGAL ? "ILLEGAL" : \
(enumVal == IDENFR ? "IDENFR" : \
(enumVal == INTCON ? "INTCON" : \
(enumVal == STRCON ? "STRCON" : \
(enumVal == MAINTK ? "MAINTK" : \
(enumVal == CONSTTK ? "CONSTTK" : \
(enumVal == INTTK ? "INTTK" : \
(enumVal == BREAKTK ? "BREAKTK" : \
(enumVal == CONTINUETK ? "CONTINUETK" : \
(enumVal == IFTK ? "IFTK" : \
(enumVal == ELSETK ? "ELSETK" : \
(enumVal == NOT ? "NOT" : \
(enumVal == AND ? "AND" : \
(enumVal == OR ? "OR" : \
(enumVal == FORTK ? "FORTK" : \
(enumVal == GETINTTK ? "GETINTTK" : \
(enumVal == PRINTFTK ? "PRINTFTK" : \
(enumVal == RETURNTK ? "RETURNTK" : \
(enumVal == PLUS ? "PLUS" : \
(enumVal == MINU ? "MINU" : \
(enumVal == VOIDTK ? "VOIDTK" : \
(enumVal == MULT ? "MULT" : \
(enumVal == DIV ? "DIV" : \
(enumVal == MOD ? "MOD" : \
(enumVal == LSS ? "LSS" : \
(enumVal == LEQ ? "LEQ" : \
(enumVal == GRE ? "GRE" : \
(enumVal == GEQ ? "GEQ" : \
(enumVal == EQL ? "EQL" : \
(enumVal == NEQ ? "NEQ" : \
(enumVal == ASSIGN ? "ASSIGN" : \
(enumVal == SEMICN ? "SEMICN" : \
(enumVal == COMMA ? "COMMA" : \
(enumVal == LPARENT ? "LPARENT" : \
(enumVal == RPARENT ? "RPARENT" : \
(enumVal == LBRACK ? "LBRACK" : \
(enumVal == RBRACK ? "RBRACK" : \
(enumVal == LBRACE ? "LBRACE" : \
(enumVal == RBRACE ? "RBRACE" : "Unknown")))))))))))))))))))))))))))))))))))))))))
#endif //LEX_LEXER_H