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.
Files changed (81) hide show
  1. {pytest_dsl-0.7.0/pytest_dsl.egg-info → pytest_dsl-0.8.0}/PKG-INFO +49 -1
  2. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/README.md +48 -0
  3. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pyproject.toml +1 -1
  4. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/dsl_executor.py +61 -3
  5. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/lexer.py +8 -2
  6. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/parser.py +18 -3
  7. pytest_dsl-0.8.0/pytest_dsl/core/parsetab.py +130 -0
  8. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0/pytest_dsl.egg-info}/PKG-INFO +49 -1
  9. pytest_dsl-0.7.0/pytest_dsl/core/parsetab.py +0 -125
  10. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/LICENSE +0 -0
  11. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/MANIFEST.in +0 -0
  12. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/__init__.py +0 -0
  13. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/cli.py +0 -0
  14. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/conftest_adapter.py +0 -0
  15. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/__init__.py +0 -0
  16. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auth_provider.py +0 -0
  17. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auto_decorator.py +0 -0
  18. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/auto_directory.py +0 -0
  19. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/context.py +0 -0
  20. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/custom_keyword_manager.py +0 -0
  21. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/dsl_executor_utils.py +0 -0
  22. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/global_context.py +0 -0
  23. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/http_client.py +0 -0
  24. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/http_request.py +0 -0
  25. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/keyword_manager.py +0 -0
  26. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/plugin_discovery.py +0 -0
  27. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/utils.py +0 -0
  28. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/variable_utils.py +0 -0
  29. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/yaml_loader.py +0 -0
  30. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/core/yaml_vars.py +0 -0
  31. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/docs/custom_keywords.md +0 -0
  32. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/__init__.py +0 -0
  33. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/assertion_example.auto +0 -0
  34. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/boolean_test.auto +0 -0
  35. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/assert/expression_test.auto +0 -0
  36. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_advanced_keywords.auto +0 -0
  37. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_custom_keywords.auto +0 -0
  38. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/custom/test_default_values.auto +0 -0
  39. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/__init__.py +0 -0
  40. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/builtin_auth_test.auto +0 -0
  41. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/file_reference_test.auto +0 -0
  42. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_advanced.auto +0 -0
  43. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_example.auto +0 -0
  44. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_length_test.auto +0 -0
  45. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_retry_assertions.auto +0 -0
  46. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_retry_assertions_enhanced.auto +0 -0
  47. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/http_with_yaml.auto +0 -0
  48. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/new_retry_test.auto +0 -0
  49. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_assertions_only.auto +0 -0
  50. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_config_only.auto +0 -0
  51. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_debug.auto +0 -0
  52. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/retry_with_fix.auto +0 -0
  53. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/simple_retry.auto +0 -0
  54. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/http/vars.yaml +0 -0
  55. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/api_basics.auto +0 -0
  56. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/assertions.auto +0 -0
  57. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/quickstart/loops.auto +0 -0
  58. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_assert.py +0 -0
  59. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_custom_keyword.py +0 -0
  60. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_http.py +0 -0
  61. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/examples/test_quickstart.py +0 -0
  62. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/__init__.py +0 -0
  63. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/assertion_keywords.py +0 -0
  64. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/global_keywords.py +0 -0
  65. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/http_keywords.py +0 -0
  66. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/keywords/system_keywords.py +0 -0
  67. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/main_adapter.py +0 -0
  68. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl/plugin.py +0 -0
  69. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/SOURCES.txt +0 -0
  70. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/dependency_links.txt +0 -0
  71. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/entry_points.txt +0 -0
  72. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/requires.txt +0 -0
  73. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/pytest_dsl.egg-info/top_level.txt +0 -0
  74. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/setup.cfg +0 -0
  75. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/setup.py +0 -0
  76. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_end_to_end_seamless.py +0 -0
  77. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_enhanced_variable_access.py +0 -0
  78. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_http_assertions_extractors.py +0 -0
  79. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_seamless_variable_sync.py +0 -0
  80. {pytest_dsl-0.7.0 → pytest_dsl-0.8.0}/tests/test_variable_sync.py +0 -0
  81. {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.7.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
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pytest-dsl"
7
- version = "0.7.0"
7
+ version = "0.8.0"
8
8
  description = "A DSL testing framework based on pytest"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -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
- self.execute(node.children[2])
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]*(?:(?:\.[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.7.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