-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCompiler.java
More file actions
68 lines (66 loc) · 2.81 KB
/
Compiler.java
File metadata and controls
68 lines (66 loc) · 2.81 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
import backend.generation.AssemblyGeneration;
import backend.simplify.BackEndOptimizerUnit;
import frontend.generation.lexer.LexicalAnalysis;
import frontend.generation.semantic.SemanticAnalysis;
import frontend.generation.syntax.SyntaxAnalysis;
import frontend.simplify.FrontEndOptimizerUnit;
import iostream.Config;
import iostream.structure.ErrorController;
import iostream.structure.OutputController;
import midend.generation.GenerationMain;
import midend.simplify.MidEndOptimizerUnit;
import java.io.IOException;
/**
* 编译器主程序
*/
public class Compiler {
public static void main(String[] args) throws IOException {
Config.compilerInit();
// 词法分析
String line;
int lineNum = 0;
LexicalAnalysis lexicalAnalysis = new LexicalAnalysis();
while ((line = Config.getFileInputStream().readLine()) != null) {
lineNum++;
lexicalAnalysis.analysis(line, lineNum);
}
// 语法分析
SyntaxAnalysis syntaxAnalysis = new SyntaxAnalysis(
lexicalAnalysis.getSymTokens());
syntaxAnalysis.analysis();
// 语义分析
SemanticAnalysis semanticAnalysis = new SemanticAnalysis(syntaxAnalysis.getAst());
semanticAnalysis.analysis();
if (Config.isGenerationMode() && !ErrorController.hasError()) {
// 生成中间代码
GenerationMain generationMain = new GenerationMain(syntaxAnalysis.getAst());
generationMain.generate();
// 优化中间代码
if (Config.isIsOptimize()) {
// 前端优化
FrontEndOptimizerUnit frontEndOptimizerUnit =
new FrontEndOptimizerUnit(GenerationMain.getModule());
frontEndOptimizerUnit.optimize();
// 中端优化
MidEndOptimizerUnit midEndOptimizerUnit =
new MidEndOptimizerUnit(GenerationMain.getModule());
midEndOptimizerUnit.optimize();
// 重新生成中间代码
OutputController.generationOptimizerPrint(GenerationMain.getModule().toString());
// 后端优化
if (Config.isIsAssemblyOutput()) {
BackEndOptimizerUnit backEndOptimizerUnit =
new BackEndOptimizerUnit(GenerationMain.getModule());
backEndOptimizerUnit.optimize();
}
}
// 生成汇编代码
if (Config.isIsAssemblyOutput()) {
AssemblyGeneration assemblyGeneration =
new AssemblyGeneration(GenerationMain.getModule());
assemblyGeneration.generate();
}
}
Config.compilerEnd();
}
}