-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
150 lines (113 loc) · 3.34 KB
/
main.go
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
package main
import (
"CompilerInGo/analyser"
"CompilerInGo/lexer"
"CompilerInGo/mir"
"CompilerInGo/parser"
"CompilerInGo/utils"
"bytes"
"encoding/json"
"flag"
"github.com/kpango/glg"
"os"
"runtime"
"runtime/pprof"
"time"
)
func main() {
// 解析命令行参数
filepath := flag.String("f", "./test.program", "input source program")
mode := flag.String("m", "DEBUG", "logger mode (DEBUG, INFO, CLOSE)")
flag.Parse()
// 设置CPU Profiling
if *mode == "DEBUG" {
// 创建CPU Profiling文件
cpuProf, err := os.Create("./cpu.prof")
if err != nil {
glg.Fatalln(err)
}
defer cpuProf.Close()
// 使用pprof进行CPU Profiling
runtime.SetCPUProfileRate(3000)
_ = pprof.StartCPUProfile(cpuProf)
defer pprof.StopCPUProfile()
}
// 初始化logger
utils.InitLogger(*mode)
// ------------------- Lexer -------------------
// 初始化lexer
lex := lexer.NewLexer(*filepath)
_ = glg.Info("Lexer initialized")
// 初始化token池
lexer.Pool = lexer.NewTokenPool()
// Lexer计时开始
startTime := time.Now()
// 读取第一个Token
// IfTokenError 检查Token是否出错,若出错则输出错误信息并退出程序
token := lexer.IfTokenError(lex.ScanToken())
lexer.Pool.PushBack(token)
// 若未读到EOF则继续读取
for lexer.Pool.Last().Category != lexer.EOF {
token := lexer.IfTokenError(lex.ScanToken())
lexer.Pool.PushBack(token)
}
// Lexer计时结束
elapsedTime := time.Since(startTime)
// 输出Token池
_ = glg.Info("Token Pool:")
_ = glg.Infof("%3s:%3s to %3s:%3s %12s %27s (%v)", "Row", "Col", "Row", "Col", "Category", "Type", "Literal")
for _, token := range lexer.Pool.Pool {
_ = glg.Info(token.String())
}
// 显示Lexer运行时间
_ = glg.Info("Lexing finished in ", elapsedTime)
// ------------------- Parser -------------------
// 初始化parser
pser := parser.NewParser()
_ = glg.Info("Parser initialized")
// Parser计时开始
startTime = time.Now()
// 开始parse
program, err := pser.Parse()
if err != nil {
glg.Fatal(err)
}
// Parser计时结束
elapsedTime = time.Since(startTime)
// 将AST转换为JSON
marshaled, _ := json.Marshal(program)
// 在Debug模式下输出原始JSON
_ = glg.Debug("Raw JSON:", string(marshaled))
// 在Info模式下输出格式化后的JSON
var prettyJSON bytes.Buffer
_ = json.Indent(&prettyJSON, marshaled, "", "....")
_ = glg.Info("Parser Result:")
_ = glg.Info("AST in JSON format:\n" + prettyJSON.String())
// 显示Parser运行时间
_ = glg.Info("Parsing finished in ", elapsedTime)
// ------------------- Analyser -------------------
// 初始化Analyser
anly := analyser.NewAnalyser()
_ = glg.Info("Analyser initialized")
startTime = time.Now()
hirProgram, errs := anly.Analyse(program)
elapsedTime = time.Since(startTime)
for _, hi := range hirProgram.Methods {
_ = glg.Debugf("HIR Methods: %#v", hi)
}
if errs != 0 {
glg.Fatal("Analysing finished with ", errs, " errors")
} else {
_ = glg.Info("Analysing finished with no error")
}
_ = glg.Info("Analysing finished in ", elapsedTime)
// ------------------- MIR Generator -------------------
gen := mir.NewMIRGenerator()
_ = glg.Info("MIR Generator initialized")
startTime = time.Now()
mirProgram := gen.Generate(hirProgram)
elapsedTime = time.Since(startTime)
_ = mirProgram
gen.Print()
//_ = glg.Debugf("MIR Program: %#v", mirProgram)
}