-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparse_map_analysis.go
113 lines (108 loc) · 3.68 KB
/
parse_map_analysis.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
package f8n
import (
"strings"
kitModuleAns "github.com/webnice/kit/v4/module/ans"
)
// Анализатор, выделение сущности, проверка.
func (f8n *impl) analysis(node *Map) (ret []*ParseError) {
var (
fxp func([]*ParseError, Err) []*ParseError
n int
)
// Функция сборки ошибки.
fxp = func(r []*ParseError, e Err) []*ParseError {
var eo = &ParseError{Ei: e}
eo.Ev = append(eo.Ev, kitModuleAns.RestErrorField{
Field: keyFilter,
Message: eo.Ei.Error(),
})
return append(r, eo)
}
// Присвоение сущности по умолчанию.
if node.TagBegin == OriginUnknown.String() && node.TagEnd == OriginUnknown.String() && node.Content != "" {
node.Origin = OriginFiltration
return
}
for n = range OriginAll {
if strings.EqualFold(OriginAll[n].String(), strings.ToLower(node.TagBegin)) && node.Origin == OriginUnknown {
node.Origin = OriginAll[n]
}
if strings.EqualFold(node.TagBegin, pairBeg) && node.Origin == OriginUnknown {
node.Origin = OriginOperatorBracket
}
}
defer func() {
if len(ret) > 0 {
return
}
switch node.Origin {
case OriginUnknown:
if node.TagBegin == pairBeg || node.TagEnd == pairEnd {
ret = fxp(ret, f8n.Errors().PairedTagNotMatch(node.TagBegin, node.TagEnd))
return
}
case OriginOperatorBracket:
if node.TagBegin != pairBeg || node.TagEnd != pairEnd {
ret = fxp(ret, f8n.Errors().PairedTagNotMatch(node.TagBegin, node.TagEnd))
return
}
}
}()
// Проверка операторных скобок.
if node.Origin == OriginOperatorBracket && len(node.Node) == 0 {
ret = fxp(ret, f8n.Errors().OperatorBracketEmpty())
return
}
if node.Origin == OriginOperatorBracket && len(node.Node) == 1 {
ret = fxp(ret, f8n.Errors().OperatorBracketOneItem())
return
}
// Между операторными скобками должна быть логическая операция.
for n = range node.Node {
if node.Node[n].Origin == OriginOperatorBracket {
switch n {
case 0:
if len(node.Node) > 1 && node.Node[n+1].Origin == OriginOperatorBracket {
ret = fxp(ret, f8n.Errors().NoLogicalOperationBetweenBrackets())
return
}
default:
if node.Node[n-1].Origin == OriginOperatorBracket {
ret = fxp(ret, f8n.Errors().NoLogicalOperationBetweenBrackets())
return
}
}
}
}
// Проверка корректности применения логических операций.
for n = range node.Node {
if node.Node[n].Origin == OriginOr || node.Node[n].Origin == OriginAnd {
// Не указан второй аргумент для логической операции.
if n == 0 || n == len(node.Node)-1 {
ret = fxp(ret, f8n.Errors().WrongLogicalOperation(node.Node[n].Origin))
return
}
// Логическая операция применяется к логической операции (справа).
if node.Node[n+1].Origin == OriginOr || node.Node[n+1].Origin == OriginAnd {
ret = fxp(ret, f8n.Errors().WrongLogicalOperation(node.Node[n].Origin))
return
}
}
// С одной из сторон от наименования фильтрации должна быть логическая операция.
if node.Node[n].Origin == OriginFiltration {
switch n {
case 0:
if len(node.Node) > 1 && (node.Node[n+1].Origin != OriginOr && node.Node[n+1].Origin != OriginAnd) {
ret = fxp(ret, f8n.Errors().WrongLogicalOperation(node.Node[n].Origin))
return
}
default:
if node.Node[n-1].Origin != OriginOr && node.Node[n-1].Origin != OriginAnd {
ret = fxp(ret, f8n.Errors().WrongLogicalOperation(node.Node[n].Origin))
return
}
}
}
}
return
}