-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathsuffix.go
108 lines (97 loc) · 2.72 KB
/
suffix.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
package gisp
import (
p "github.com/Dwarfartisan/goparsec"
)
// DotSuffix 表示带 dot 分割的后缀的表达式
func DotSuffix(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
d, err := DotParser(st)
if err != nil {
return nil, err
}
return dotSuffix(Dot{x, d.(Atom)})(st)
}
}
func dotSuffix(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
d, err := p.Try(DotParser)(st)
if err != nil {
return x, nil
}
return dotSuffix(Dot{x, d.(Atom)})(st)
}
}
// BracketSuffix 表示带 [] 后缀的表达式
func BracketSuffix(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
b, err := p.Try(BracketParser)(st)
if err != nil {
return nil, err
}
return bracketSuffix(Bracket{x, b.([]interface{})})(st)
}
}
// BracketSuffixExt 带扩展环境,可以在指定的环境中解释[]中的token
func BracketSuffixExt(env Env) func(interface{}) p.Parser {
return func(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
b, err := p.Try(BracketParserExt(env))(st)
if err != nil {
return nil, err
}
return bracketSuffixExt(env)(Bracket{x, b.([]interface{})})(st)
}
}
}
func bracketSuffix(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
b, err := BracketParser(st)
if err != nil {
return x, nil
}
return Bracket{x, b.([]interface{})}, nil
}
}
func bracketSuffixExt(env Env) func(interface{}) p.Parser {
return func(x interface{}) p.Parser {
return func(st p.ParseState) (interface{}, error) {
b, err := BracketParserExt(env)(st)
if err != nil {
return x, nil
}
return Bracket{x, b.([]interface{})}, nil
}
}
}
// DotSuffixParser 定义 dot 表达式判定
func DotSuffixParser(x interface{}) p.Parser {
return p.Either(p.Try(DotSuffix(x)), p.Return(x))
}
// BracketSuffixParser 定义 bracket 表达式判定
func BracketSuffixParser(x interface{}) p.Parser {
return p.Either(p.Try(BracketSuffix(x)), p.Return(x))
}
// SuffixParser 定义了后缀表达式的通用判定
func SuffixParser(prefix interface{}) p.Parser {
suffix := p.Either(p.Try(DotSuffix(prefix)), BracketSuffix(prefix))
return func(st p.ParseState) (interface{}, error) {
s, err := suffix(st)
if err != nil {
return prefix, nil
}
return SuffixParser(s)(st)
}
}
// SuffixParserExt 在后缀表达式判定中允许传入环境
func SuffixParserExt(env Env) func(interface{}) p.Parser {
return func(prefix interface{}) p.Parser {
suffix := p.Either(p.Try(DotSuffix(prefix)), BracketSuffixExt(env)(prefix))
return func(st p.ParseState) (interface{}, error) {
s, err := suffix(st)
if err != nil {
return prefix, nil
}
return SuffixParser(s)(st)
}
}
}