Skip to content

Commit 3f02093

Browse files
Parser改为函数Parse
就一个有用的函数Parse(),而且类对象没有重复利用的价值。没必要用类来实现。
1 parent 17b5f1a commit 3f02093

File tree

3 files changed

+44
-48
lines changed

3 files changed

+44
-48
lines changed

mathS/include/MathParser.h

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,32 @@
1212
*/
1313
namespace mathS
1414
{
15-
class Parser
16-
{
1715

18-
public:
19-
// 从字符串初始化
20-
Parser(const std::string& c) : lexer(c) { }
16+
/// <summary>
17+
/// 从字符串解析表达式,若解析失败,返回相应的MathErrorObject
18+
/// </summary>
19+
/// <param name="c"></param>
20+
/// <returns></returns>
21+
Ptr<MathObject> Parse(const std::string& c);
22+
23+
short level(const std::string& c);
24+
/// <summary>
25+
/// 从 start 位置开始解析一个对象,直到到达右括号或末尾. 若没有对象则返回 EmptyObject. 若检测到语法错误则返回ErrorObject
26+
/// </summary>
27+
/// <param name="tokens"></param>
28+
/// <param name="start"></param>
29+
/// <param name="i">引用变量,解析结束时,i在被解析的对象对应token的后一位索引(即往后继续解析开始的位置)</param>
30+
/// <returns></returns>
31+
Ptr<MathObject> parseObject(const std::vector<Token>& tokens, const int start, int& i);
32+
33+
Ptr<MathObject> parseAtom(const std::vector<Token>& tokens, const int start, int& i);
34+
Ptr<MathObject> parseFunction(const std::vector<Token>& tokens, const int start, int& i);
35+
Ptr<MathObject> parseLocate(const std::vector<Token>& tokens, const int start, int& i);
36+
Ptr<MathObject> parsePower(const std::vector<Token>& tokens, const int start, int& i);
37+
Ptr<MathObject> parseItem(const std::vector<Token>& tokens, const int start, int& i);
38+
Ptr<MathObject> parsePolynomial(const std::vector<Token>& tokens, const int start, int& i);
39+
Ptr<MathObject> parseMap(const std::vector<Token>& tokens, const int start, int& i);
40+
Ptr<MathObject> parseCompare(const std::vector<Token>& tokens, const int start, int& i);
41+
std::vector<Ptr<MathObject>> parseList(const std::vector<Token>& tokens, const int start, int& i);
2142

22-
// 获得解析的 MathObject 符号表达式对象
23-
Ptr<MathObject> Parse();
24-
private:
25-
Lexer lexer;
26-
27-
short level(const std::string& c);
28-
/// <summary>
29-
/// 从 start 位置开始解析一个对象,直到到达右括号或末尾. 若没有对象则返回 EmptyObject. 若检测到语法错误则返回ErrorObject
30-
/// </summary>
31-
/// <param name="tokens"></param>
32-
/// <param name="start"></param>
33-
/// <param name="i">引用变量,解析结束时,i在被解析的对象对应token的后一位索引(即往后继续解析开始的位置)</param>
34-
/// <returns></returns>
35-
Ptr<MathObject> parseObject(const std::vector<Token>& tokens, const int start, int& i);
36-
37-
Ptr<MathObject> parseAtom(const std::vector<Token>& tokens, const int start, int& i);
38-
Ptr<MathObject> parseFunction(const std::vector<Token>& tokens, const int start, int& i);
39-
Ptr<MathObject> parseLocate(const std::vector<Token>& tokens, const int start, int& i);
40-
Ptr<MathObject> parsePower(const std::vector<Token>& tokens, const int start, int& i);
41-
Ptr<MathObject> parseItem(const std::vector<Token>& tokens, const int start, int& i);
42-
Ptr<MathObject> parsePolynomial(const std::vector<Token>& tokens, const int start, int& i);
43-
Ptr<MathObject> parseMap(const std::vector<Token>& tokens, const int start, int& i);
44-
Ptr<MathObject> parseCompare(const std::vector<Token>& tokens, const int start, int& i);
45-
std::vector<Ptr<MathObject>> parseList(const std::vector<Token>& tokens, const int start, int& i);
46-
47-
};
4843
}

mathS/src/MathParser.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ using namespace mathS;
99
#define LIST_ERROR_CHECK(x) if (x.size()>0 && x[0]->GetType() == MathObject::ERROR) return x[0]
1010

