pytest-dsl 0.5.0__py3-none-any.whl → 0.7.0__py3-none-any.whl

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 (40) hide show
  1. pytest_dsl/cli.py +28 -33
  2. pytest_dsl/core/auto_decorator.py +72 -53
  3. pytest_dsl/core/auto_directory.py +8 -5
  4. pytest_dsl/core/dsl_executor.py +91 -23
  5. pytest_dsl/core/http_request.py +272 -221
  6. pytest_dsl/core/lexer.py +17 -17
  7. pytest_dsl/core/parser.py +52 -4
  8. pytest_dsl/core/parsetab.py +81 -70
  9. pytest_dsl/core/plugin_discovery.py +1 -8
  10. pytest_dsl/core/utils.py +43 -23
  11. pytest_dsl/core/variable_utils.py +215 -70
  12. pytest_dsl/core/yaml_loader.py +96 -19
  13. pytest_dsl/examples/assert/assertion_example.auto +1 -1
  14. pytest_dsl/examples/assert/boolean_test.auto +2 -2
  15. pytest_dsl/examples/assert/expression_test.auto +1 -1
  16. pytest_dsl/examples/custom/test_advanced_keywords.auto +2 -2
  17. pytest_dsl/examples/custom/test_custom_keywords.auto +2 -2
  18. pytest_dsl/examples/custom/test_default_values.auto +2 -2
  19. pytest_dsl/examples/http/file_reference_test.auto +1 -1
  20. pytest_dsl/examples/http/http_advanced.auto +1 -1
  21. pytest_dsl/examples/http/http_example.auto +1 -1
  22. pytest_dsl/examples/http/http_length_test.auto +1 -1
  23. pytest_dsl/examples/http/http_retry_assertions.auto +1 -1
  24. pytest_dsl/examples/http/http_retry_assertions_enhanced.auto +2 -2
  25. pytest_dsl/examples/http/http_with_yaml.auto +1 -1
  26. pytest_dsl/examples/quickstart/api_basics.auto +1 -1
  27. pytest_dsl/examples/quickstart/assertions.auto +1 -1
  28. pytest_dsl/examples/quickstart/loops.auto +2 -2
  29. pytest_dsl/keywords/assertion_keywords.py +76 -62
  30. pytest_dsl/keywords/global_keywords.py +43 -4
  31. pytest_dsl/keywords/http_keywords.py +58 -56
  32. pytest_dsl-0.7.0.dist-info/METADATA +1040 -0
  33. pytest_dsl-0.7.0.dist-info/RECORD +67 -0
  34. {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/WHEEL +1 -1
  35. pytest_dsl/parsetab.py +0 -69
  36. pytest_dsl-0.5.0.dist-info/METADATA +0 -596
  37. pytest_dsl-0.5.0.dist-info/RECORD +0 -68
  38. {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/entry_points.txt +0 -0
  39. {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/licenses/LICENSE +0 -0
  40. {pytest_dsl-0.5.0.dist-info → pytest_dsl-0.7.0.dist-info}/top_level.txt +0 -0
pytest_dsl/core/lexer.py CHANGED
@@ -12,8 +12,11 @@ reserved = {
12
12
  'False': 'FALSE', # 添加布尔值支持
13
13
  'return': 'RETURN', # 添加return关键字支持
14
14
  'else': 'ELSE', # 添加else关键字支持
15
+ 'elif': 'ELIF', # 添加elif关键字支持
15
16
  'if': 'IF', # 添加if关键字支持
16
- 'as': 'AS' # 添加as关键字支持,用于远程关键字别名
17
+ 'as': 'AS', # 添加as关键字支持,用于远程关键字别名
18
+ 'function': 'FUNCTION', # 添加function关键字支持,用于自定义关键字定义
19
+ 'teardown': 'TEARDOWN' # 添加teardown关键字支持,用于清理操作
17
20
  }
18
21
 
19
22
  # token 名称列表
@@ -27,6 +30,8 @@ tokens = [
27
30
  'RPAREN',
28
31
  'LBRACKET',
29
32
  'RBRACKET',
33
+ 'LBRACE', # 左大括号 {,用于字典字面量
34
+ 'RBRACE', # 右大括号 },用于字典字面量
30
35
  'COLON',
31
36
  'COMMA',
32
37
  'PLACEHOLDER',
@@ -35,9 +40,7 @@ tokens = [
35
40
  'TAGS_KEYWORD',
36
41
  'AUTHOR_KEYWORD',
37
42
  'DATE_KEYWORD',
38
- 'TEARDOWN_KEYWORD',
39
43
  'DATA_KEYWORD', # Add new token for @data keyword
40
- 'KEYWORD_KEYWORD', # 添加@keyword关键字
41
44
  'IMPORT_KEYWORD', # 添加@import关键字
42
45
  'REMOTE_KEYWORD', # 添加@remote关键字
43
46
  'GT', # 大于 >
@@ -58,6 +61,8 @@ t_LPAREN = r'\('
58
61
  t_RPAREN = r'\)'
59
62
  t_LBRACKET = r'\['
60
63
  t_RBRACKET = r'\]'
64
+ t_LBRACE = r'\{'
65
+ t_RBRACE = r'\}'
61
66
  t_COLON = r':'
62
67
  t_COMMA = r','
63
68
  t_EQUALS = r'='
@@ -72,8 +77,9 @@ t_MINUS = r'-'
72
77
  t_TIMES = r'\*'
73
78
  t_DIVIDE = r'/'
74
79
 
75
- # 增加PLACEHOLDER规则,匹配 ${变量名} 格式
76
- t_PLACEHOLDER = r'\$\{[a-zA-Z_\u4e00-\u9fa5][a-zA-Z0-9_\u4e00-\u9fa5]*\}'
80
+ # 增加PLACEHOLDER规则,匹配 ${变量名} 格式,支持点号、数组索引和字典键访问
81
+ # 匹配: ${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]*)|(?:\[[^\]]+\]))*\}'
77
83
 
78
84
  # 添加管道符的正则表达式定义
79
85
  t_PIPE = r'\|'
@@ -132,29 +138,23 @@ def t_DATE_KEYWORD(t):
132
138
  return t
133
139
 
134
140
 
135
- def t_TEARDOWN_KEYWORD(t):
136
- r'@teardown'
137
- return t
138
-
139
-
140
141
  def t_DATA_KEYWORD(t):
141
142
  r'@data'
142
143
  return t
143
144
 
144
145
 
145
- def t_KEYWORD_KEYWORD(t):
146
- r'@keyword'
147
- return t
148
-
149
-
150
146
  def t_IMPORT_KEYWORD(t):
151
147
  r'@import'
152
148
  return t
153
149
 
154
150
 
155
151
  def t_NUMBER(t):
156
- r'\d+'
157
- t.value = int(t.value)
152
+ r'\d+(\.\d+)?'
153
+ # 如果包含小数点,转换为浮点数;否则转换为整数
154
+ if '.' in t.value:
155
+ t.value = float(t.value)
156
+ else:
157
+ t.value = int(t.value)
158
158
  return t
159
159
 
160
160
 
pytest_dsl/core/parser.py CHANGED
@@ -158,6 +158,7 @@ def p_expr_atom(p):
158
158
  | ID
159
159
  | boolean_expr
160
160
  | list_expr
161
+ | dict_expr
161
162
  | LPAREN expression RPAREN'''
162
163
  if p[1] == '(':
163
164
  # 处理括号表达式,直接返回括号内的表达式节点
@@ -197,6 +198,29 @@ def p_list_item(p):
197
198
  p[0] = p[1]
198
199
 
199
200
 
201
+ def p_dict_expr(p):
202
+ '''dict_expr : LBRACE dict_items RBRACE
203
+ | LBRACE RBRACE'''
204
+ if len(p) == 4:
205
+ p[0] = Node('DictExpr', children=p[2])
206
+ else:
207
+ p[0] = Node('DictExpr', children=[]) # 空字典
208
+
209
+
210
+ def p_dict_items(p):
211
+ '''dict_items : dict_item
212
+ | dict_item COMMA dict_items'''
213
+ if len(p) == 2:
214
+ p[0] = [p[1]]
215
+ else:
216
+ p[0] = [p[1]] + p[3]
217
+
218
+
219
+ def p_dict_item(p):
220
+ '''dict_item : expression COLON expression'''
221
+ p[0] = Node('DictItem', children=[p[1], p[3]])
222
+
223
+
200
224
  def p_loop(p):
201
225
  '''loop : FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END'''
202
226
  p[0] = Node('ForLoop', [p[6], p[8], p[11]], p[2])
@@ -231,7 +255,7 @@ def p_parameter_item(p):
231
255
 
232
256
 
233
257
  def p_teardown(p):
234
- '''teardown : TEARDOWN_KEYWORD DO statements END'''
258
+ '''teardown : TEARDOWN DO statements END'''
235
259
  p[0] = Node('Teardown', [p[3]])
236
260
 
237
261
 
@@ -241,7 +265,7 @@ def p_data_source(p):
241
265
 
242
266
 
243
267
  def p_custom_keyword(p):
244
- '''custom_keyword : KEYWORD_KEYWORD ID LPAREN param_definitions RPAREN DO statements END'''
268
+ '''custom_keyword : FUNCTION ID LPAREN param_definitions RPAREN DO statements END'''
245
269
  p[0] = Node('CustomKeyword', [p[4], p[7]], p[2])
246
270
 
247
271
 
@@ -280,11 +304,35 @@ def p_return_statement(p):
280
304
 
281
305
  def p_if_statement(p):
282
306
  '''if_statement : IF expression DO statements END
283
- | IF expression DO statements ELSE statements END'''
307
+ | IF expression DO statements elif_clauses END
308
+ | IF expression DO statements ELSE statements END
309
+ | IF expression DO statements elif_clauses ELSE statements END'''
284
310
  if len(p) == 6:
311
+ # if condition do statements end
285
312
  p[0] = Node('IfStatement', [p[2], p[4]], None)
286
- else:
313
+ elif len(p) == 7:
314
+ # if condition do statements elif_clauses end
315
+ p[0] = Node('IfStatement', [p[2], p[4]] + p[5], None)
316
+ elif len(p) == 8:
317
+ # if condition do statements else statements end
287
318
  p[0] = Node('IfStatement', [p[2], p[4], p[6]], None)
319
+ else:
320
+ # if condition do statements elif_clauses else statements end
321
+ p[0] = Node('IfStatement', [p[2], p[4]] + p[5] + [p[7]], None)
322
+
323
+
324
+ def p_elif_clauses(p):
325
+ '''elif_clauses : elif_clause
326
+ | elif_clause elif_clauses'''
327
+ if len(p) == 2:
328
+ p[0] = [p[1]]
329
+ else:
330
+ p[0] = [p[1]] + p[2]
331
+
332
+
333
+ def p_elif_clause(p):
334
+ '''elif_clause : ELIF expression DO statements'''
335
+ p[0] = Node('ElifClause', [p[2], p[4]], None)
288
336
 
289
337
 
290
338
  def p_comparison_expr(p):
@@ -6,9 +6,9 @@ _tabversion = '3.10'
6
6
 
7
7
  _lr_method = 'LALR'
8
8
 
9
- _lr_signature = 'leftCOMMAleftGTLTGELEEQNEleftPLUSMINUSleftTIMESDIVIDErightEQUALSAS AUTHOR_KEYWORD COLON COMMA DATA_KEYWORD DATE DATE_KEYWORD DESCRIPTION_KEYWORD DIVIDE DO ELSE END EQ EQUALS FALSE FOR GE GT ID IF IMPORT_KEYWORD IN KEYWORD_KEYWORD LBRACKET LE LPAREN LT MINUS NAME_KEYWORD NE NUMBER PIPE PLACEHOLDER PLUS RANGE RBRACKET REMOTE_KEYWORD RETURN RPAREN STRING TAGS_KEYWORD TEARDOWN_KEYWORD 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 | 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 : 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_KEYWORD DO statements ENDdata_source : STRING USING IDcustom_keyword : KEYWORD_KEYWORD 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 ELSE statements ENDcomparison_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'
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
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,63,64,65,66,67,68,69,70,71,72,74,76,77,78,79,80,81,83,84,85,86,87,88,89,90,91,92,93,96,99,105,106,107,115,116,117,118,119,120,121,122,123,124,125,126,127,130,131,133,134,135,136,137,138,139,142,144,145,147,148,149,153,156,157,158,159,161,163,165,167,],[24,24,-5,-6,24,-9,-26,-27,-28,-29,-30,-31,-32,37,45,46,54,54,-8,66,66,66,76,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,54,-46,-47,54,24,-10,-18,-19,-11,104,-55,-13,-14,-15,-16,-42,-33,-34,-35,108,109,111,54,54,54,54,54,54,54,54,54,54,-49,24,132,136,137,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,54,-12,104,-54,-56,-58,-61,-17,-84,54,111,-71,24,54,132,132,24,-59,-57,-83,54,-72,-62,24,-53,]),'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,63,64,65,66,67,69,70,71,72,74,76,77,78,79,80,84,85,86,87,88,89,90,91,92,93,96,99,115,116,117,118,119,120,121,122,123,124,125,126,127,130,133,134,135,136,137,138,139,144,145,147,153,156,157,158,159,161,163,165,167,],[18,18,-5,-6,18,-9,-26,-27,-28,-29,-30,-31,-32,60,60,-8,68,80,81,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,60,-46,-47,60,18,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,60,60,60,60,60,60,60,60,60,60,60,-49,18,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,60,-12,-54,-56,-58,-61,-17,-84,60,-71,18,60,18,-59,-57,-83,60,-72,-62,18,-53,]),'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,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[25,25,-5,-6,25,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,25,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,25,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,25,25,-59,-57,-83,-72,-62,25,-53,]),'KEYWORD_KEYWORD':([0,2,4,5,6,7,8,9,10,11,12,13,14,33,47,48,49,50,51,52,53,54,55,56,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[26,26,-5,-6,26,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,26,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,26,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,26,26,-59,-57,-83,-72,-62,26,-53,]),'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,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[27,27,-5,-6,27,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,27,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,27,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,27,27,-59,-57,-83,-72,-62,27,-53,]),'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,58,59,63,64,65,66,67,69,70,71,72,74,76,77,78,79,96,99,115,116,117,118,119,120,121,122,123,124,125,126,130,133,134,135,136,137,138,144,145,153,156,157,158,161,163,165,167,],[28,28,-5,-6,28,-9,-26,-27,-28,-29,-30,-31,-32,-8,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,28,-10,-18,-19,-11,-55,-13,-14,-15,-16,-42,-33,-34,-35,-49,28,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-12,-54,-56,-58,-61,-17,-84,-71,28,28,-59,-57,-83,-72,-62,28,-53,]),'NAME_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[15,15,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DESCRIPTION_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[16,16,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'TAGS_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[17,17,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'AUTHOR_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[19,19,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DATE_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[20,20,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'DATA_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[21,21,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'IMPORT_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[22,22,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-17,]),'REMOTE_KEYWORD':([0,7,64,65,66,67,70,71,72,74,130,136,137,],[23,23,-10,-18,-19,-11,-13,-14,-15,-16,-12,-61,-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,58,59,62,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,129,133,134,135,138,144,156,157,158,161,163,167,],[0,-4,-25,-26,-27,-28,-29,-30,-31,-32,-2,-3,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-1,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-60,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'TEARDOWN_KEYWORD':([3,6,8,9,10,11,12,13,14,29,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,133,134,135,138,144,156,157,158,161,163,167,],[31,-25,-26,-27,-28,-29,-30,-31,-32,31,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'END':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,100,115,116,117,118,119,120,121,122,123,124,125,126,128,133,134,135,138,144,155,156,157,158,160,161,163,166,167,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,129,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,144,-54,-56,-58,-84,-71,161,-59,-57,-83,163,-72,-62,167,-53,]),'ELSE':([6,8,9,10,11,12,13,14,32,47,48,49,50,51,52,53,54,55,56,58,59,69,76,77,78,79,96,115,116,117,118,119,120,121,122,123,124,125,126,128,133,134,135,138,144,156,157,158,161,163,167,],[-25,-26,-27,-28,-29,-30,-31,-32,-24,-70,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-55,-42,-33,-34,-35,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,145,-54,-56,-58,-84,-71,-59,-57,-83,-72,-62,-53,]),'COLON':([15,16,17,19,20,21,22,23,132,],[34,35,36,38,39,40,41,42,147,]),'EQUALS':([24,111,],[43,140,]),'PIPE':([24,76,],[44,44,]),'NUMBER':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,140,147,159,],[51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,152,51,51,]),'STRING':([27,28,34,35,38,40,41,42,43,57,60,68,80,84,85,86,87,88,89,90,91,92,93,127,131,139,140,147,159,],[52,52,65,65,65,73,74,75,52,52,52,103,52,52,52,52,52,52,52,52,52,52,52,52,103,52,151,52,52,]),'PLACEHOLDER':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[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,57,60,80,84,85,86,87,88,89,90,91,92,93,110,127,139,147,159,],[57,57,57,83,57,57,57,57,57,57,57,57,57,57,57,57,57,139,57,57,57,57,]),'TRUE':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,]),'FALSE':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,59,]),'DO':([31,48,49,50,51,52,53,54,55,56,58,59,61,96,115,116,117,118,119,120,121,122,123,124,125,126,141,164,],[63,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,99,-49,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,153,165,]),'RBRACKET':([37,48,49,50,51,52,53,54,55,56,58,59,60,80,95,96,97,98,101,102,103,104,108,109,115,116,117,118,119,120,121,122,123,124,125,126,143,146,],[69,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,96,96,126,-49,-50,-52,130,-21,-22,-23,69,138,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-51,-20,]),'DATE':([39,],[71,]),'IN':([45,],[82,]),'PLUS':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[84,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,84,-42,84,84,-49,84,-42,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,84,84,84,]),'MINUS':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[85,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,85,-42,85,85,-49,85,-42,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,85,85,85,]),'TIMES':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[86,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,86,-42,86,86,-49,86,-42,86,86,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,86,86,86,]),'DIVIDE':([47,48,49,50,51,52,53,54,55,56,58,59,61,76,77,94,96,98,108,115,116,117,118,119,120,121,122,123,124,125,126,150,156,162,],[87,-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,87,-42,87,87,-49,87,-42,87,87,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,87,87,87,]),'RPAREN':([48,49,50,51,52,53,54,55,56,58,59,83,94,96,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,151,152,154,162,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,-64,125,-49,-69,141,-63,-66,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,-67,-68,-65,164,]),'COMMA':([48,49,50,51,52,53,54,55,56,58,59,69,96,97,98,102,103,104,108,111,114,115,116,117,118,119,120,121,122,123,124,125,126,135,138,150,151,152,156,],[-36,-37,-38,-39,-40,-41,-42,-43,-44,-46,-47,105,-49,127,-52,131,-22,-23,-42,-69,142,-79,-80,-81,-82,-73,-74,-75,-76,-77,-78,-45,-48,148,149,159,-67,-68,-59,]),'GT':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[88,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'LT':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[89,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'GE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[90,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'LE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[91,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'EQ':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[92,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'NE':([48,51,52,53,54,55,56,58,59,76,96,108,125,126,],[93,-39,-40,-41,-42,-43,-44,-46,-47,-42,-49,-42,-45,-48,]),'USING':([73,],[106,]),'AS':([75,],[107,]),'RANGE':([82,],[110,]),}
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
12
 
13
13
  _lr_action = {}
14
14
  for _k, _v in _lr_action_items.items():
@@ -17,7 +17,7 @@ for _k, _v in _lr_action_items.items():
17
17
  _lr_action[_x][_k] = _y
18
18
  del _lr_action_items
19
19
 
20
- _lr_goto_items = {'start':([0,],[1,]),'metadata':([0,],[2,]),'statements':([0,2,6,63,99,145,153,165,],[3,29,32,100,128,155,160,166,]),'metadata_items':([0,7,],[4,33,]),'empty':([0,],[5,]),'statement':([0,2,6,63,99,145,153,165,],[6,6,6,6,6,6,6,6,]),'metadata_item':([0,7,],[7,7,]),'assignment':([0,2,6,63,99,145,153,165,],[8,8,8,8,8,8,8,8,]),'keyword_call':([0,2,6,43,63,99,145,153,165,],[9,9,9,78,9,9,9,9,9,]),'remote_keyword_call':([0,2,6,43,63,99,145,153,165,],[10,10,10,79,10,10,10,10,10,]),'loop':([0,2,6,63,99,145,153,165,],[11,11,11,11,11,11,11,11,]),'custom_keyword':([0,2,6,63,99,145,153,165,],[12,12,12,12,12,12,12,12,]),'return_statement':([0,2,6,63,99,145,153,165,],[13,13,13,13,13,13,13,13,]),'if_statement':([0,2,6,63,99,145,153,165,],[14,14,14,14,14,14,14,14,]),'teardown':([3,29,],[30,62,]),'expression':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[47,61,77,94,98,98,115,116,117,118,98,150,156,162,]),'expr_atom':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[48,48,48,48,48,48,48,48,48,48,119,120,121,122,123,124,48,48,48,48,]),'comparison_expr':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[49,49,49,49,49,49,49,49,49,49,49,49,49,49,]),'arithmetic_expr':([27,28,43,57,60,80,84,85,86,87,127,139,147,159,],[50,50,50,50,50,50,50,50,50,50,50,50,50,50,]),'boolean_expr':([27,28,43,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[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,57,60,80,84,85,86,87,88,89,90,91,92,93,127,139,147,159,],[56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,56,]),'metadata_value':([34,35,38,],[64,67,70,]),'data_source':([40,],[72,]),'list_items':([60,80,127,],[95,95,143,]),'list_item':([60,80,127,],[97,97,97,]),'tags':([68,131,],[101,146,]),'tag':([68,131,],[102,102,]),'param_definitions':([83,],[112,]),'param_def_list':([83,142,],[113,154,]),'param_def':([83,142,],[114,114,]),'parameter_list':([105,149,],[133,158,]),'parameter_items':([105,148,149,],[134,157,134,]),'parameter_item':([105,148,149,],[135,135,135,]),}
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
21
 
22
22
  _lr_goto = {}
23
23
  for _k, _v in _lr_goto_items.items():
@@ -44,71 +44,82 @@ _lr_productions = [
44
44
  ('metadata_item -> DATA_KEYWORD COLON data_source','metadata_item',3,'p_metadata_item','parser.py',70),
45
45
  ('metadata_item -> IMPORT_KEYWORD COLON STRING','metadata_item',3,'p_metadata_item','parser.py',71),
46
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',89),
48
- ('metadata_value -> ID','metadata_value',1,'p_metadata_value','parser.py',90),
49
- ('tags -> tag COMMA tags','tags',3,'p_tags','parser.py',95),
50
- ('tags -> tag','tags',1,'p_tags','parser.py',96),
51
- ('tag -> STRING','tag',1,'p_tag','parser.py',104),
52
- ('tag -> ID','tag',1,'p_tag','parser.py',105),
53
- ('statements -> statement statements','statements',2,'p_statements','parser.py',110),
54
- ('statements -> statement','statements',1,'p_statements','parser.py',111),
55
- ('statement -> assignment','statement',1,'p_statement','parser.py',119),
56
- ('statement -> keyword_call','statement',1,'p_statement','parser.py',120),
57
- ('statement -> remote_keyword_call','statement',1,'p_statement','parser.py',121),
58
- ('statement -> loop','statement',1,'p_statement','parser.py',122),
59
- ('statement -> custom_keyword','statement',1,'p_statement','parser.py',123),
60
- ('statement -> return_statement','statement',1,'p_statement','parser.py',124),
61
- ('statement -> if_statement','statement',1,'p_statement','parser.py',125),
62
- ('assignment -> ID EQUALS expression','assignment',3,'p_assignment','parser.py',130),
63
- ('assignment -> ID EQUALS keyword_call','assignment',3,'p_assignment','parser.py',131),
64
- ('assignment -> ID EQUALS remote_keyword_call','assignment',3,'p_assignment','parser.py',132),
65
- ('expression -> expr_atom','expression',1,'p_expression','parser.py',142),
66
- ('expression -> comparison_expr','expression',1,'p_expression','parser.py',143),
67
- ('expression -> arithmetic_expr','expression',1,'p_expression','parser.py',144),
68
- ('expr_atom -> NUMBER','expr_atom',1,'p_expr_atom','parser.py',153),
69
- ('expr_atom -> STRING','expr_atom',1,'p_expr_atom','parser.py',154),
70
- ('expr_atom -> PLACEHOLDER','expr_atom',1,'p_expr_atom','parser.py',155),
71
- ('expr_atom -> ID','expr_atom',1,'p_expr_atom','parser.py',156),
72
- ('expr_atom -> boolean_expr','expr_atom',1,'p_expr_atom','parser.py',157),
73
- ('expr_atom -> list_expr','expr_atom',1,'p_expr_atom','parser.py',158),
74
- ('expr_atom -> LPAREN expression RPAREN','expr_atom',3,'p_expr_atom','parser.py',159),
75
- ('boolean_expr -> TRUE','boolean_expr',1,'p_boolean_expr','parser.py',170),
76
- ('boolean_expr -> FALSE','boolean_expr',1,'p_boolean_expr','parser.py',171),
77
- ('list_expr -> LBRACKET list_items RBRACKET','list_expr',3,'p_list_expr','parser.py',176),
78
- ('list_expr -> LBRACKET RBRACKET','list_expr',2,'p_list_expr','parser.py',177),
79
- ('list_items -> list_item','list_items',1,'p_list_items','parser.py',185),
80
- ('list_items -> list_item COMMA list_items','list_items',3,'p_list_items','parser.py',186),
81
- ('list_item -> expression','list_item',1,'p_list_item','parser.py',194),
82
- ('loop -> FOR ID IN RANGE LPAREN expression COMMA expression RPAREN DO statements END','loop',12,'p_loop','parser.py',199),
83
- ('keyword_call -> LBRACKET ID RBRACKET COMMA parameter_list','keyword_call',5,'p_keyword_call','parser.py',204),
84
- ('keyword_call -> LBRACKET ID RBRACKET','keyword_call',3,'p_keyword_call','parser.py',205),
85
- ('parameter_list -> parameter_items','parameter_list',1,'p_parameter_list','parser.py',213),
86
- ('parameter_items -> parameter_item COMMA parameter_items','parameter_items',3,'p_parameter_items','parser.py',218),
87
- ('parameter_items -> parameter_item','parameter_items',1,'p_parameter_items','parser.py',219),
88
- ('parameter_item -> ID COLON expression','parameter_item',3,'p_parameter_item','parser.py',227),
89
- ('teardown -> TEARDOWN_KEYWORD DO statements END','teardown',4,'p_teardown','parser.py',232),
90
- ('data_source -> STRING USING ID','data_source',3,'p_data_source','parser.py',237),
91
- ('custom_keyword -> KEYWORD_KEYWORD ID LPAREN param_definitions RPAREN DO statements END','custom_keyword',8,'p_custom_keyword','parser.py',242),
92
- ('param_definitions -> param_def_list','param_definitions',1,'p_param_definitions','parser.py',247),
93
- ('param_definitions -> <empty>','param_definitions',0,'p_param_definitions','parser.py',248),
94
- ('param_def_list -> param_def COMMA param_def_list','param_def_list',3,'p_param_def_list','parser.py',256),
95
- ('param_def_list -> param_def','param_def_list',1,'p_param_def_list','parser.py',257),
96
- ('param_def -> ID EQUALS STRING','param_def',3,'p_param_def','parser.py',265),
97
- ('param_def -> ID EQUALS NUMBER','param_def',3,'p_param_def','parser.py',266),
98
- ('param_def -> ID','param_def',1,'p_param_def','parser.py',267),
99
- ('return_statement -> RETURN expression','return_statement',2,'p_return_statement','parser.py',275),
100
- ('if_statement -> IF expression DO statements END','if_statement',5,'p_if_statement','parser.py',280),
101
- ('if_statement -> IF expression DO statements ELSE statements END','if_statement',7,'p_if_statement','parser.py',281),
102
- ('comparison_expr -> expr_atom GT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',289),
103
- ('comparison_expr -> expr_atom LT expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',290),
104
- ('comparison_expr -> expr_atom GE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',291),
105
- ('comparison_expr -> expr_atom LE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',292),
106
- ('comparison_expr -> expr_atom EQ expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',293),
107
- ('comparison_expr -> expr_atom NE expr_atom','comparison_expr',3,'p_comparison_expr','parser.py',294),
108
- ('arithmetic_expr -> expression PLUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',317),
109
- ('arithmetic_expr -> expression MINUS expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',318),
110
- ('arithmetic_expr -> expression TIMES expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',319),
111
- ('arithmetic_expr -> expression DIVIDE expression','arithmetic_expr',3,'p_arithmetic_expr','parser.py',320),
112
- ('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET COMMA parameter_list','remote_keyword_call',7,'p_remote_keyword_call','parser.py',351),
113
- ('remote_keyword_call -> ID PIPE LBRACKET ID RBRACKET','remote_keyword_call',5,'p_remote_keyword_call','parser.py',352),
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),
114
125
  ]
@@ -114,15 +114,8 @@ def scan_local_keywords() -> None:
114
114
  """
115
115
  扫描本地keywords目录中的关键字
116
116
 
117
- 1. 先尝试导入内置的keywords包(向后兼容)
118
- 2. 再查找并导入用户项目根目录下的keywords目录中的Python模块
117
+ 再查找并导入用户项目根目录下的keywords目录中的Python模块
119
118
  """
120
- # 1. 尝试导入内置的keywords包
121
- try:
122
- import keywords
123
- except ImportError:
124
- print("提示: 未找到内置关键字包")
125
-
126
119
  # 2. 查找并导入用户项目中的keywords目录
127
120
  try:
128
121
  # 获取当前工作目录,通常是用户项目的根目录
pytest_dsl/core/utils.py CHANGED
@@ -10,34 +10,54 @@ from pytest_dsl.core.global_context import global_context
10
10
 
11
11
 
12
12
  def replace_variables_in_string(value: str) -> str:
13
- """替换字符串中的变量引用,包括嵌套的点号引用
14
-
13
+ """替换字符串中的变量引用
14
+
15
+ 支持多种访问语法:
16
+ - 基本变量: ${variable}
17
+ - 点号访问: ${object.property}
18
+ - 数组索引: ${array[0]}, ${array[-1]}
19
+ - 字典键访问: ${dict["key"]}, ${dict['key']}
20
+ - 混合访问: ${users[0].name}, ${data["users"][0]["name"]}
21
+
15
22
  Args:
16
23
  value: 包含变量引用的字符串
17
-
24
+
18
25
  Returns:
19
26
  替换后的字符串
20
27
  """
21
28
  if not isinstance(value, str):
22
29
  return value
23
-
30
+
31
+ # 使用新的变量替换器
32
+ from pytest_dsl.core.variable_utils import VariableReplacer
33
+ replacer = VariableReplacer()
34
+
35
+ try:
36
+ return replacer.replace_in_string(value)
37
+ except KeyError:
38
+ # 如果新的替换器失败,回退到旧的逻辑以保持兼容性
39
+ return _legacy_replace_variables_in_string(value)
40
+
41
+
42
+ def _legacy_replace_variables_in_string(value: str) -> str:
43
+ """旧版变量替换逻辑(保持向后兼容性)"""
24
44
  # 基本变量引用模式: ${variable}
25
45
  basic_pattern = r'\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}'
26
-
46
+
27
47
  # 嵌套引用模式: ${variable.field.subfield}
28
48
  nested_pattern = r'\$\{([a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)+)\}'
29
-
49
+
30
50
  # 先处理嵌套引用
31
51
  matches = list(re.finditer(nested_pattern, value))
32
52
  for match in reversed(matches):
33
53
  var_ref = match.group(1) # 例如: "api_test_data.user_id"
34
54
  parts = var_ref.split('.')
35
-
55
+
36
56
  # 获取根变量
37
57
  root_var_name = parts[0]
38
58
  if context_has_variable(root_var_name):
39
59
  root_var = get_variable(root_var_name)
40
-
60
+
41
61
  # 递归访问嵌套属性
42
62
  var_value = root_var
43
63
  for part in parts[1:]:
@@ -47,10 +67,10 @@ def replace_variables_in_string(value: str) -> str:
47
67
  # 无法解析的属性路径
48
68
  var_value = f"${{{var_ref}}}" # 保持原样
49
69
  break
50
-
70
+
51
71
  # 替换变量引用
52
72
  value = value[:match.start()] + str(var_value) + value[match.end():]
53
-
73
+
54
74
  # 再处理基本引用
55
75
  matches = list(re.finditer(basic_pattern, value))
56
76
  for match in reversed(matches):
@@ -58,16 +78,16 @@ def replace_variables_in_string(value: str) -> str:
58
78
  if context_has_variable(var_name):
59
79
  var_value = get_variable(var_name)
60
80
  value = value[:match.start()] + str(var_value) + value[match.end():]
61
-
81
+
62
82
  return value
63
83
 
64
84
 
65
85
  def replace_variables_in_dict(data: Union[Dict, List, str]) -> Union[Dict, List, str]:
66
86
  """递归替换字典中的变量引用
67
-
87
+
68
88
  Args:
69
89
  data: 包含变量引用的字典、列表或字符串
70
-
90
+
71
91
  Returns:
72
92
  替换变量后的数据
73
93
  """
@@ -87,13 +107,13 @@ def context_has_variable(var_name: str) -> bool:
87
107
  from pytest_dsl.core.yaml_vars import yaml_vars
88
108
  if yaml_vars.get_variable(var_name) is not None:
89
109
  return True
90
-
110
+
91
111
  # 检查测试上下文
92
112
  from pytest_dsl.core.keyword_manager import keyword_manager
93
113
  current_context = getattr(keyword_manager, 'current_context', None)
94
114
  if current_context and current_context.has(var_name):
95
115
  return True
96
-
116
+
97
117
  # 再检查全局上下文
98
118
  return global_context.has_variable(var_name)
99
119
 
@@ -105,33 +125,33 @@ def get_variable(var_name: str) -> Any:
105
125
  yaml_value = yaml_vars.get_variable(var_name)
106
126
  if yaml_value is not None:
107
127
  return yaml_value
108
-
128
+
109
129
  # 检查测试上下文
110
130
  from pytest_dsl.core.keyword_manager import keyword_manager
111
131
  current_context = getattr(keyword_manager, 'current_context', None)
112
132
  if current_context and current_context.has(var_name):
113
133
  return current_context.get(var_name)
114
-
134
+
115
135
  # 再从全局上下文获取
116
136
  if global_context.has_variable(var_name):
117
137
  return global_context.get_variable(var_name)
118
-
138
+
119
139
  # 如果都没有找到,返回变量引用本身
120
140
  return f"${{{var_name}}}"
121
141
 
122
142
 
123
143
  def deep_merge(base: Dict, override: Dict) -> Dict:
124
144
  """深度合并两个字典
125
-
145
+
126
146
  Args:
127
147
  base: 基础字典
128
148
  override: 覆盖字典
129
-
149
+
130
150
  Returns:
131
151
  合并后的字典
132
152
  """
133
153
  result = base.copy()
134
-
154
+
135
155
  for key, value in override.items():
136
156
  if key in result and isinstance(result[key], dict) and isinstance(value, dict):
137
157
  # 递归合并嵌套字典
@@ -142,5 +162,5 @@ def deep_merge(base: Dict, override: Dict) -> Dict:
142
162
  else:
143
163
  # 覆盖或添加值
144
164
  result[key] = value
145
-
146
- return result
165
+
166
+ return result