Repository navigation
Expand file tree
/
Copy pathmain.cpp
More file actions
92 lines (80 loc) · 2.14 KB
/
Copy pathmain.cpp
File metadata and controls
92 lines (80 loc) · 2.14 KB
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
#include <iostream>
#include "scanner.h"
#include <string>
#include "element.h"
#include "grammar.h"
#include "generator.h"
#include "rule.h"
#include <fstream>
#include "masm.h"
using namespace std;
int main()
{
streambuf* coutBuf = cout.rdbuf();
ofstream of("out.txt");
// 获取文件out.txt流缓冲区指针
streambuf* fileBuf = of.rdbuf();
// 设置cout流缓冲区指针为out.txt的流缓冲区指针
cout.rdbuf(fileBuf);
Grammar grammar;
grammar.getFileElement("element.txt");
grammar.getFileRule("cfg.txt");
grammar.setStart(Element(Element::non_terminator,"S"));
Generator generator;
if(!generator.init(grammar)) {
cout << "文法读取失败!" << std::endl;
return 1;
}
cout.rdbuf(coutBuf);
cout << "开始LR1分析表生成..." << endl;
cout.rdbuf(fileBuf);
if(!generator.generator()) {
cout << "error generator LALR table." << std::endl;
return 1;
}
cout.rdbuf(coutBuf);
cout << "LR1分析表生成成功!" << endl;
cout.rdbuf(fileBuf);
Scanner scanner;
string fileName("1.cpp");
while(1)
{
if(scanner.getCode(fileName))
{
if(!scanner.scan())
{
cout << "词法分析扫描失败!" << endl;
return 1;
}
scanner.print();
}
cout.rdbuf(coutBuf);
cout << "词法分析扫描成功!" << endl;
cout.rdbuf(fileBuf);
if (!generator.getTokens(scanner.getToken()))
{
cout << "获取Token表失败!" << endl;
return 1;
}
if (!generator.parser())
{
cout.rdbuf(coutBuf);
cout << "语法分析失败!" << endl;
cout.rdbuf(fileBuf);
return 1;
}
cout.rdbuf(coutBuf);
cout << "语法分析成功!" << endl;
cout.rdbuf(fileBuf);
Masm32 masm;
masm.getNameTable(generator.getNameTables());
masm.translate();
cout.rdbuf(coutBuf);
cout << "文件翻译完成!按任意键,重新编译!" << endl;
getchar();
// string aa;
// cin >> aa;
cout.rdbuf(fileBuf);
}
return 0;
}