forked from arcsysu/SYsU-lang2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Json2Asg.hpp
131 lines (91 loc) · 3.9 KB
/
Json2Asg.hpp
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
#pragma once
#include "asg.hpp"
#include <any>
#include <llvm/Support/JSON.h>
#include <regex>
#include <unordered_map>
class Json2Asg
{
public:
Obj::Mgr& mMgr;
Json2Asg(Obj::Mgr& mgr)
: mMgr(mgr)
{
}
asg::TranslationUnit* operator()(const llvm::json::Value& jval);
private:
std::unordered_map<std::size_t, Obj*> mIdMap;
std::unordered_map<std::string, const asg::Type*> mTyMap;
/**
* 在遍历函数体时指向当前的函数声明,从而给函数体内返回语句的 ReturnStmt
* 赋值。
*/
asg::FunctionDecl* mCurFunc{ nullptr };
/**
* 在遍历循环语句体时指向当前的循环语句结点,从而给循环体内的 BreakStmt
* 和 ContinueStmt 赋值。
*/
asg::Stmt* mCurLoop{ nullptr };
template<typename T, typename... Args>
T* make(Args... args)
{
auto obj = mMgr.make<T>(args...);
return obj;
}
template<typename T, typename... Args>
T* make(std::size_t id, Args... args)
{
auto obj = mMgr.make<T>(args...);
mIdMap.emplace(id, obj);
return obj;
}
//============================================================================
// 类型
//============================================================================
const asg::Type* getty(const llvm::json::Object& jobj);
//============================================================================
// 表达式
//============================================================================
asg::Expr* expr(const llvm::json::Object& jobj);
asg::IntegerLiteral* integer_literal(const llvm::json::Object& jobj);
asg::DeclRefExpr* decl_ref_expr(const llvm::json::Object& jobj);
asg::ParenExpr* paren_expr(const llvm::json::Object& jobj);
asg::UnaryExpr* unary_expr(const llvm::json::Object& jobj);
asg::BinaryExpr* binary_expr(const llvm::json::Object& jobj);
asg::CallExpr* call_expr(const llvm::json::Object& jobj);
asg::InitListExpr* init_list_expr(const llvm::json::Object& jobj);
asg::ImplicitInitExpr* implicit_init_expr(const llvm::json::Object& jobj);
asg::ImplicitCastExpr* implicit_cast_expr(const llvm::json::Object& jobj);
//============================================================================
// 语句
//============================================================================
asg::Stmt* stmt(const llvm::json::Object& jobj);
asg::CompoundStmt* compound_stmt(const llvm::json::Object& jobj);
asg::NullStmt* null_stmt(const llvm::json::Object& jobj);
asg::DeclStmt* decl_stmt(const llvm::json::Object& jobj);
asg::ExprStmt* expr_stmt(const llvm::json::Object& jobj);
asg::IfStmt* if_stmt(const llvm::json::Object& jobj);
asg::WhileStmt* while_stmt(const llvm::json::Object& jobj);
asg::BreakStmt* break_stmt(const llvm::json::Object& jobj);
asg::ContinueStmt* continue_stmt(const llvm::json::Object& jobj);
asg::ReturnStmt* return_stmt(const llvm::json::Object& jobj);
//============================================================================
// 声明
//============================================================================
asg::Decl* decl(const llvm::json::Object& jobj);
asg::VarDecl* var_decl(const llvm::json::Object& jobj);
asg::FunctionDecl* function_decl(const llvm::json::Object& jobj);
private:
/**
* @brief 尝试解析以 \p s 为起始的字符串,将语义值存入 \p v 。
* 成功时返回剩余字符串指针,失败时返回 nullptr。
*/
const char* parse_type(const char* s, const asg::Type*& v);
/// 解析类型表达式,注意 \p v 在构建后是由外到内的顺序,需要再调用 turn_texp
/// 将内外翻转。
const char* parse_texp(const char* s, asg::TypeExpr*& v);
const char* parse_texp_0(const char* s, asg::TypeExpr*& v);
const char* parse_texp_1(const char* s, asg::TypeExpr*& v);
const char* parse_texp_2(const char* s, asg::TypeExpr*& v);
const char* parse_args(const char* s, std::vector<const asg::Type*>& v);
};