1111
// 解析表达式
12-
Ptr<MathObject> Parser::Parse() {
13-
12+
Ptr<MathObject> mathS::Parse(const std::string & c) {
13+
Lexer lexer(c);
1414
std::vector<Token> tokens;
1515
Token tok;
1616
while (true) {
@@ -29,7 +29,7 @@ Ptr<MathObject> Parser::Parse() {
2929
return obj;
3030
}
3131

32-
short Parser::level(const std::string &c) {
32+
short mathS::level(const std::string &c) {
3333
SWITCH(c.c_str()) {
3434
CASE(c, "(") return MathObject::LEVEL_FUNCTION;
3535
CASE(c, "<<") return MathObject::LEVEL_FUNCOPERATOR;
@@ -59,12 +59,12 @@ short Parser::level(const std::string &c) {
5959
}
6060

6161

62-
Ptr<MathObject> mathS::Parser::parseObject(const std::vector<Token>& tokens, const int start, int& i)
62+
Ptr<MathObject> mathS::parseObject(const std::vector<Token>& tokens, const int start, int& i)
6363
{
6464
i = start;
6565
return parseCompare(tokens, i, i);
6666
}
67-
Ptr<MathObject> mathS::Parser::parseAtom(const std::vector<Token>& tokens, const int start, int& i)
67+
Ptr<MathObject> mathS::parseAtom(const std::vector<Token>& tokens, const int start, int& i)
6868
{
6969
Ptr<MathObject> obj;
7070
i = start;
@@ -107,7 +107,7 @@ Ptr<MathObject> mathS::Parser::parseAtom(const std::vector<Token>& tokens, const
107107
}
108108

109109

110-
Ptr<MathObject> mathS::Parser::parseFunction(const std::vector<Token>& tokens, const int start, int& i)
110+
Ptr<MathObject> mathS::parseFunction(const std::vector<Token>& tokens, const int start, int& i)
111111
{
112112
i = start;
113113

@@ -180,7 +180,7 @@ Ptr<MathObject> mathS::Parser::parseFunction(const std::vector<Token>& tokens, c
180180

181181
}
182182

183-
Ptr<MathObject> mathS::Parser::parseLocate(const std::vector<Token>& tokens, const int start, int& i)
183+
Ptr<MathObject> mathS::parseLocate(const std::vector<Token>& tokens, const int start, int& i)
184184
{
185185
i = start;
186186
auto obj = parseFunction(tokens, start, i);
@@ -206,7 +206,7 @@ Ptr<MathObject> mathS::Parser::parseLocate(const std::vector<Token>& tokens, con
206206

207207
}
208208

209-
Ptr<MathObject> mathS::Parser::parsePower(const std::vector<Token>& tokens, const int start, int& i)
209+
Ptr<MathObject> mathS::parsePower(const std::vector<Token>& tokens, const int start, int& i)
210210
{
211211
i = start;
212212
auto b = parseLocate(tokens, start, i);
@@ -224,7 +224,7 @@ Ptr<MathObject> mathS::Parser::parsePower(const std::vector<Token>& tokens, cons
224224
return pw;
225225
}
226226

227-
Ptr<MathObject> mathS::Parser::parseItem(const std::vector<Token>& tokens, const int start, int& i)
227+
Ptr<MathObject> mathS::parseItem(const std::vector<Token>& tokens, const int start, int& i)
228228
{
229229
i = start;
230230
auto fct = parsePower(tokens, start, i);
@@ -261,7 +261,7 @@ Ptr<MathObject> mathS::Parser::parseItem(const std::vector<Token>& tokens, const
261261

262262
}
263263

264-
Ptr<MathObject> mathS::Parser::parsePolynomial(const std::vector<Token>& tokens, const int start, int& i)
264+
Ptr<MathObject> mathS::parsePolynomial(const std::vector<Token>& tokens, const int start, int& i)
265265
{
266266
i = start;
267267
if (i >= tokens.size() || level(tokens[i].text) > MathObject::LEVEL_POLYNOMIAL) {
@@ -301,7 +301,7 @@ Ptr<MathObject> mathS::Parser::parsePolynomial(const std::vector<Token>& tokens,
301301
}
302302
}
303303

304-
Ptr<MathObject> mathS::Parser::parseMap(const std::vector<Token>& tokens, const int start, int& i)
304+
Ptr<MathObject> mathS::parseMap(const std::vector<Token>& tokens, const int start, int& i)
305305
{
306306
i = start;
307307
auto a = parsePolynomial(tokens, i, i);
@@ -317,7 +317,7 @@ Ptr<MathObject> mathS::Parser::parseMap(const std::vector<Token>& tokens, const
317317
return mp;
318318
}
319319

320-
Ptr<MathObject> mathS::Parser::parseCompare(const std::vector<Token>& tokens, const int start, int& i)
320+
Ptr<MathObject> mathS::parseCompare(const std::vector<Token>& tokens, const int start, int& i)
321321
{
322322
i = start;
323323
auto a = parseMap(tokens, i, i);
@@ -335,7 +335,7 @@ Ptr<MathObject> mathS::Parser::parseCompare(const std::vector<Token>& tokens, co
335335
}
336336

337337

338-
std::vector<Ptr<MathObject>> mathS::Parser::parseList(const std::vector<Token>& tokens, const int start, int& i)
338+
std::vector<Ptr<MathObject>> mathS::parseList(const std::vector<Token>& tokens, const int start, int& i)
339339
{
340340
i = start;
341341
if (i >= tokens.size() || level(tokens[i].text) > MathObject::LEVEL_LIST)
@@ -358,3 +358,4 @@ std::vector<Ptr<MathObject>> mathS::Parser::parseList(const std::vector<Token>&
358358
}
359359
}
360360
}
361+

mathS/src/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ int main() {
1616
while (true) {
1717
std::cout << "Source pattern: ";
1818
std::cin >> str;
19-
auto srcpattern = Parser(str).Parse();
19+
auto srcpattern = Parse(str);
2020

2121
std::cout << "Target pattern: ";
2222
std::cin >> str;
23-
auto tarpattern = Parser(str).Parse();
23+
auto tarpattern = Parse(str);
2424

2525
std::cout << "Object: ";
2626
std::cin >> str;
27-
auto obj = Parser(str).Parse();
27+
auto obj = Parse(str);
2828

2929
auto rule = MakeRule(srcpattern, tarpattern);
3030
Ptr<MathObject> rst;
@@ -37,7 +37,7 @@ int main() {
3737
// 计算器程序;测试LBAssembler
3838
while (true) {
3939
std::cin >> str;
40-
auto mobj = Parser(str).Parse();
40+
auto mobj = Parse(str);
4141

4242
// 检查表达式是否合法,并输出错误信息
4343
if (mobj->GetType() == MathObject::ERROR) {

0 commit comments

Comments
 (0)