-
Notifications
You must be signed in to change notification settings - Fork 67
/
tokens.go
90 lines (72 loc) 路 2.09 KB
/
tokens.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
package expression
type Token struct {
Identifier string
Type TermType
}
func GetTokens(statement string) ([]Token, error) {
parsedStatement, err := ParseStatement(statement)
if err != nil {
return []Token{}, invalidSyntaxError(err, statement)
}
leftTokens := extractTokensFromExpression(parsedStatement.Left)
rightTokens := []Token{}
if parsedStatement.Right != nil {
rightTokens = extractTokensFromExpression(parsedStatement.Right)
}
allTokens := make([]Token, 0, len(leftTokens)+len(rightTokens))
allTokens = append(allTokens, leftTokens...)
allTokens = append(allTokens, rightTokens...)
return allTokens, nil
}
func GetTokensFromExpression(expression string) ([]Token, error) {
parsedExpression, err := Parse(expression)
if err != nil {
return []Token{}, invalidSyntaxError(err, expression)
}
return extractTokensFromExpression(&parsedExpression), nil
}
func extractTokensFromExpression(expr *Expr) []Token {
tokens := make([]Token, 0)
tokens = append(tokens, extractTokenFromTerm(expr.Left)...)
for _, opExpr := range expr.Right {
rightTokens := extractTokenFromTerm(opExpr.Term)
tokens = append(tokens, rightTokens...)
}
for _, filter := range expr.Filters {
tokens = append(tokens, Token{
Identifier: filter.Name,
Type: FunctionCallType,
})
for _, arg := range filter.Args {
tokens = append(tokens, extractTokenFromTerm(arg)...)
}
}
return tokens
}
func extractTokenFromTerm(term *Term) []Token {
tokens := make([]Token, 0)
tokens = append(tokens, Token{
Identifier: extractIdentifierFromTerm(term),
Type: term.Type(),
})
termType := term.Type()
if termType == StrType {
for _, arg := range term.Str.Args {
tokens = append(tokens, extractTokensFromExpression(&arg)...)
}
}
return tokens
}
func extractIdentifierFromTerm(term *Term) string {
if term.Type() == FunctionCallType {
return term.FunctionCall.Name
}
if term.Type() == EnvironmentType {
return term.Environment.name
}
if term.Type() == VariableType {
return term.Variable.name
}
// all other types don't have names, so return an empty string
return ""
}