forked from awfeequdng/px_golang2cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse_assign_stmt.go
101 lines (92 loc) · 2.32 KB
/
parse_assign_stmt.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
package main
import (
"go/ast"
"go/token"
"log"
"strconv"
)
func ParseAssignStmt(assignStmt *ast.AssignStmt, objectTypeMap *ObjectTypeMap) []string {
var ret []string
var names []string
var values []string
switch assignStmt.Tok {
case token.DEFINE:
case token.ASSIGN:
case token.ADD_ASSIGN:
case token.SUB_ASSIGN:
case token.MUL_ASSIGN:
case token.QUO_ASSIGN:
case token.REM_ASSIGN:
case token.AND_ASSIGN:
case token.OR_ASSIGN:
default:
log.Fatal("do not support, token = " + assignStmt.Tok.String())
}
for _, lhs := range assignStmt.Lhs {
names = append(names, ParseExpr(lhs))
}
for _, rhs := range assignStmt.Rhs {
values = append(values, ParseExpr(rhs))
}
nameSize := len(names)
valueSize := len(values)
var name string
var value string
if nameSize == 0 {
log.Fatal("name size is 0")
}
if valueSize == 0 {
log.Fatal("value size if 0")
}
if nameSize == 1 {
name = names[0]
value = values[0]
switch assignStmt.Tok {
case token.DEFINE:
objectTypeMap.InsertObjectMap("auto", name, value)
ret = append(ret, "auto " + name + " = " + value + ";")
default:
ret = append(ret, name + assignStmt.Tok.String() + value + ";")
}
} else if valueSize == 1 {
value = values[0]
// names size > 1 and value size = 1
for id, n := range names {
if assignStmt.Tok == token.DEFINE {
objectTypeMap.InsertObjectMap("auto", name, value)
}
if id == 0 {
name += n
} else {
name += ", " + n
}
}
switch assignStmt.Tok {
case token.DEFINE:
ret = append(ret, "auto [" + name + "] = " + value + ";")
case token.ASSIGN:
includeFileMap["std::tie"] = "tuple"
ret = append(ret, "std::tie(" + name + ") = " + value + ";")
default:
log.Fatal("NOT SUPPORT MULTI VALUE ASSIGN, token = " + assignStmt.Tok.String())
}
} else if nameSize == valueSize {
var nameType string
switch assignStmt.Tok {
case token.DEFINE:
nameType = "auto"
case token.ASSIGN:
nameType = ""
default:
log.Fatal("NOT SUPPORT MULTI VALUE ASSIGN, token = " + assignStmt.Tok.String())
}
for idx, n := range names {
name = n
value = values[idx]
ret = append(ret, nameType + " " + name + " = " + value + ";")
}
} else {
log.Fatal("nameSize does not equal valueSize, nameSize: " + strconv.Itoa(nameSize) + ", valueSize: " + strconv.Itoa(valueSize))
}
return ret
}