-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
92 lines (67 loc) · 2.47 KB
/
main.cpp
File metadata and controls
92 lines (67 loc) · 2.47 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
92
#include "stdafx.h"
#include <lexer.h>
#include <syntax.h>
#include "SymbolTable.hpp"
#include "symantics.h"
#include "codegen.h"
#include "runtime.h"
#include "clisp_execption.h"
const char Welcome[] = "Welcome to CLisp 0.0.1a.\n"
"This is a private project by cre-chan.\n"
"My github repository is at https://github.com/cre-chan/CLisp\n";
void print_exec(const Commands &executable) {
for (auto &i:executable) {
switch (i.index()) {
case 0:
cout << get<0>(i) << ' ';
break;
case 1:
cout << get<1>(i) << ' ';
break;
}
}
cout << endl;
}
int main() {
cout<<Welcome<<endl;
auto prelude = SymbolTable<FuncSignature>::NIL();
auto runtimeSymbols = SymbolTableRT::NIL();
unique_ptr<Expr> expr;
try {
while (cout << ">>>", cin >> expr) {
//进行语义分析,并更新语义分析上下文
auto[result_expr, func_sigs, defs]=symantic_check(std::move(expr), prelude, "");
// cout<<*defs<<endl;
prelude = prelude + func_sigs;
//将函数定义与函数签名合并
runtimeSymbols = runtimeSymbols + sig_to_runtime(code_gen(move(defs)));
if (result_expr) {
//如果当前表达式可执行,则尝试执行
// cout << *result_expr << endl;
auto executable = code_gen(std::move(result_expr));
// print_exec(executable);
//生成可执行的队列,并使用当前的运行上下文执行该表达式
auto run_expr = CodeText(executable);
try {
auto result = evaluate(runtimeSymbols, run_expr);
switch (result.index()) {
case 1:
cout << get<int>(result) << endl;
break;
case 2:
cout << (get<bool>(result) ? "true" : "false") << endl;
break;
case 0:
cout << "<Function object>" << endl;
}
} catch (shared_ptr<SymbolTableRT> &modification) {
runtimeSymbols = modification;
continue;
}
}
}
} catch (NormalExit &e) {
cout<<endl<<endl<<e.what()<<endl;
}
return 0;
}