-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinfixTransfer.go
87 lines (76 loc) · 1.74 KB
/
infixTransfer.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
package regexgo
type stackValue struct {
val byte
numberOfDot int
numberOfAlt int
}
// over two word have the concatenation operator
// And In the brackets mean the another pattern
// so need to record the dot number and alternative operation number push to stack
// for after end the brackets
func (r *regexgo) infix2Post(pattern string) string {
stack := make([]stackValue, 0)
newPattern := make([]byte, 0)
numberOfDot := 0
numberOfAlt := 0
for i := range pattern {
switch pattern[i] {
case '(':
if numberOfDot > 1 {
numberOfDot--
newPattern = append(newPattern, '.')
}
s := stackValue{
val: pattern[i],
numberOfDot: numberOfDot,
numberOfAlt: numberOfAlt,
}
stack = append(stack, s)
numberOfAlt = 0
numberOfDot = 0
case '+', '*', '?':
newPattern = append(newPattern, pattern[i])
case ')':
if len(stack) == 0 {
return ""
}
numberOfDot--
for numberOfDot > 0 {
numberOfDot--
newPattern = append(newPattern, '.')
}
for numberOfAlt > 1 {
numberOfAlt--
newPattern = append(newPattern, '|')
}
numberOfAlt = stack[len(stack)-1].numberOfAlt
numberOfDot = stack[len(stack)-1].numberOfDot
stack = stack[0 : len(stack)-1]
numberOfDot++
case '|':
numberOfDot--
for numberOfDot > 0 {
newPattern = append(newPattern, '.')
numberOfDot--
}
numberOfAlt++
default:
if numberOfDot > 1 {
newPattern = append(newPattern, '.')
numberOfDot--
}
newPattern = append(newPattern, pattern[i])
numberOfDot++
}
}
numberOfDot--
for numberOfDot > 0 {
newPattern = append(newPattern, '.')
numberOfDot--
}
for numberOfAlt > 0 {
numberOfAlt--
newPattern = append(newPattern, '|')
}
return string(newPattern)
}