-
Notifications
You must be signed in to change notification settings - Fork 0
/
preprocessor.cpp
83 lines (74 loc) · 1.97 KB
/
preprocessor.cpp
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
#include "preprocessor.h"
void preprocessor::deleteSpace(String &str) //把几个连一起的空格变成一个空格
{
bool isSpace=false;
bool isQuotes=false;
String newstr="";
str=str.replace("\t"," "); //删除制表符
for(auto i:str)
{
if(isQuotes) //前一个字符是引号
{
if(i=='"') //这个字符是反引号,出状态
isQuotes=false;
newstr+=i; //无论是否是反引号,这个字符都不会被去除
continue;
}
//前一个不是引号就先检查这个是不是引号
if(i=='"')
{
isQuotes=true; //进状态
newstr+=i;
continue;
}
//确定跟引号没关系了再检查空格
if(i==' ')
{
if(isSpace) //前一个已经是空格了,这个直接忽略
continue;
//前一个不是空格,进状态并写入空格
isSpace=true;
newstr+=i;
continue;
}
//普通字符
isSpace=false; //无论如何都出空格状态
newstr+=i;
}
str=newstr;
}
bool preprocessor::removeChar(String &str, String Char)
{
if(isChar(str,Char))
{
str=str.right(str.length()-1);
return true;
}
return false;
}
bool preprocessor::isChar(String str, String Char)
{return str.left(1)==Char;}
String preprocessor::getToken(String str, vector<String> terminatorList)
{
String newstr="";
for(auto i:str)
{
for(String j:terminatorList)
{
if(i==j)
return newstr;
}
//不是终结符,直接拼接即可
newstr+=i;
}
mistake("规约区块名时没有遇到终结符");
return NULL_String;
}
void preprocessor::mistake(String information)
{
String error="error:"+information;
aLib->output(error);
throw error;
}
int preprocessor::getLen(String literal)
{return literal.length();}