-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathexprFor.go
129 lines (114 loc) · 2.96 KB
/
exprFor.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
package lit
import (
"github.com/pywee/lit/global"
"github.com/pywee/lit/types"
)
// FIXME 未针对for语句的合法性做充分检查
// parseIdentedFOR 解析for语句
func (r *expression) parseIdentedFOR(expr []*global.Structure, blocks []*global.Block, innerVar global.InnerVar, i int) ([]*global.Block, int, error) {
var (
// rlen 数据长度
rlen = len(expr)
// foundCurlyBracket 花括号标记
foundCurlyBracket bool
// curlyBracketCount 计算花括号
curlyBracketCount uint8
// conditions for 条件
conditions = make([]*global.Structure, 0, 12)
// curlyBracketCode 花括号内的代码块
curlyBracketCode = make([]*global.Structure, 0, 10)
)
for j := i; j < rlen; j++ {
exprJ := expr[j]
if exprJ.Tok == "{" {
curlyBracketCount++
foundCurlyBracket = true
} else if exprJ.Tok == "}" {
curlyBracketCount--
}
if foundCurlyBracket {
curlyBracketCode = append(curlyBracketCode, exprJ)
if curlyBracketCount == 0 {
i = j
break
}
} else {
conditions = append(conditions, exprJ)
}
}
blocks = append(blocks, &global.Block{
Name: "FOR",
ForExt: &global.ForExpression{Type: types.TypeForExpressionIteration, Conditions: conditions, Code: curlyBracketCode[1 : len(curlyBracketCode)-1]},
Type: types.CodeTypeIdentFOR,
})
return blocks, i, nil
}
// execFORType1 解析以下形式的 for 流程控制:
// n = 0; n < y; n ++
func (r *expression) execFORType1(forExpr *global.ForExpression, innerVar global.InnerVar) error {
var (
lf int
cd1 = make([]*global.Structure, 0, 5)
cd2 = make([]*global.Structure, 0, 5)
conditions = forExpr.Conditions
)
for i := 0; i < len(conditions); i++ {
if conditions[i].Tok == ";" {
if len(cd1) == 0 {
cd1 = conditions[1 : i+1]
} else if len(cd2) == 0 {
cd2 = conditions[len(cd1)+1 : i]
lf = i
break
}
}
}
// n = 0
if _, err := r.initExpr(cd1, innerVar, nil); err != nil {
return err
}
// n ++
cd3 := conditions[lf+1:]
cLen := len(cd3)
if cLen < 2 {
return types.ErrorForExpression
}
if cLen == 2 {
if tok := cd3[1].Tok; tok != "++" && tok != "--" {
return types.ErrorForExpression
}
}
// FIXME 暂未基于此类表达式做通用处理
if cLen >= 3 {
if tok := cd3[1].Tok; tok != "+=" && tok != "-=" {
return types.ErrorForExpression
}
}
cd3 = append(cd3, &global.Structure{Tok: ";", Lit: ";"})
var result *global.Structure
for {
// n < y
rv, err := r.parse(cd2, innerVar)
if err != nil {
return err
}
if !global.TransformAllToBool(rv) {
break
}
if result, err = r.initExpr(forExpr.Code, innerVar, &parsing{isInLoop: true}); err != nil {
return err
}
if _, err = r.initExpr(cd3, innerVar, &parsing{isInLoop: true}); err != nil {
return err
}
// 发现 continue 则跳出当前循环
if result != nil && result.Tok == "continue" {
continue
}
// 发现 break 则跳出当前循环
if result != nil && result.Tok == "break" {
break
}
}
return nil
}