-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdemo.go
More file actions
executable file
·152 lines (126 loc) · 3.9 KB
/
Copy pathdemo.go
File metadata and controls
executable file
·152 lines (126 loc) · 3.9 KB
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package main
import (
"fmt"
"github.com/weaweawe01/ParserSpel/ast"
"log"
)
// 演示 SpEL 解析器的高级功能
func demonstrateAdvancedFeatures() {
fmt.Println("高级 SpEL 功能演示")
fmt.Println("==================")
parser := ast.NewSpelExpressionParser()
// 测试各种表达式类型
examples := map[string]string{
"数值计算": "((10 + 5) * 2) / 3",
"字符串操作": "'Hello' + ' ' + 'World'",
"布尔逻辑": "(true || false) && !false",
"比较运算": "42 > 30 && 'abc' == 'abc'",
"正则匹配": "'Test123' matches '[A-Z][a-z]+[0-9]+'",
"混合表达式": "5 > 3 && 'test' == 'test'",
"复杂逻辑": "(age > 18 && age < 65) || isVip == true",
"属性访问": "user.profile.name",
"安全导航": "user?.profile?.email",
"变量引用": "#root.getValue()",
"Bean引用": "@userService.findById(123)",
}
for description, expression := range examples {
fmt.Printf("\n【%s】\n", description)
fmt.Printf("表达式: %s\n", expression)
expr, err := parser.ParseExpression(expression)
if err != nil {
fmt.Printf("解析错误: %v\n", err)
continue
}
fmt.Printf("AST结构: %s\n", expr.ToStringAST())
value, err := expr.GetValue()
if err != nil {
fmt.Printf("求值错误: %v\n", err)
} else {
fmt.Printf("计算结果: %v (%T)\n", value, value)
}
}
}
// 演示语法分析的详细过程
func demonstrateParsingDetails() {
fmt.Println("\n\n语法分析详细过程")
fmt.Println("==================")
testExpression := "2 + 3 * 4 > 10 && true"
fmt.Printf("测试表达式: %s\n\n", testExpression)
// 1. 词法分析
fmt.Println("1. 词法分析结果:")
tokenizer := ast.NewTokenizer(testExpression)
tokens, err := tokenizer.Process()
if err != nil {
log.Printf("词法分析错误: %v\n", err)
return
}
for i, token := range tokens {
fmt.Printf(" Token[%d]: %s\n", i, token.String())
}
// 2. 语法分析
fmt.Println("\n2. 语法分析结果:")
parser := ast.NewSpelExpressionParser()
expr, err := parser.ParseExpression(testExpression)
if err != nil {
fmt.Printf("语法分析错误: %v\n", err)
return
}
fmt.Printf(" AST: %s\n", expr.ToStringAST())
// 3. 表达式求值
fmt.Println("\n3. 表达式求值:")
value, err := expr.GetValue()
if err != nil {
fmt.Printf("求值错误: %v\n", err)
} else {
fmt.Printf(" 结果: %v (%T)\n", value, value)
}
// 4. 解析步骤说明
fmt.Println("\n4. 解析步骤说明:")
fmt.Println(" ① 2 + 3 * 4 → 2 + (3 * 4) → 2 + 12 → 14")
fmt.Println(" ② 14 > 10 → true")
fmt.Println(" ③ true && true → true")
}
// 验证运算符优先级
func demonstrateOperatorPrecedence() {
fmt.Println("\n\n运算符优先级验证")
fmt.Println("==================")
parser := ast.NewSpelExpressionParser()
testCases := []struct {
expression string
expected interface{}
description string
}{
{"2 + 3 * 4", int64(14), "乘法优先于加法"},
{"(2 + 3) * 4", int64(20), "括号改变优先级"},
{"10 - 6 / 2", int64(7), "除法优先于减法"},
{"true || false && false", true, "AND 优先于 OR"},
{"!false && true", true, "NOT 优先于 AND"},
{"5 > 3 && 2 < 4", true, "比较优先于逻辑"},
}
for i, tc := range testCases {
fmt.Printf("\n测试 %d: %s\n", i+1, tc.description)
fmt.Printf("表达式: %s\n", tc.expression)
expr, err := parser.ParseExpression(tc.expression)
if err != nil {
fmt.Printf("解析错误: %v\n", err)
continue
}
value, err := expr.GetValue()
if err != nil {
fmt.Printf("求值错误: %v\n", err)
continue
}
fmt.Printf("实际结果: %v\n", value)
fmt.Printf("预期结果: %v\n", tc.expected)
if fmt.Sprintf("%v", value) == fmt.Sprintf("%v", tc.expected) {
fmt.Println("✅ 测试通过")
} else {
fmt.Println("❌ 测试失败")
}
}
}
func runAdvancedDemo() {
demonstrateAdvancedFeatures()
demonstrateParsingDetails()
demonstrateOperatorPrecedence()
}