pytest-dsl 0.7.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytest_dsl-0.7.0/pytest_dsl.egg-info → pytest_dsl-0.8.0}/PKG-INFO +49 -1
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/README.md +48 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pyproject.toml +1 -1
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/dsl_executor.py +61 -3
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/lexer.py +8 -2
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/parser.py +18 -3
- pytest_dsl-0.8.0/pytest_dsl/core/parsetab.py +130 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0/pytest_dsl.egg-info}/PKG-INFO +49 -1
- pytest_dsl-0.7.0/pytest_dsl/core/parsetab.py +0 -125
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/LICENSE +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/MANIFEST.in +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/__init__.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/cli.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/conftest_adapter.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/__init__.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auth_provider.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auto_decorator.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auto_directory.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/context.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/custom_keyword_manager.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/dsl_executor_utils.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/global_context.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/http_client.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/http_request.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/keyword_manager.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/plugin_discovery.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/utils.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/variable_utils.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/yaml_loader.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/yaml_vars.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/docs/custom_keywords.md +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/__init__.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/assertion_example.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/boolean_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/expression_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_advanced_keywords.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_custom_keywords.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_default_values.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/__init__.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/builtin_auth_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/file_reference_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_advanced.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_example.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_length_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_retry_assertions.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_retry_assertions_enhanced.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_with_yaml.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/new_retry_test.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_assertions_only.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_config_only.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_debug.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_with_fix.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/simple_retry.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/vars.yaml +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/api_basics.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/assertions.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/loops.auto +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_assert.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_custom_keyword.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_http.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_quickstart.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/__init__.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/assertion_keywords.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/global_keywords.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/http_keywords.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/system_keywords.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/main_adapter.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/plugin.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/SOURCES.txt +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/dependency_links.txt +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/entry_points.txt +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/requires.txt +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/top_level.txt +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/setup.cfg +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/setup.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_end_to_end_seamless.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_enhanced_variable_access.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_http_assertions_extractors.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_seamless_variable_sync.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_variable_sync.py +0 -0
- {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_variable_sync_demo.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pytest-dsl
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.8.0
|
4
4
|
Summary: A DSL testing framework based on pytest
|
5
5
|
Author: Chen Shuanglin
|
6
6
|
License: MIT
|
@@ -114,8 +114,32 @@ version = "1.0.0"
|
|
114
114
|
# 数字变量
|
115
115
|
port = 8080
|
116
116
|
|
117
|
+
# 布尔值变量
|
118
|
+
is_enabled = True
|
119
|
+
is_disabled = False
|
120
|
+
|
117
121
|
# 列表
|
118
122
|
users = ["alice", "bob", "charlie"]
|
123
|
+
|
124
|
+
# 字典
|
125
|
+
user_info = {"name": "张三", "age": 30, "city": "北京"}
|
126
|
+
|
127
|
+
# 嵌套字典
|
128
|
+
config = {
|
129
|
+
"database": {
|
130
|
+
"host": "localhost",
|
131
|
+
"port": 3306,
|
132
|
+
"name": "test_db"
|
133
|
+
},
|
134
|
+
"api": {
|
135
|
+
"base_url": "https://api.example.com",
|
136
|
+
"timeout": 30
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
# 访问字典值
|
141
|
+
username = ${user_info["name"]}
|
142
|
+
db_host = ${config["database"]["host"]}
|
119
143
|
```
|
120
144
|
|
121
145
|
#### 流程控制
|
@@ -129,12 +153,33 @@ else
|
|
129
153
|
[打印], 内容: "测试失败"
|
130
154
|
end
|
131
155
|
|
156
|
+
# 使用布尔值的条件判断
|
157
|
+
is_ready = True
|
158
|
+
if ${is_ready} do
|
159
|
+
[打印], 内容: "系统就绪"
|
160
|
+
end
|
161
|
+
|
132
162
|
# 循环结构
|
133
163
|
num = 4
|
134
164
|
for i in range(1, num) do
|
135
165
|
[打印], 内容: "执行第 ${i} 次"
|
136
166
|
end
|
137
167
|
|
168
|
+
# 循环中的break和continue
|
169
|
+
for j in range(1, 11) do
|
170
|
+
# 跳过偶数
|
171
|
+
if ${j} % 2 == 0 do
|
172
|
+
continue
|
173
|
+
end
|
174
|
+
|
175
|
+
# 当达到7时退出循环
|
176
|
+
if ${j} == 7 do
|
177
|
+
[打印], 内容: "达到7,退出循环"
|
178
|
+
break
|
179
|
+
end
|
180
|
+
|
181
|
+
[打印], 内容: "奇数: ${j}"
|
182
|
+
end
|
138
183
|
```
|
139
184
|
|
140
185
|
### 2. 内置关键字详解
|
@@ -1034,6 +1079,9 @@ pytest-dsl api_basic.dsl
|
|
1034
1079
|
- ✅ 断言重试机制
|
1035
1080
|
- ✅ 认证功能示例
|
1036
1081
|
- ✅ 数据驱动测试(pytest集成)
|
1082
|
+
- ✅ 布尔值支持和条件判断
|
1083
|
+
- ✅ 字典定义和嵌套访问
|
1084
|
+
- ✅ 循环控制语句(break/continue)
|
1037
1085
|
|
1038
1086
|
---
|
1039
1087
|
|
@@ -83,8 +83,32 @@ version = "1.0.0"
|
|
83
83
|
# 数字变量
|
84
84
|
port = 8080
|
85
85
|
|
86
|
+
# 布尔值变量
|
87
|
+
is_enabled = True
|
88
|
+
is_disabled = False
|
89
|
+
|
86
90
|
# 列表
|
87
91
|
users = ["alice", "bob", "charlie"]
|
92
|
+
|
93
|
+
# 字典
|
94
|
+
user_info = {"name": "张三", "age": 30, "city": "北京"}
|
95
|
+
|
96
|
+
# 嵌套字典
|
97
|
+
config = {
|
98
|
+
"database": {
|
99
|
+
"host": "localhost",
|
100
|
+
"port": 3306,
|
101
|
+
"name": "test_db"
|
102
|
+
},
|
103
|
+
"api": {
|
104
|
+
"base_url": "https://api.example.com",
|
105
|
+
"timeout": 30
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
# 访问字典值
|
110
|
+
username = ${user_info["name"]}
|
111
|
+
db_host = ${config["database"]["host"]}
|
88
112
|
```
|
89
113
|
|
90
114
|
#### 流程控制
|
@@ -98,12 +122,33 @@ else
|
|
98
122
|
[打印], 内容: "测试失败"
|
99
123
|
end
|
100
124
|
|
125
|
+
# 使用布尔值的条件判断
|
126
|
+
is_ready = True
|
127
|
+
if ${is_ready} do
|
128
|
+
[打印], 内容: "系统就绪"
|
129
|
+
end
|
130
|
+
|
101
131
|
# 循环结构
|
102
132
|
num = 4
|
103
133
|
for i in range(1, num) do
|
104
134
|
[打印], 内容: "执行第 ${i} 次"
|
105
135
|
end
|
106
136
|
|
137
|
+
# 循环中的break和continue
|
138
|
+
for j in range(1, 11) do
|
139
|
+
# 跳过偶数
|
140
|
+
if ${j} % 2 == 0 do
|
141
|
+
continue
|
142
|
+
end
|
143
|
+
|
144
|
+
# 当达到7时退出循环
|
145
|
+
if ${j} == 7 do
|
146
|
+
[打印], 内容: "达到7,退出循环"
|
147
|
+
break
|
148
|
+
end
|
149
|
+
|
150
|
+
[打印], 内容: "奇数: ${j}"
|
151
|
+
end
|
107
152
|
```
|
108
153
|
|
109
154
|
### 2. 内置关键字详解
|
@@ -1003,6 +1048,9 @@ pytest-dsl api_basic.dsl
|
|
1003
1048
|
- ✅ 断言重试机制
|
1004
1049
|
- ✅ 认证功能示例
|
1005
1050
|
- ✅ 数据驱动测试(pytest集成)
|
1051
|
+
- ✅ 布尔值支持和条件判断
|
1052
|
+
- ✅ 字典定义和嵌套访问
|
1053
|
+
- ✅ 循环控制语句(break/continue)
|
1006
1054
|
|
1007
1055
|
---
|
1008
1056
|
|
@@ -13,6 +13,16 @@ from pytest_dsl.core.yaml_vars import yaml_vars
|
|
13
13
|
from pytest_dsl.core.variable_utils import VariableReplacer
|
14
14
|
|
15
15
|
|
16
|
+
class BreakException(Exception):
|
17
|
+
"""Break控制流异常"""
|
18
|
+
pass
|
19
|
+
|
20
|
+
|
21
|
+
class ContinueException(Exception):
|
22
|
+
"""Continue控制流异常"""
|
23
|
+
pass
|
24
|
+
|
25
|
+
|
16
26
|
class DSLExecutor:
|
17
27
|
"""DSL执行器,负责执行解析后的AST
|
18
28
|
|
@@ -175,7 +185,7 @@ class DSLExecutor:
|
|
175
185
|
"""
|
176
186
|
left_value = self.eval_expression(expr_node.children[0])
|
177
187
|
right_value = self.eval_expression(expr_node.children[1])
|
178
|
-
operator = expr_node.value # 操作符: +, -, *,
|
188
|
+
operator = expr_node.value # 操作符: +, -, *, /, %
|
179
189
|
|
180
190
|
# 尝试类型转换 - 如果是字符串数字则转为数字
|
181
191
|
if isinstance(left_value, str) and str(left_value).replace('.', '', 1).isdigit():
|
@@ -210,6 +220,11 @@ class DSLExecutor:
|
|
210
220
|
if right_value == 0:
|
211
221
|
raise Exception("除法错误: 除数不能为0")
|
212
222
|
return left_value / right_value
|
223
|
+
elif operator == '%':
|
224
|
+
# 模运算时检查除数是否为0
|
225
|
+
if right_value == 0:
|
226
|
+
raise Exception("模运算错误: 除数不能为0")
|
227
|
+
return left_value % right_value
|
213
228
|
else:
|
214
229
|
raise Exception(f"未知的算术操作符: {operator}")
|
215
230
|
|
@@ -458,7 +473,24 @@ class DSLExecutor:
|
|
458
473
|
self.variable_replacer.local_variables[var_name] = i
|
459
474
|
self.test_context.set(var_name, i) # 同时添加到测试上下文
|
460
475
|
with allure.step(f"循环轮次: {var_name} = {i}"):
|
461
|
-
|
476
|
+
try:
|
477
|
+
self.execute(node.children[2])
|
478
|
+
except BreakException:
|
479
|
+
# 遇到break语句,退出循环
|
480
|
+
allure.attach(
|
481
|
+
f"在 {var_name} = {i} 时遇到break语句,退出循环",
|
482
|
+
name="循环Break",
|
483
|
+
attachment_type=allure.attachment_type.TEXT
|
484
|
+
)
|
485
|
+
break
|
486
|
+
except ContinueException:
|
487
|
+
# 遇到continue语句,跳过本次循环
|
488
|
+
allure.attach(
|
489
|
+
f"在 {var_name} = {i} 时遇到continue语句,跳过本次循环",
|
490
|
+
name="循环Continue",
|
491
|
+
attachment_type=allure.attachment_type.TEXT
|
492
|
+
)
|
493
|
+
continue
|
462
494
|
|
463
495
|
def _execute_keyword_call(self, node):
|
464
496
|
"""执行关键字调用"""
|
@@ -511,6 +543,30 @@ class DSLExecutor:
|
|
511
543
|
expr_node = node.children[0]
|
512
544
|
return self.eval_expression(expr_node)
|
513
545
|
|
546
|
+
@allure.step("执行break语句")
|
547
|
+
def _handle_break(self, node):
|
548
|
+
"""处理break语句
|
549
|
+
|
550
|
+
Args:
|
551
|
+
node: Break节点
|
552
|
+
|
553
|
+
Raises:
|
554
|
+
BreakException: 抛出异常来实现break控制流
|
555
|
+
"""
|
556
|
+
raise BreakException()
|
557
|
+
|
558
|
+
@allure.step("执行continue语句")
|
559
|
+
def _handle_continue(self, node):
|
560
|
+
"""处理continue语句
|
561
|
+
|
562
|
+
Args:
|
563
|
+
node: Continue节点
|
564
|
+
|
565
|
+
Raises:
|
566
|
+
ContinueException: 抛出异常来实现continue控制流
|
567
|
+
"""
|
568
|
+
raise ContinueException()
|
569
|
+
|
514
570
|
@allure.step("执行条件语句")
|
515
571
|
def _handle_if_statement(self, node):
|
516
572
|
"""处理if-elif-else语句
|
@@ -664,7 +720,9 @@ class DSLExecutor:
|
|
664
720
|
'CustomKeyword': lambda _: None, # 添加对CustomKeyword节点的处理,只需注册不需执行
|
665
721
|
'RemoteImport': self._handle_remote_import,
|
666
722
|
'RemoteKeywordCall': self._execute_remote_keyword_call,
|
667
|
-
'AssignmentRemoteKeywordCall': self._handle_assignment_remote_keyword_call
|
723
|
+
'AssignmentRemoteKeywordCall': self._handle_assignment_remote_keyword_call,
|
724
|
+
'Break': self._handle_break,
|
725
|
+
'Continue': self._handle_continue
|
668
726
|
}
|
669
727
|
|
670
728
|
handler = handlers.get(node.type)
|
@@ -16,7 +16,9 @@ reserved = {
|
|
16
16
|
'if': 'IF', # 添加if关键字支持
|
17
17
|
'as': 'AS', # 添加as关键字支持,用于远程关键字别名
|
18
18
|
'function': 'FUNCTION', # 添加function关键字支持,用于自定义关键字定义
|
19
|
-
'teardown': 'TEARDOWN' # 添加teardown关键字支持,用于清理操作
|
19
|
+
'teardown': 'TEARDOWN', # 添加teardown关键字支持,用于清理操作
|
20
|
+
'break': 'BREAK', # 添加break关键字支持,用于循环控制
|
21
|
+
'continue': 'CONTINUE' # 添加continue关键字支持,用于循环控制
|
20
22
|
}
|
21
23
|
|
22
24
|
# token 名称列表
|
@@ -53,6 +55,7 @@ tokens = [
|
|
53
55
|
'MINUS', # 减法 -
|
54
56
|
'TIMES', # 乘法 *
|
55
57
|
'DIVIDE', # 除法 /
|
58
|
+
'MODULO', # 模运算 %
|
56
59
|
'PIPE', # 管道符 |,用于远程关键字调用
|
57
60
|
] + list(reserved.values())
|
58
61
|
|
@@ -76,10 +79,13 @@ t_PLUS = r'\+'
|
|
76
79
|
t_MINUS = r'-'
|
77
80
|
t_TIMES = r'\*'
|
78
81
|
t_DIVIDE = r'/'
|
82
|
+
t_MODULO = r'%'
|
79
83
|
|
80
84
|
# 增加PLACEHOLDER规则,匹配 ${变量名} 格式,支持点号、数组索引和字典键访问
|
81
85
|
# 匹配: ${variable}, ${obj.prop}, ${arr[0]}, ${dict["key"]}, ${obj[0].prop} 等
|
82
|
-
t_PLACEHOLDER = r'\$\{[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*
|
86
|
+
t_PLACEHOLDER = (r'\$\{[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*'
|
87
|
+
r'(?:(?:\.[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*)'
|
88
|
+
r'|(?:\[[^\]]+\]))*\}')
|
83
89
|
|
84
90
|
# 添加管道符的正则表达式定义
|
85
91
|
t_PIPE = r'\|'
|
@@ -14,7 +14,7 @@ precedence = (
|
|
14
14
|
('left', 'COMMA'),
|
15
15
|
('left', 'GT', 'LT', 'GE', 'LE', 'EQ', 'NE'), # 比较运算符优先级
|
16
16
|
('left', 'PLUS', 'MINUS'), # 加减运算符优先级
|
17
|
-
('left', 'TIMES', 'DIVIDE'), #
|
17
|
+
('left', 'TIMES', 'DIVIDE', 'MODULO'), # 乘除模运算符优先级
|
18
18
|
('right', 'EQUALS'),
|
19
19
|
)
|
20
20
|
|
@@ -124,7 +124,9 @@ def p_statement(p):
|
|
124
124
|
| loop
|
125
125
|
| custom_keyword
|
126
126
|
| return_statement
|
127
|
-
| if_statement
|
127
|
+
| if_statement
|
128
|
+
| break_statement
|
129
|
+
| continue_statement'''
|
128
130
|
p[0] = p[1]
|
129
131
|
|
130
132
|
|
@@ -302,6 +304,16 @@ def p_return_statement(p):
|
|
302
304
|
p[0] = Node('Return', [p[2]])
|
303
305
|
|
304
306
|
|
307
|
+
def p_break_statement(p):
|
308
|
+
'''break_statement : BREAK'''
|
309
|
+
p[0] = Node('Break', [])
|
310
|
+
|
311
|
+
|
312
|
+
def p_continue_statement(p):
|
313
|
+
'''continue_statement : CONTINUE'''
|
314
|
+
p[0] = Node('Continue', [])
|
315
|
+
|
316
|
+
|
305
317
|
def p_if_statement(p):
|
306
318
|
'''if_statement : IF expression DO statements END
|
307
319
|
| IF expression DO statements elif_clauses END
|
@@ -367,7 +379,8 @@ def p_arithmetic_expr(p):
|
|
367
379
|
'''arithmetic_expr : expression PLUS expression
|
368
380
|
| expression MINUS expression
|
369
381
|
| expression TIMES expression
|
370
|
-
| expression DIVIDE expression
|
382
|
+
| expression DIVIDE expression
|
383
|
+
| expression MODULO expression'''
|
371
384
|
|
372
385
|
# 根据规则索引判断使用的是哪个操作符
|
373
386
|
if p.slice[2].type == 'PLUS':
|
@@ -378,6 +391,8 @@ def p_arithmetic_expr(p):
|
|
378
391
|
operator = '*'
|
379
392
|
elif p.slice[2].type == 'DIVIDE':
|
380
393
|
operator = '/'
|
394
|
+
elif p.slice[2].type == 'MODULO':
|
395
|
+
operator = '%'
|
381
396
|
else:
|
382
397
|
print(f"警告: 无法识别的操作符类型 {p.slice[2].type}")
|
383
398
|
operator = None
|
@@ -0,0 +1,130 @@
|
|
1
|
+
|
2
|
+
# parsetab.py
|
3
|
+
# This file is automatically generated. Do not edit.
|
4
|
+
# pylint: disable=W,C,R
|
5
|
+
_tabversion = '3.10'
|
6
|
+
|
7
|
+
_lr_method = 'LALR'
|
8
|
+
|
9
|
+
_lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDEMODULOrightEQUALSAS AUTHOR_KEYWORD BREAK COLON COMMA CONTINUE DATA_KEYWORD DATE DATE_KEYWORD DESCRIPTION_KEYWORD DIVIDE DO ELIF ELSE END EQ EQUALS FALSE FOR FUNCTION GE GT ID IF IMPORT_KEYWORD IN LBRACE LBRACKET LE LPAREN LT MINUS MODULO NAME_KEYWORD NE NUMBER PIPE PLACEHOLDER PLUS RANGE RBRACE RBRACKET REMOTE_KEYWORD RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN TIMES TRUE USINGstart : metadata statements teardown\n | metadata statements\n | statements teardown\n | statementsmetadata : metadata_items\n | emptyempty :metadata_items : metadata_item metadata_items\n | metadata_itemmetadata_item : NAME_KEYWORD COLON metadata_value\n | DESCRIPTION_KEYWORD COLON metadata_value\n | TAGS_KEYWORD COLON LBRACKET tags RBRACKET\n | AUTHOR_KEYWORD COLON metadata_value\n | DATE_KEYWORD COLON DATE\n | DATA_KEYWORD COLON data_source\n | IMPORT_KEYWORD COLON STRING\n | REMOTE_KEYWORD COLON STRING AS IDmetadata_value : STRING\n | IDtags : tag COMMA tags\n | tagtag : STRING\n | IDstatements : statement statements\n | statementstatement : assignment\n | keyword_call\n | remote_keyword_call\n | loop\n | custom_keyword\n | return_statement\n | if_statement\n | break_statement\n | continue_statementassignment : ID EQUALS expression\n | ID EQUALS keyword_call\n | ID EQUALS remote_keyword_callexpression : expr_atom\n | comparison_expr\n | arithmetic_exprexpr_atom : NUMBER\n | STRING\n | PLACEHOLDER\n | ID\n | boolean_expr\n | list_expr\n | dict_expr\n | LPAREN expression RPARENboolean_expr : TRUE\n | FALSElist_expr : LBRACKET list_items RBRACKET\n | LBRACKET RBRACKETlist_items : list_item\n | list_item COMMA list_itemslist_item : expressiondict_expr : LBRACE dict_items RBRACE\n | LBRACE RBRACEdict_items : dict_item\n | dict_item COMMA dict_itemsdict_item : expression COLON expressionloop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements ENDkeyword_call : LBRACKET ID RBRACKET COMMA parameter_list\n | LBRACKET ID RBRACKETparameter_list : parameter_itemsparameter_items : parameter_item COMMA parameter_items\n | parameter_itemparameter_item : ID COLON expressionteardown : TEARDOWN DO statements ENDdata_source : STRING USING IDcustom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements ENDparam_definitions : param_def_list\n | param_def_list : param_def COMMA param_def_list\n | param_defparam_def : ID EQUALS STRING\n | ID EQUALS NUMBER\n | IDreturn_statement : RETURN expressionbreak_statement : BREAKcontinue_statement : CONTINUEif_statement : IF expression DO statements END\n | IF expression DO statements elif_clauses END\n | IF expression DO statements ELSE statements END\n | IF expression DO statements elif_clauses ELSE statements ENDelif_clauses : elif_clause\n | elif_clause elif_clauseselif_clause : ELIF expression DO statementscomparison_expr : expr_atom GT expr_atom\n | expr_atom LT expr_atom\n | expr_atom GE expr_atom\n | expr_atom LE expr_atom\n | expr_atom EQ expr_atom\n | expr_atom NE expr_atomarithmetic_expr : expression PLUS expression\n | expression MINUS expression\n | expression TIMES expression\n | expression DIVIDE expression\n | expression MODULO expressionremote_keyword_call : ID PIPE LBRACKET ID RBRACKET COMMA parameter_list\n | ID PIPE LBRACKET ID RBRACKET'
|
10
|
+
|
11
|
+
_lr_action_items = {'ID':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,20,27,28,29,30,31,32,37,38,39,42,47,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,69,70,71,72,73,74,75,76,77,78,80,82,83,84,85,86,87,89,90,91,92,93,94,95,96,97,98,99,100,103,107,110,116,117,118,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,145,146,148,149,150,151,152,153,154,157,161,163,165,167,168,169,173,175,176,180,181,182,183,186,187,189,190,193,195,],[26,26,-5,-6,26,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,41,49,50,58,58,-79,-80,-8,72,72,72,82,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,58,-49,-50,58,58,26,-10,-18,-19,-11,115,-63,-13,-14,-15,-16,-44,-35,-36,-37,119,120,122,58,58,58,58,58,58,58,58,58,58,58,-52,-57,26,147,151,152,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,58,-56,58,58,-12,115,-62,-64,-66,-69,-17,-100,58,122,-81,26,58,58,147,147,26,-82,26,-67,-65,-99,58,-83,26,-70,-84,26,-61,]),'LBRACKET':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,29,30,31,32,37,40,47,48,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,69,70,71,72,73,75,76,77,78,80,82,83,84,85,86,90,91,92,93,94,95,96,97,98,99,100,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,145,148,149,150,151,152,153,154,161,163,165,167,173,175,176,180,181,182,183,186,187,189,190,193,195,],[20,20,-5,-6,20,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,65,65,-79,-80,-8,74,86,87,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,65,-49,-50,65,65,20,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,65,65,65,65,65,65,65,65,65,65,65,65,-52,-57,20,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,65,-56,65,65,-12,-62,-64,-66,-69,-17,-100,65,-81,20,65,65,20,-82,20,-67,-65,-99,65,-83,20,-70,-84,20,-61,]),'FOR':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[27,27,-5,-6,27,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,27,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,27,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,27,27,-82,27,-67,-65,-99,-83,27,-70,-84,27,-61,]),'FUNCTION':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[28,28,-5,-6,28,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,28,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,28,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,28,28,-82,28,-67,-65,-99,-83,28,-70,-84,28,-61,]),'RETURN':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[29,29,-5,-6,29,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,29,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,29,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,29,29,-82,29,-67,-65,-99,-83,29,-70,-84,29,-61,]),'IF':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[30,30,-5,-6,30,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,30,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,30,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,30,30,-82,30,-67,-65,-99,-83,30,-70,-84,30,-61,]),'BREAK':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[31,31,-5,-6,31,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,31,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,31,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,31,31,-82,31,-67,-65,-99,-83,31,-70,-84,31,-61,]),'CONTINUE':([0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,31,32,37,51,52,53,54,55,56,57,58,59,60,61,63,64,69,70,71,72,73,75,76,77,78,80,82,83,84,85,103,107,110,126,127,128,129,130,131,132,133,134,135,136,137,138,140,145,148,149,150,151,152,153,161,163,173,175,176,180,181,182,186,187,189,190,193,195,],[32,32,-5,-6,32,-9,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-8,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,32,-10,-18,-19,-11,-63,-13,-14,-15,-16,-44,-35,-36,-37,-52,-57,32,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-12,-62,-64,-66,-69,-17,-100,-81,32,32,-82,32,-67,-65,-99,-83,32,-70,-84,32,-61,]),'NAME_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[17,17,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'DESCRIPTION_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[18,18,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'TAGS_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[19,19,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'AUTHOR_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[21,21,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'DATE_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[22,22,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'DATA_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[23,23,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'IMPORT_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[24,24,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'REMOTE_KEYWORD':([0,7,70,71,72,73,76,77,78,80,145,151,152,],[25,25,-10,-18,-19,-11,-13,-14,-15,-16,-12,-69,-17,]),'$end':([1,3,6,8,9,10,11,12,13,14,15,16,31,32,33,34,36,51,52,53,54,55,56,57,58,59,60,61,63,64,68,75,82,83,84,85,103,107,126,127,128,129,130,131,132,133,134,135,136,137,138,140,144,148,149,150,153,161,175,180,181,182,186,189,190,195,],[0,-4,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-2,-3,-24,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-1,-63,-44,-35,-36,-37,-52,-57,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-68,-62,-64,-66,-100,-81,-82,-67,-65,-99,-83,-70,-84,-61,]),'TEARDOWN':([3,6,8,9,10,11,12,13,14,15,16,31,32,33,36,51,52,53,54,55,56,57,58,59,60,61,63,64,75,82,83,84,85,103,107,126,127,128,129,130,131,132,133,134,135,136,137,138,140,148,149,150,153,161,175,180,181,182,186,189,190,195,],[35,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,35,-24,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-63,-44,-35,-36,-37,-52,-57,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-62,-64,-66,-100,-81,-82,-67,-65,-99,-83,-70,-84,-61,]),'END':([6,8,9,10,11,12,13,14,15,16,31,32,36,51,52,53,54,55,56,57,58,59,60,61,63,64,75,82,83,84,85,103,107,111,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,148,149,150,153,161,162,164,175,177,178,180,181,182,184,185,186,189,190,191,194,195,],[-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-24,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-63,-44,-35,-36,-37,-52,-57,144,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,161,-62,-64,-66,-100,-81,175,-85,-82,186,-86,-67,-65,-99,189,190,-83,-70,-84,-87,195,-61,]),'ELSE':([6,8,9,10,11,12,13,14,15,16,31,32,36,51,52,53,54,55,56,57,58,59,60,61,63,64,75,82,83,84,85,103,107,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,148,149,150,153,161,162,164,175,178,180,181,182,186,189,190,191,195,],[-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-24,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-63,-44,-35,-36,-37,-52,-57,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,163,-62,-64,-66,-100,-81,176,-85,-82,-86,-67,-65,-99,-83,-70,-84,-87,-61,]),'ELIF':([6,8,9,10,11,12,13,14,15,16,31,32,36,51,52,53,54,55,56,57,58,59,60,61,63,64,75,82,83,84,85,103,107,126,127,128,129,130,131,132,133,134,135,136,137,138,140,143,148,149,150,153,161,164,175,180,181,182,186,189,190,191,195,],[-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-79,-80,-24,-78,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-63,-44,-35,-36,-37,-52,-57,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,165,-62,-64,-66,-100,-81,165,-82,-67,-65,-99,-83,-70,-84,-87,-61,]),'COLON':([17,18,19,21,22,23,24,25,52,53,54,55,56,57,58,59,60,61,63,64,103,107,109,126,127,128,129,130,131,132,133,134,135,136,137,138,140,147,],[38,39,40,42,43,44,45,46,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-52,-57,142,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,167,]),'EQUALS':([26,122,],[47,155,]),'PIPE':([26,82,],[48,48,]),'NUMBER':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,155,165,167,183,],[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,172,55,55,55,]),'STRING':([29,30,38,39,42,44,45,46,47,62,65,66,74,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,146,154,155,165,167,183,],[56,56,71,71,71,79,80,81,56,56,56,56,114,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,114,56,171,56,56,56,]),'PLACEHOLDER':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,]),'LPAREN':([29,30,47,50,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,121,139,141,142,154,165,167,183,],[62,62,62,89,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,154,62,62,62,62,62,62,62,]),'TRUE':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,63,]),'FALSE':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,]),'LBRACE':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,]),'DO':([35,52,53,54,55,56,57,58,59,60,61,63,64,67,103,107,126,127,128,129,130,131,132,133,134,135,136,137,138,140,156,179,192,],[69,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,110,-52,-57,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,173,187,193,]),'RBRACKET':([41,52,53,54,55,56,57,58,59,60,61,63,64,65,86,102,103,104,105,107,112,113,114,115,119,120,126,127,128,129,130,131,132,133,134,135,136,137,138,140,158,166,],[75,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,103,103,138,-52,-53,-55,-57,145,-21,-22,-23,75,153,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-54,-20,]),'DATE':([43,],[77,]),'IN':([49,],[88,]),'PLUS':([51,52,53,54,55,56,57,58,59,60,61,63,64,67,82,83,101,103,105,107,109,119,126,127,128,129,130,131,132,133,134,135,136,137,138,140,160,170,179,180,188,],[90,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,90,-44,90,90,-52,90,-57,90,-44,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,90,90,90,90,90,]),'MINUS':([51,52,53,54,55,56,57,58,59,60,61,63,64,67,82,83,101,103,105,107,109,119,126,127,128,129,130,131,132,133,134,135,136,137,138,140,160,170,179,180,188,],[91,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,91,-44,91,91,-52,91,-57,91,-44,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,91,91,91,91,91,]),'TIMES':([51,52,53,54,55,56,57,58,59,60,61,63,64,67,82,83,101,103,105,107,109,119,126,127,128,129,130,131,132,133,134,135,136,137,138,140,160,170,179,180,188,],[92,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,92,-44,92,92,-52,92,-57,92,-44,92,92,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,92,92,92,92,92,]),'DIVIDE':([51,52,53,54,55,56,57,58,59,60,61,63,64,67,82,83,101,103,105,107,109,119,126,127,128,129,130,131,132,133,134,135,136,137,138,140,160,170,179,180,188,],[93,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,93,-44,93,93,-52,93,-57,93,-44,93,93,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,93,93,93,93,93,]),'MODULO':([51,52,53,54,55,56,57,58,59,60,61,63,64,67,82,83,101,103,105,107,109,119,126,127,128,129,130,131,132,133,134,135,136,137,138,140,160,170,179,180,188,],[94,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,94,-44,94,94,-52,94,-57,94,-44,94,94,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,94,94,94,94,94,]),'RPAREN':([52,53,54,55,56,57,58,59,60,61,63,64,89,101,103,107,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,171,172,174,188,],[-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,-72,137,-52,-57,-77,156,-71,-74,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-75,-76,-73,192,]),'COMMA':([52,53,54,55,56,57,58,59,60,61,63,64,75,103,104,105,107,108,113,114,115,119,122,125,126,127,128,129,130,131,132,133,134,135,136,137,138,140,150,153,160,170,171,172,180,],[-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,116,-52,139,-55,-57,141,146,-22,-23,-44,-77,157,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,168,169,-60,183,-75,-76,-67,]),'RBRACE':([52,53,54,55,56,57,58,59,60,61,63,64,66,103,106,107,108,126,127,128,129,130,131,132,133,134,135,136,137,138,140,159,160,],[-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-49,-50,107,-52,140,-57,-58,-94,-95,-96,-97,-98,-88,-89,-90,-91,-92,-93,-48,-51,-56,-59,-60,]),'GT':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[95,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'LT':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[96,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'GE':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[97,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'LE':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[98,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'EQ':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[99,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'NE':([52,55,56,57,58,59,60,61,63,64,82,103,107,119,137,138,140,],[100,-41,-42,-43,-44,-45,-46,-47,-49,-50,-44,-52,-57,-44,-48,-51,-56,]),'USING':([79,],[117,]),'AS':([81,],[118,]),'RANGE':([88,],[121,]),}
|
12
|
+
|
13
|
+
_lr_action = {}
|
14
|
+
for _k, _v in _lr_action_items.items():
|
15
|
+
for _x,_y in zip(_v[0],_v[1]):
|
16
|
+
if not _x in _lr_action: _lr_action[_x] = {}
|
17
|
+
_lr_action[_x][_k] = _y
|
18
|
+
del _lr_action_items
|
19
|
+
|
20
|
+
_lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,69,110,163,173,176,187,193,],[3,33,36,111,143,177,184,185,191,194,]),'metadata_items':([0,7,],[4,37,]),'empty':([0,],[5,]),'statement':([0,2,6,69,110,163,173,176,187,193,],[6,6,6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,69,110,163,173,176,187,193,],[8,8,8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,47,69,110,163,173,176,187,193,],[9,9,9,84,9,9,9,9,9,9,9,]),'remote_keyword_call':([0,2,6,47,69,110,163,173,176,187,193,],[10,10,10,85,10,10,10,10,10,10,10,]),'loop':([0,2,6,69,110,163,173,176,187,193,],[11,11,11,11,11,11,11,11,11,11,]),'custom_keyword':([0,2,6,69,110,163,173,176,187,193,],[12,12,12,12,12,12,12,12,12,12,]),'return_statement':([0,2,6,69,110,163,173,176,187,193,],[13,13,13,13,13,13,13,13,13,13,]),'if_statement':([0,2,6,69,110,163,173,176,187,193,],[14,14,14,14,14,14,14,14,14,14,]),'break_statement':([0,2,6,69,110,163,173,176,187,193,],[15,15,15,15,15,15,15,15,15,15,]),'continue_statement':([0,2,6,69,110,163,173,176,187,193,],[16,16,16,16,16,16,16,16,16,16,]),'teardown':([3,33,],[34,68,]),'expression':([29,30,47,62,65,66,86,90,91,92,93,94,139,141,142,154,165,167,183,],[51,67,83,101,105,109,105,126,127,128,129,130,105,109,160,170,179,180,188,]),'expr_atom':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[52,52,52,52,52,52,52,52,52,52,52,52,131,132,133,134,135,136,52,52,52,52,52,52,52,]),'comparison_expr':([29,30,47,62,65,66,86,90,91,92,93,94,139,141,142,154,165,167,183,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'arithmetic_expr':([29,30,47,62,65,66,86,90,91,92,93,94,139,141,142,154,165,167,183,],[54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,]),'boolean_expr':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,]),'list_expr':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,]),'dict_expr':([29,30,47,62,65,66,86,90,91,92,93,94,95,96,97,98,99,100,139,141,142,154,165,167,183,],[61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,]),'metadata_value':([38,39,42,],[70,73,76,]),'data_source':([44,],[78,]),'list_items':([65,86,139,],[102,102,158,]),'list_item':([65,86,139,],[104,104,104,]),'dict_items':([66,141,],[106,159,]),'dict_item':([66,141,],[108,108,]),'tags':([74,146,],[112,166,]),'tag':([74,146,],[113,113,]),'param_definitions':([89,],[123,]),'param_def_list':([89,157,],[124,174,]),'param_def':([89,157,],[125,125,]),'parameter_list':([116,169,],[148,182,]),'parameter_items':([116,168,169,],[149,181,149,]),'parameter_item':([116,168,169,],[150,150,150,]),'elif_clauses':([143,164,],[162,178,]),'elif_clause':([143,164,],[164,164,]),}
|
21
|
+
|
22
|
+
_lr_goto = {}
|
23
|
+
for _k, _v in _lr_goto_items.items():
|
24
|
+
for _x, _y in zip(_v[0], _v[1]):
|
25
|
+
if not _x in _lr_goto: _lr_goto[_x] = {}
|
26
|
+
_lr_goto[_x][_k] = _y
|
27
|
+
del _lr_goto_items
|
28
|
+
_lr_productions = [
|
29
|
+
("S' -> start","S'",1,None,None,None),
|
30
|
+
('start -> metadata statements teardown','start',3,'p_start','parser.py',23),
|
31
|
+
('start -> metadata statements','start',2,'p_start','parser.py',24),
|
32
|
+
('start -> statements teardown','start',2,'p_start','parser.py',25),
|
33
|
+
('start -> statements','start',1,'p_start','parser.py',26),
|
34
|
+
('metadata -> metadata_items','metadata',1,'p_metadata','parser.py',42),
|
35
|
+
('metadata -> empty','metadata',1,'p_metadata','parser.py',43),
|
36
|
+
('empty -> <empty>','empty',0,'p_empty','parser.py',51),
|
37
|
+
('metadata_items -> metadata_item metadata_items','metadata_items',2,'p_metadata_items','parser.py',56),
|
38
|
+
('metadata_items -> metadata_item','metadata_items',1,'p_metadata_items','parser.py',57),
|
39
|
+
('metadata_item -> NAME_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',65),
|
40
|
+
('metadata_item -> DESCRIPTION_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',66),
|
41
|
+
('metadata_item -> TAGS_KEYWORD COLON LBRACKET tags RBRACKET','metadata_item',5,'p_metadata_item','parser.py',67),
|
42
|
+
('metadata_item -> AUTHOR_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',68),
|
43
|
+
('metadata_item -> DATE_KEYWORD COLON DATE','metadata_item',3,'p_metadata_item','parser.py',69),
|
44
|
+
('metadata_item -> DATA_KEYWORD COLON data_source','metadata_item',3,'p_metadata_item','parser.py',70),
|
45
|
+
('metadata_item -> IMPORT_KEYWORD COLON STRING','metadata_item',3,'p_metadata_item','parser.py',71),
|
46
|
+
('metadata_item -> REMOTE_KEYWORD COLON STRING AS ID','metadata_item',5,'p_metadata_item','parser.py',72),
|
47
|
+
('metadata_value -> STRING','metadata_value',1,'p_metadata_value','parser.py',91),
|
48
|
+
('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',92),
|
49
|
+
('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',97),
|
50
|
+
('tags -> tag','tags',1,'p_tags','parser.py',98),
|
51
|
+
('tag -> STRING','tag',1,'p_tag','parser.py',106),
|
52
|
+
('tag -> ID','tag',1,'p_tag','parser.py',107),
|
53
|
+
('statements -> statement statements','statements',2,'p_statements','parser.py',112),
|
54
|
+
('statements -> statement','statements',1,'p_statements','parser.py',113),
|
55
|
+
('statement -> assignment','statement',1,'p_statement','parser.py',121),
|
56
|
+
('statement -> keyword_call','statement',1,'p_statement','parser.py',122),
|
57
|
+
('statement -> remote_keyword_call','statement',1,'p_statement','parser.py',123),
|
58
|
+
('statement -> loop','statement',1,'p_statement','parser.py',124),
|
59
|
+
('statement -> custom_keyword','statement',1,'p_statement','parser.py',125),
|
60
|
+
('statement -> return_statement','statement',1,'p_statement','parser.py',126),
|
61
|
+
('statement -> if_statement','statement',1,'p_statement','parser.py',127),
|
62
|
+
('statement -> break_statement','statement',1,'p_statement','parser.py',128),
|
63
|
+
('statement -> continue_statement','statement',1,'p_statement','parser.py',129),
|
64
|
+
('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',134),
|
65
|
+
('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',135),
|
66
|
+
('assignment -> ID EQUALS remote_keyword_call','assignment',3,'p_assignment','parser.py',136),
|
67
|
+
('expression -> expr_atom','expression',1,'p_expression','parser.py',146),
|
68
|
+
('expression -> comparison_expr','expression',1,'p_expression','parser.py',147),
|
69
|
+
('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',148),
|
70
|
+
('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',157),
|
71
|
+
('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',158),
|
72
|
+
('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',159),
|
73
|
+
('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',160),
|
74
|
+
('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',161),
|
75
|
+
('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',162),
|
76
|
+
('expr_atom -> dict_expr','expr_atom',1,'p_expr_atom','parser.py',163),
|
77
|
+
('expr_atom -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',164),
|
78
|
+
('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',175),
|
79
|
+
('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',176),
|
80
|
+
('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',181),
|
81
|
+
('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',182),
|
82
|
+
('list_items -> list_item','list_items',1,'p_list_items','parser.py',190),
|
83
|
+
('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',191),
|
84
|
+
('list_item -> expression','list_item',1,'p_list_item','parser.py',199),
|
85
|
+
('dict_expr -> LBRACE dict_items RBRACE','dict_expr',3,'p_dict_expr','parser.py',204),
|
86
|
+
('dict_expr -> LBRACE RBRACE','dict_expr',2,'p_dict_expr','parser.py',205),
|
87
|
+
('dict_items -> dict_item','dict_items',1,'p_dict_items','parser.py',213),
|
88
|
+
('dict_items -> dict_item COMMA dict_items','dict_items',3,'p_dict_items','parser.py',214),
|
89
|
+
('dict_item -> expression COLON expression','dict_item',3,'p_dict_item','parser.py',222),
|
90
|
+
('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',227),
|
91
|
+
('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',232),
|
92
|
+
('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',233),
|
93
|
+
('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',241),
|
94
|
+
('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',246),
|
95
|
+
('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',247),
|
96
|
+
('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',255),
|
97
|
+
('teardown -> TEARDOWN DO statements END','teardown',4,'p_teardown','parser.py',260),
|
98
|
+
('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',265),
|
99
|
+
('custom_keyword -> FUNCTION ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',270),
|
100
|
+
('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',275),
|
101
|
+
('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',276),
|
102
|
+
('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',284),
|
103
|
+
('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',285),
|
104
|
+
('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',293),
|
105
|
+
('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',294),
|
106
|
+
('param_def -> ID','param_def',1,'p_param_def','parser.py',295),
|
107
|
+
('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',303),
|
108
|
+
('break_statement -> BREAK','break_statement',1,'p_break_statement','parser.py',308),
|
109
|
+
('continue_statement -> CONTINUE','continue_statement',1,'p_continue_statement','parser.py',313),
|
110
|
+
('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',318),
|
111
|
+
('if_statement -> IF expression DO statements elif_clauses END','if_statement',6,'p_if_statement','parser.py',319),
|
112
|
+
('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',320),
|
113
|
+
('if_statement -> IF expression DO statements elif_clauses ELSE statements END','if_statement',8,'p_if_statement','parser.py',321),
|
114
|
+
('elif_clauses -> elif_clause','elif_clauses',1,'p_elif_clauses','parser.py',337),
|
115
|
+
('elif_clauses -> elif_clause elif_clauses','elif_clauses',2,'p_elif_clauses','parser.py',338),
|
116
|
+
('elif_clause -> ELIF expression DO statements','elif_clause',4,'p_elif_clause','parser.py',346),
|
117
|
+
('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',351),
|
118
|
+
('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',352),
|
119
|
+
('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',353),
|
120
|
+
('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',354),
|
121
|
+
('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',355),
|
122
|
+
('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',356),
|
123
|
+
('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',379),
|
124
|
+
('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',380),
|
125
|
+
('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',381),
|
126
|
+
('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',382),
|
127
|
+
('arithmetic_expr -> expression MODULO expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',383),
|
128
|
+
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET COMMA parameter_list','remote_keyword_call',7,'p_remote_keyword_call','parser.py',416),
|
129
|
+
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET','remote_keyword_call',5,'p_remote_keyword_call','parser.py',417),
|
130
|
+
]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: pytest-dsl
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.8.0
|
4
4
|
Summary: A DSL testing framework based on pytest
|
5
5
|
Author: Chen Shuanglin
|
6
6
|
License: MIT
|
@@ -114,8 +114,32 @@ version = "1.0.0"
|
|
114
114
|
# 数字变量
|
115
115
|
port = 8080
|
116
116
|
|
117
|
+
# 布尔值变量
|
118
|
+
is_enabled = True
|
119
|
+
is_disabled = False
|
120
|
+
|
117
121
|
# 列表
|
118
122
|
users = ["alice", "bob", "charlie"]
|
123
|
+
|
124
|
+
# 字典
|
125
|
+
user_info = {"name": "张三", "age": 30, "city": "北京"}
|
126
|
+
|
127
|
+
# 嵌套字典
|
128
|
+
config = {
|
129
|
+
"database": {
|
130
|
+
"host": "localhost",
|
131
|
+
"port": 3306,
|
132
|
+
"name": "test_db"
|
133
|
+
},
|
134
|
+
"api": {
|
135
|
+
"base_url": "https://api.example.com",
|
136
|
+
"timeout": 30
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
# 访问字典值
|
141
|
+
username = ${user_info["name"]}
|
142
|
+
db_host = ${config["database"]["host"]}
|
119
143
|
```
|
120
144
|
|
121
145
|
#### 流程控制
|
@@ -129,12 +153,33 @@ else
|
|
129
153
|
[打印], 内容: "测试失败"
|
130
154
|
end
|
131
155
|
|
156
|
+
# 使用布尔值的条件判断
|
157
|
+
is_ready = True
|
158
|
+
if ${is_ready} do
|
159
|
+
[打印], 内容: "系统就绪"
|
160
|
+
end
|
161
|
+
|
132
162
|
# 循环结构
|
133
163
|
num = 4
|
134
164
|
for i in range(1, num) do
|
135
165
|
[打印], 内容: "执行第 ${i} 次"
|
136
166
|
end
|
137
167
|
|
168
|
+
# 循环中的break和continue
|
169
|
+
for j in range(1, 11) do
|
170
|
+
# 跳过偶数
|
171
|
+
if ${j} % 2 == 0 do
|
172
|
+
continue
|
173
|
+
end
|
174
|
+
|
175
|
+
# 当达到7时退出循环
|
176
|
+
if ${j} == 7 do
|
177
|
+
[打印], 内容: "达到7,退出循环"
|
178
|
+
break
|
179
|
+
end
|
180
|
+
|
181
|
+
[打印], 内容: "奇数: ${j}"
|
182
|
+
end
|
138
183
|
```
|
139
184
|
|
140
185
|
### 2. 内置关键字详解
|
@@ -1034,6 +1079,9 @@ pytest-dsl api_basic.dsl
|
|
1034
1079
|
- ✅ 断言重试机制
|
1035
1080
|
- ✅ 认证功能示例
|
1036
1081
|
- ✅ 数据驱动测试(pytest集成)
|
1082
|
+
- ✅ 布尔值支持和条件判断
|
1083
|
+
- ✅ 字典定义和嵌套访问
|
1084
|
+
- ✅ 循环控制语句(break/continue)
|
1037
1085
|
|
1038
1086
|
---
|
1039
1087
|
|
@@ -1,125 +0,0 @@
|
|
1
|
-
|
2
|
-
# parsetab.py
|
3
|
-
# This file is automatically generated. Do not edit.
|
4
|
-
# pylint: disable=W,C,R
|
5
|
-
_tabversion = '3.10'
|
6
|
-
|
7
|
-
_lr_method = 'LALR'
|
8
|
-
|
9
|
-
_lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDErightEQUALSAS AUTHOR_KEYWORD COLON COMMA DATA_KEYWORD DATE DATE_KEYWORD DESCRIPTION_KEYWORD DIVIDE DO ELIF ELSE END EQ EQUALS FALSE FOR FUNCTION GE GT ID IF IMPORT_KEYWORD IN LBRACE LBRACKET LE LPAREN LT MINUS NAME_KEYWORD NE NUMBER PIPE PLACEHOLDER PLUS RANGE RBRACE RBRACKET REMOTE_KEYWORD RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN TIMES TRUE USINGstart : metadata statements teardown\n | metadata statements\n | statements teardown\n | statementsmetadata : metadata_items\n | emptyempty :metadata_items : metadata_item metadata_items\n | metadata_itemmetadata_item : NAME_KEYWORD COLON metadata_value\n | DESCRIPTION_KEYWORD COLON metadata_value\n | TAGS_KEYWORD COLON LBRACKET tags RBRACKET\n | AUTHOR_KEYWORD COLON metadata_value\n | DATE_KEYWORD COLON DATE\n | DATA_KEYWORD COLON data_source\n | IMPORT_KEYWORD COLON STRING\n | REMOTE_KEYWORD COLON STRING AS IDmetadata_value : STRING\n | IDtags : tag COMMA tags\n | tagtag : STRING\n | IDstatements : statement statements\n | statementstatement : assignment\n | keyword_call\n | remote_keyword_call\n | loop\n | custom_keyword\n | return_statement\n | if_statementassignment : ID EQUALS expression\n | ID EQUALS keyword_call\n | ID EQUALS remote_keyword_callexpression : expr_atom\n | comparison_expr\n | arithmetic_exprexpr_atom : NUMBER\n | STRING\n | PLACEHOLDER\n | ID\n | boolean_expr\n | list_expr\n | dict_expr\n | LPAREN expression RPARENboolean_expr : TRUE\n | FALSElist_expr : LBRACKET list_items RBRACKET\n | LBRACKET RBRACKETlist_items : list_item\n | list_item COMMA list_itemslist_item : expressiondict_expr : LBRACE dict_items RBRACE\n | LBRACE RBRACEdict_items : dict_item\n | dict_item COMMA dict_itemsdict_item : expression COLON expressionloop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements ENDkeyword_call : LBRACKET ID RBRACKET COMMA parameter_list\n | LBRACKET ID RBRACKETparameter_list : parameter_itemsparameter_items : parameter_item COMMA parameter_items\n | parameter_itemparameter_item : ID COLON expressionteardown : TEARDOWN DO statements ENDdata_source : STRING USING IDcustom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements ENDparam_definitions : param_def_list\n | param_def_list : param_def COMMA param_def_list\n | param_defparam_def : ID EQUALS STRING\n | ID EQUALS NUMBER\n | IDreturn_statement : RETURN expressionif_statement : IF expression DO statements END\n | IF expression DO statements elif_clauses END\n | IF expression DO statements ELSE statements END\n | IF expression DO statements elif_clauses ELSE statements ENDelif_clauses : elif_clause\n | elif_clause elif_clauseselif_clause : ELIF expression DO statementscomparison_expr : expr_atom GT expr_atom\n | expr_atom LT expr_atom\n | expr_atom GE expr_atom\n | expr_atom LE expr_atom\n | expr_atom EQ expr_atom\n | expr_atom NE expr_atomarithmetic_expr : expression PLUS expression\n | expression MINUS expression\n | expression TIMES expression\n | expression DIVIDE expressionremote_keyword_call : ID PIPE LBRACKET ID RBRACKET COMMA parameter_list\n | ID PIPE LBRACKET ID RBRACKET'
|
10
|
-
|
11
|
-
_lr_action_items = {'ID':([0,2,4,5,6,7,8,9,10,11,12,13,14,18,25,26,27,28,33,34,35,38,43,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,65,66,67,68,69,70,71,72,73,74,76,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,98,102,105,111,112,113,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,140,142,143,144,145,146,147,148,151,155,157,159,161,162,163,167,169,170,174,175,176,177,180,181,183,184,187,189,],[24,24,-5,-6,24,-9,-26,-27,-28,-29,-30,-31,-32,37,45,46,54,54,-8,68,68,68,78,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,54,-47,-48,54,54,24,-10,-18,-19,-11,110,-61,-13,-14,-15,-16,-42,-33,-34,-35,114,115,117,54,54,54,54,54,54,54,54,54,54,-50,-55,24,141,145,146,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,54,-54,54,54,-12,110,-60,-62,-64,-67,-17,-95,54,117,-77,24,54,54,141,141,24,-78,24,-65,-63,-94,54,-79,24,-68,-80,24,-59,]),'LBRACKET':([0,2,4,5,6,7,8,9,10,11,12,13,14,27,28,33,36,43,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,65,66,67,68,69,71,72,73,74,76,78,79,80,81,82,86,87,88,89,90,91,92,93,94,95,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,142,143,144,145,146,147,148,155,157,159,161,167,169,170,174,175,176,177,180,181,183,184,187,189,],[18,18,-5,-6,18,-9,-26,-27,-28,-29,-30,-31,-32,61,61,-8,70,82,83,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,61,-47,-48,61,61,18,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,61,61,61,61,61,61,61,61,61,61,61,-50,-55,18,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,61,-54,61,61,-12,-60,-62,-64,-67,-17,-95,61,-77,18,61,61,18,-78,18,-65,-63,-94,61,-79,18,-68,-80,18,-59,]),'FOR':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[25,25,-5,-6,25,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,25,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,25,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,25,25,-78,25,-65,-63,-94,-79,25,-68,-80,25,-59,]),'FUNCTION':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[26,26,-5,-6,26,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,26,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,26,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,26,26,-78,26,-65,-63,-94,-79,26,-68,-80,26,-59,]),'RETURN':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[27,27,-5,-6,27,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,27,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,27,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,27,27,-78,27,-65,-63,-94,-79,27,-68,-80,27,-59,]),'IF':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,57,59,60,65,66,67,68,69,71,72,73,74,76,78,79,80,81,98,102,105,121,122,123,124,125,126,127,128,129,130,131,132,134,139,142,143,144,145,146,147,155,157,167,169,170,174,175,176,180,181,183,184,187,189,],[28,28,-5,-6,28,-9,-26,-27,-28,-29,-30,-31,-32,-8,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,28,-10,-18,-19,-11,-61,-13,-14,-15,-16,-42,-33,-34,-35,-50,-55,28,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-12,-60,-62,-64,-67,-17,-95,-77,28,28,-78,28,-65,-63,-94,-79,28,-68,-80,28,-59,]),'NAME_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[15,15,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DESCRIPTION_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[16,16,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'TAGS_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[17,17,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'AUTHOR_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[19,19,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DATE_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[20,20,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'DATA_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[21,21,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'IMPORT_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[22,22,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'REMOTE_KEYWORD':([0,7,66,67,68,69,72,73,74,76,139,145,146,],[23,23,-10,-18,-19,-11,-13,-14,-15,-16,-12,-67,-17,]),'$end':([1,3,6,8,9,10,11,12,13,14,29,30,32,47,48,49,50,51,52,53,54,55,56,57,59,60,64,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,138,142,143,144,147,155,169,174,175,176,180,183,184,189,],[0,-4,-25,-26,-27,-28,-29,-30,-31,-32,-2,-3,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-1,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-66,-60,-62,-64,-95,-77,-78,-65,-63,-94,-79,-68,-80,-59,]),'TEARDOWN':([3,6,8,9,10,11,12,13,14,29,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,142,143,144,147,155,169,174,175,176,180,183,184,189,],[31,-25,-26,-27,-28,-29,-30,-31,-32,31,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-60,-62,-64,-95,-77,-78,-65,-63,-94,-79,-68,-80,-59,]),'END':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,106,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,156,158,169,171,172,174,175,176,178,179,180,183,184,185,188,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,138,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,155,-60,-62,-64,-95,-77,169,-81,-78,180,-82,-65,-63,-94,183,184,-79,-68,-80,-83,189,-59,]),'ELSE':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,156,158,169,172,174,175,176,180,183,184,185,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,157,-60,-62,-64,-95,-77,170,-81,-78,-82,-65,-63,-94,-79,-68,-80,-83,-59,]),'ELIF':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,57,59,60,71,78,79,80,81,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,137,142,143,144,147,155,158,169,174,175,176,180,183,184,185,189,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-76,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-61,-42,-33,-34,-35,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,159,-60,-62,-64,-95,-77,159,-78,-65,-63,-94,-79,-68,-80,-83,-59,]),'COLON':([15,16,17,19,20,21,22,23,48,49,50,51,52,53,54,55,56,57,59,60,98,102,104,121,122,123,124,125,126,127,128,129,130,131,132,134,141,],[34,35,36,38,39,40,41,42,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-50,-55,136,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,161,]),'EQUALS':([24,117,],[43,149,]),'PIPE':([24,78,],[44,44,]),'NUMBER':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,149,159,161,177,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,166,51,51,51,]),'STRING':([27,28,34,35,38,40,41,42,43,58,61,62,70,82,86,87,88,89,90,91,92,93,94,95,133,135,136,140,148,149,159,161,177,],[52,52,67,67,67,75,76,77,52,52,52,52,109,52,52,52,52,52,52,52,52,52,52,52,52,52,52,109,52,165,52,52,52,]),'PLACEHOLDER':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,]),'LPAREN':([27,28,43,46,58,61,62,82,86,87,88,89,90,91,92,93,94,95,116,133,135,136,148,159,161,177,],[58,58,58,85,58,58,58,58,58,58,58,58,58,58,58,58,58,58,148,58,58,58,58,58,58,58,]),'TRUE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,]),'FALSE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,]),'LBRACE':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,62,]),'DO':([31,48,49,50,51,52,53,54,55,56,57,59,60,63,98,102,121,122,123,124,125,126,127,128,129,130,131,132,134,150,173,186,],[65,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,105,-50,-55,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,167,181,187,]),'RBRACKET':([37,48,49,50,51,52,53,54,55,56,57,59,60,61,82,97,98,99,100,102,107,108,109,110,114,115,121,122,123,124,125,126,127,128,129,130,131,132,134,152,160,],[71,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,98,98,132,-50,-51,-53,-55,139,-21,-22,-23,71,147,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-52,-20,]),'DATE':([39,],[73,]),'IN':([45,],[84,]),'PLUS':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[86,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,86,-42,86,86,-50,86,-55,86,-42,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,86,86,86,86,86,]),'MINUS':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[87,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,87,-42,87,87,-50,87,-55,87,-42,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,87,87,87,87,87,]),'TIMES':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[88,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,88,-42,88,88,-50,88,-55,88,-42,88,88,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,88,88,88,88,88,]),'DIVIDE':([47,48,49,50,51,52,53,54,55,56,57,59,60,63,78,79,96,98,100,102,104,114,121,122,123,124,125,126,127,128,129,130,131,132,134,154,164,173,174,182,],[89,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,89,-42,89,89,-50,89,-55,89,-42,89,89,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,89,89,89,89,89,]),'RPAREN':([48,49,50,51,52,53,54,55,56,57,59,60,85,96,98,102,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,134,165,166,168,182,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,-70,131,-50,-55,-75,150,-69,-72,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-73,-74,-71,186,]),'COMMA':([48,49,50,51,52,53,54,55,56,57,59,60,71,98,99,100,102,103,108,109,110,114,117,120,121,122,123,124,125,126,127,128,129,130,131,132,134,144,147,154,164,165,166,174,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,111,-50,133,-53,-55,135,140,-22,-23,-42,-75,151,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,162,163,-58,177,-73,-74,-65,]),'RBRACE':([48,49,50,51,52,53,54,55,56,57,59,60,62,98,101,102,103,121,122,123,124,125,126,127,128,129,130,131,132,134,153,154,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-47,-48,102,-50,134,-55,-56,-90,-91,-92,-93,-84,-85,-86,-87,-88,-89,-46,-49,-54,-57,-58,]),'GT':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[90,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'LT':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[91,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'GE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[92,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'LE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[93,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'EQ':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[94,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'NE':([48,51,52,53,54,55,56,57,59,60,78,98,102,114,131,132,134,],[95,-39,-40,-41,-42,-43,-44,-45,-47,-48,-42,-50,-55,-42,-46,-49,-54,]),'USING':([75,],[112,]),'AS':([77,],[113,]),'RANGE':([84,],[116,]),}
|
12
|
-
|
13
|
-
_lr_action = {}
|
14
|
-
for _k, _v in _lr_action_items.items():
|
15
|
-
for _x,_y in zip(_v[0],_v[1]):
|
16
|
-
if not _x in _lr_action: _lr_action[_x] = {}
|
17
|
-
_lr_action[_x][_k] = _y
|
18
|
-
del _lr_action_items
|
19
|
-
|
20
|
-
_lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,65,105,157,167,170,181,187,],[3,29,32,106,137,171,178,179,185,188,]),'metadata_items':([0,7,],[4,33,]),'empty':([0,],[5,]),'statement':([0,2,6,65,105,157,167,170,181,187,],[6,6,6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,65,105,157,167,170,181,187,],[8,8,8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,43,65,105,157,167,170,181,187,],[9,9,9,80,9,9,9,9,9,9,9,]),'remote_keyword_call':([0,2,6,43,65,105,157,167,170,181,187,],[10,10,10,81,10,10,10,10,10,10,10,]),'loop':([0,2,6,65,105,157,167,170,181,187,],[11,11,11,11,11,11,11,11,11,11,]),'custom_keyword':([0,2,6,65,105,157,167,170,181,187,],[12,12,12,12,12,12,12,12,12,12,]),'return_statement':([0,2,6,65,105,157,167,170,181,187,],[13,13,13,13,13,13,13,13,13,13,]),'if_statement':([0,2,6,65,105,157,167,170,181,187,],[14,14,14,14,14,14,14,14,14,14,]),'teardown':([3,29,],[30,64,]),'expression':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[47,63,79,96,100,104,100,121,122,123,124,100,104,154,164,173,174,182,]),'expr_atom':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[48,48,48,48,48,48,48,48,48,48,48,125,126,127,128,129,130,48,48,48,48,48,48,48,]),'comparison_expr':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'arithmetic_expr':([27,28,43,58,61,62,82,86,87,88,89,133,135,136,148,159,161,177,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'boolean_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,]),'list_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,]),'dict_expr':([27,28,43,58,61,62,82,86,87,88,89,90,91,92,93,94,95,133,135,136,148,159,161,177,],[57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,]),'metadata_value':([34,35,38,],[66,69,72,]),'data_source':([40,],[74,]),'list_items':([61,82,133,],[97,97,152,]),'list_item':([61,82,133,],[99,99,99,]),'dict_items':([62,135,],[101,153,]),'dict_item':([62,135,],[103,103,]),'tags':([70,140,],[107,160,]),'tag':([70,140,],[108,108,]),'param_definitions':([85,],[118,]),'param_def_list':([85,151,],[119,168,]),'param_def':([85,151,],[120,120,]),'parameter_list':([111,163,],[142,176,]),'parameter_items':([111,162,163,],[143,175,143,]),'parameter_item':([111,162,163,],[144,144,144,]),'elif_clauses':([137,158,],[156,172,]),'elif_clause':([137,158,],[158,158,]),}
|
21
|
-
|
22
|
-
_lr_goto = {}
|
23
|
-
for _k, _v in _lr_goto_items.items():
|
24
|
-
for _x, _y in zip(_v[0], _v[1]):
|
25
|
-
if not _x in _lr_goto: _lr_goto[_x] = {}
|
26
|
-
_lr_goto[_x][_k] = _y
|
27
|
-
del _lr_goto_items
|
28
|
-
_lr_productions = [
|
29
|
-
("S' -> start","S'",1,None,None,None),
|
30
|
-
('start -> metadata statements teardown','start',3,'p_start','parser.py',23),
|
31
|
-
('start -> metadata statements','start',2,'p_start','parser.py',24),
|
32
|
-
('start -> statements teardown','start',2,'p_start','parser.py',25),
|
33
|
-
('start -> statements','start',1,'p_start','parser.py',26),
|
34
|
-
('metadata -> metadata_items','metadata',1,'p_metadata','parser.py',42),
|
35
|
-
('metadata -> empty','metadata',1,'p_metadata','parser.py',43),
|
36
|
-
('empty -> <empty>','empty',0,'p_empty','parser.py',51),
|
37
|
-
('metadata_items -> metadata_item metadata_items','metadata_items',2,'p_metadata_items','parser.py',56),
|
38
|
-
('metadata_items -> metadata_item','metadata_items',1,'p_metadata_items','parser.py',57),
|
39
|
-
('metadata_item -> NAME_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',65),
|
40
|
-
('metadata_item -> DESCRIPTION_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',66),
|
41
|
-
('metadata_item -> TAGS_KEYWORD COLON LBRACKET tags RBRACKET','metadata_item',5,'p_metadata_item','parser.py',67),
|
42
|
-
('metadata_item -> AUTHOR_KEYWORD COLON metadata_value','metadata_item',3,'p_metadata_item','parser.py',68),
|
43
|
-
('metadata_item -> DATE_KEYWORD COLON DATE','metadata_item',3,'p_metadata_item','parser.py',69),
|
44
|
-
('metadata_item -> DATA_KEYWORD COLON data_source','metadata_item',3,'p_metadata_item','parser.py',70),
|
45
|
-
('metadata_item -> IMPORT_KEYWORD COLON STRING','metadata_item',3,'p_metadata_item','parser.py',71),
|
46
|
-
('metadata_item -> REMOTE_KEYWORD COLON STRING AS ID','metadata_item',5,'p_metadata_item','parser.py',72),
|
47
|
-
('metadata_value -> STRING','metadata_value',1,'p_metadata_value','parser.py',91),
|
48
|
-
('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',92),
|
49
|
-
('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',97),
|
50
|
-
('tags -> tag','tags',1,'p_tags','parser.py',98),
|
51
|
-
('tag -> STRING','tag',1,'p_tag','parser.py',106),
|
52
|
-
('tag -> ID','tag',1,'p_tag','parser.py',107),
|
53
|
-
('statements -> statement statements','statements',2,'p_statements','parser.py',112),
|
54
|
-
('statements -> statement','statements',1,'p_statements','parser.py',113),
|
55
|
-
('statement -> assignment','statement',1,'p_statement','parser.py',121),
|
56
|
-
('statement -> keyword_call','statement',1,'p_statement','parser.py',122),
|
57
|
-
('statement -> remote_keyword_call','statement',1,'p_statement','parser.py',123),
|
58
|
-
('statement -> loop','statement',1,'p_statement','parser.py',124),
|
59
|
-
('statement -> custom_keyword','statement',1,'p_statement','parser.py',125),
|
60
|
-
('statement -> return_statement','statement',1,'p_statement','parser.py',126),
|
61
|
-
('statement -> if_statement','statement',1,'p_statement','parser.py',127),
|
62
|
-
('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',132),
|
63
|
-
('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',133),
|
64
|
-
('assignment -> ID EQUALS remote_keyword_call','assignment',3,'p_assignment','parser.py',134),
|
65
|
-
('expression -> expr_atom','expression',1,'p_expression','parser.py',144),
|
66
|
-
('expression -> comparison_expr','expression',1,'p_expression','parser.py',145),
|
67
|
-
('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',146),
|
68
|
-
('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',155),
|
69
|
-
('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',156),
|
70
|
-
('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',157),
|
71
|
-
('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',158),
|
72
|
-
('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',159),
|
73
|
-
('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',160),
|
74
|
-
('expr_atom -> dict_expr','expr_atom',1,'p_expr_atom','parser.py',161),
|
75
|
-
('expr_atom -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',162),
|
76
|
-
('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',173),
|
77
|
-
('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',174),
|
78
|
-
('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',179),
|
79
|
-
('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',180),
|
80
|
-
('list_items -> list_item','list_items',1,'p_list_items','parser.py',188),
|
81
|
-
('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',189),
|
82
|
-
('list_item -> expression','list_item',1,'p_list_item','parser.py',197),
|
83
|
-
('dict_expr -> LBRACE dict_items RBRACE','dict_expr',3,'p_dict_expr','parser.py',202),
|
84
|
-
('dict_expr -> LBRACE RBRACE','dict_expr',2,'p_dict_expr','parser.py',203),
|
85
|
-
('dict_items -> dict_item','dict_items',1,'p_dict_items','parser.py',211),
|
86
|
-
('dict_items -> dict_item COMMA dict_items','dict_items',3,'p_dict_items','parser.py',212),
|
87
|
-
('dict_item -> expression COLON expression','dict_item',3,'p_dict_item','parser.py',220),
|
88
|
-
('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',225),
|
89
|
-
('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',230),
|
90
|
-
('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',231),
|
91
|
-
('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',239),
|
92
|
-
('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',244),
|
93
|
-
('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',245),
|
94
|
-
('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',253),
|
95
|
-
('teardown -> TEARDOWN DO statements END','teardown',4,'p_teardown','parser.py',258),
|
96
|
-
('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',263),
|
97
|
-
('custom_keyword -> FUNCTION ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',268),
|
98
|
-
('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',273),
|
99
|
-
('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',274),
|
100
|
-
('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',282),
|
101
|
-
('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',283),
|
102
|
-
('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',291),
|
103
|
-
('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',292),
|
104
|
-
('param_def -> ID','param_def',1,'p_param_def','parser.py',293),
|
105
|
-
('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',301),
|
106
|
-
('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',306),
|
107
|
-
('if_statement -> IF expression DO statements elif_clauses END','if_statement',6,'p_if_statement','parser.py',307),
|
108
|
-
('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',308),
|
109
|
-
('if_statement -> IF expression DO statements elif_clauses ELSE statements END','if_statement',8,'p_if_statement','parser.py',309),
|
110
|
-
('elif_clauses -> elif_clause','elif_clauses',1,'p_elif_clauses','parser.py',325),
|
111
|
-
('elif_clauses -> elif_clause elif_clauses','elif_clauses',2,'p_elif_clauses','parser.py',326),
|
112
|
-
('elif_clause -> ELIF expression DO statements','elif_clause',4,'p_elif_clause','parser.py',334),
|
113
|
-
('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',339),
|
114
|
-
('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',340),
|
115
|
-
('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',341),
|
116
|
-
('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',342),
|
117
|
-
('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',343),
|
118
|
-
('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',344),
|
119
|
-
('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',367),
|
120
|
-
('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',368),
|
121
|
-
('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',369),
|
122
|
-
('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',370),
|
123
|
-
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET COMMA parameter_list','remote_keyword_call',7,'p_remote_keyword_call','parser.py',401),
|
124
|
-
('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET','remote_keyword_call',5,'p_remote_keyword_call','parser.py',402),
|
125
|
-
]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_advanced_keywords.auto
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_retry_assertions_enhanced.auto
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|