vtlengine 1.1rc2__py3-none-any.whl → 1.1.1__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.

Potentially problematic release.


This version of vtlengine might be problematic. Click here for more details.

@@ -20,6 +20,7 @@ from vtlengine.AST import (
20
20
  MulOp,
21
21
  ParamConstant,
22
22
  ParamOp,
23
+ ParFunction,
23
24
  RegularAggregation,
24
25
  RenameNode,
25
26
  TimeAggregation,
@@ -29,6 +30,7 @@ from vtlengine.AST import (
29
30
  VarID,
30
31
  Windowing,
31
32
  )
33
+ from vtlengine.AST.ASTConstructorModules import extract_token_info
32
34
  from vtlengine.AST.ASTConstructorModules.ExprComponents import ExprComp
33
35
  from vtlengine.AST.ASTConstructorModules.Terminals import Terminals
34
36
  from vtlengine.AST.ASTDataExchange import de_ruleset_elements
@@ -116,7 +118,12 @@ class Expr(VtlVisitor):
116
118
  then_op_node = self.visitExpr(ctx_list[3])
117
119
  else_op_node = self.visitExpr(ctx_list[5])
118
120
 
119
- if_node = If(condition_node, then_op_node, else_op_node)
121
+ if_node = If(
122
+ condition=condition_node,
123
+ thenOp=then_op_node,
124
+ elseOp=else_op_node,
125
+ **extract_token_info(ctx),
126
+ )
120
127
 
121
128
  return if_node
122
129
 
@@ -132,10 +139,12 @@ class Expr(VtlVisitor):
132
139
  for i in range(0, len(ctx_list), 4):
133
140
  condition = self.visitExpr(ctx_list[i + 1])
134
141
  thenOp = self.visitExpr(ctx_list[i + 3])
135
- case_obj = CaseObj(condition, thenOp)
142
+ case_obj = CaseObj(
143
+ condition=condition, thenOp=thenOp, **extract_token_info(ctx_list[i + 1])
144
+ )
136
145
  cases.append(case_obj)
137
146
 
138
- case_node = Case(cases, else_node)
147
+ case_node = Case(cases=cases, elseOp=else_node, **extract_token_info(ctx))
139
148
 
140
149
  return case_node
141
150
 
@@ -159,8 +168,8 @@ class Expr(VtlVisitor):
159
168
  else:
160
169
  op = ctx_list[1].getSymbol().text
161
170
  right_node = self.visitExpr(ctx_list[2])
162
-
163
- bin_op_node = BinOp(left_node, op, right_node)
171
+ token_info = extract_token_info(ctx)
172
+ bin_op_node = BinOp(left=left_node, op=op, right=right_node, **token_info)
164
173
 
165
174
  return bin_op_node
166
175
 
@@ -184,7 +193,7 @@ class Expr(VtlVisitor):
184
193
  right_node = Terminals().visitValueDomainID(ctx_list[2])
185
194
  else:
186
195
  raise NotImplementedError
187
- bin_op_node = BinOp(left_node, op, right_node)
196
+ bin_op_node = BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
188
197
 
189
198
  return bin_op_node
190
199
 
@@ -192,14 +201,15 @@ class Expr(VtlVisitor):
192
201
  return self.bin_op_creator(ctx)
193
202
 
194
203
  def visitParenthesisExpr(self, ctx: Parser.ParenthesisExprContext):
195
- return self.visitExpr(list(ctx.getChildren())[1])
204
+ operand = self.visitExpr(list(ctx.getChildren())[1])
205
+ return ParFunction(operand=operand, **extract_token_info(ctx))
196
206
 
197
207
  def visitUnaryExpr(self, ctx: Parser.UnaryExprContext):
198
208
  c_list = list(ctx.getChildren())
199
209
  op = c_list[0].getSymbol().text
200
210
  right = self.visitExpr(c_list[1])
201
211
 
202
- return UnaryOp(op, right)
212
+ return UnaryOp(op=op, operand=right, **extract_token_info(ctx))
203
213
 
204
214
  def visitMembershipExpr(self, ctx: Parser.MembershipExprContext):
205
215
  ctx_list = list(ctx.getChildren())
@@ -215,7 +225,10 @@ class Expr(VtlVisitor):
215
225
  # It is only possible to put a membership at the end so go the last one.
216
226
  if len(membership) != 0:
217
227
  previous_node = BinOp(
218
- previous_node, "#", Terminals().visitSimpleComponentId(membership[0])
228
+ left=previous_node,
229
+ op="#",
230
+ right=Terminals().visitSimpleComponentId(membership[0]),
231
+ **extract_token_info(ctx),
219
232
  )
220
233
 
221
234
  return previous_node
@@ -316,8 +329,10 @@ class Expr(VtlVisitor):
316
329
 
317
330
  body_node = self.visitJoinBody(ctx_list[3])
318
331
 
332
+ token_info = extract_token_info(ctx)
333
+
319
334
  if len(body_node) != 0:
320
- previous_node = JoinOp(op_node, clause_node, using_node)
335
+ previous_node = JoinOp(op=op_node, clauses=clause_node, using=using_node, **token_info)
321
336
  regular_aggregation = None
322
337
  for body in body_node:
323
338
  regular_aggregation = body
@@ -330,7 +345,7 @@ class Expr(VtlVisitor):
330
345
  return regular_aggregation
331
346
 
332
347
  else:
333
- join_node = JoinOp(op_node, clause_node, using_node)
348
+ join_node = JoinOp(op=op_node, clauses=clause_node, using=using_node, **token_info)
334
349
  join_node.isLast = True
335
350
  return join_node
336
351
 
@@ -340,9 +355,14 @@ class Expr(VtlVisitor):
340
355
  if len(ctx_list) == 1:
341
356
  return left_node
342
357
 
358
+ token_info = extract_token_info(ctx)
343
359
  intop_node = ctx_list[1].getSymbol().text
344
- right_node = Identifier(Terminals().visitAlias(ctx_list[2]), "DatasetID")
345
- return BinOp(left_node, intop_node, right_node)
360
+ right_node = Identifier(
361
+ value=Terminals().visitAlias(ctx_list[2]),
362
+ kind="DatasetID",
363
+ **extract_token_info(ctx_list[1].getSymbol()),
364
+ )
365
+ return BinOp(left=left_node, op=intop_node, right=right_node, **token_info)
346
366
 
347
367
  def visitJoinClause(self, ctx: Parser.JoinClauseContext):
348
368
  """
@@ -419,7 +439,7 @@ class Expr(VtlVisitor):
419
439
  op_node = ctx_list[0].getSymbol().text
420
440
  operand_nodes = [self.visitExpr(ctx_list[1])]
421
441
 
422
- return RegularAggregation(op_node, operand_nodes)
442
+ return RegularAggregation(op=op_node, children=operand_nodes, **extract_token_info(ctx))
423
443
 
424
444
  """
425
445
  -----------------------------------
@@ -451,7 +471,7 @@ class Expr(VtlVisitor):
451
471
  if isinstance(element, Parser.ParameterContext)
452
472
  ]
453
473
 
454
- return UDOCall(op=op, params=param_nodes)
474
+ return UDOCall(op=op, params=param_nodes, **extract_token_info(ctx))
455
475
 
456
476
  def visitEvalAtom(self, ctx: Parser.EvalAtomContext):
457
477
  """
@@ -499,6 +519,7 @@ class Expr(VtlVisitor):
499
519
  operands=children_nodes,
500
520
  output=output_node[0],
501
521
  language=language_name[0].getSymbol().text,
522
+ **extract_token_info(ctx),
502
523
  )
503
524
 
504
525
  def visitCastExprDataset(self, ctx: Parser.CastExprDatasetContext):
@@ -528,7 +549,11 @@ class Expr(VtlVisitor):
528
549
 
529
550
  if len(ctx_list) > 6:
530
551
  param_node = [
531
- ParamConstant("PARAM_CAST", str_.symbol.text.strip('"'))
552
+ ParamConstant(
553
+ type_="PARAM_CAST",
554
+ value=str_.symbol.text.strip('"'),
555
+ **extract_token_info(str_.getSymbol()),
556
+ )
532
557
  for str_ in ctx_list
533
558
  if isinstance(str_, TerminalNodeImpl)
534
559
  and str_.getSymbol().type == Parser.STRING_CONSTANT
@@ -539,7 +564,9 @@ class Expr(VtlVisitor):
539
564
  if len(basic_scalar_type) == 1:
540
565
  children_nodes = expr_node + basic_scalar_type
541
566
 
542
- return ParamOp(op=op, children=children_nodes, params=param_node)
567
+ return ParamOp(
568
+ op=op, children=children_nodes, params=param_node, **extract_token_info(ctx)
569
+ )
543
570
 
544
571
  else:
545
572
  # AST_ASTCONSTRUCTOR.14
@@ -552,7 +579,9 @@ class Expr(VtlVisitor):
552
579
  if isinstance(c, Parser.ExprContext):
553
580
  return self.visitExpr(c)
554
581
  elif isinstance(c, TerminalNodeImpl):
555
- return ID("OPTIONAL", c.getSymbol().text)
582
+ return ID(
583
+ type_="OPTIONAL", value=c.getSymbol().text, **extract_token_info(c.getSymbol())
584
+ )
556
585
  else:
557
586
  raise NotImplementedError
558
587
 
@@ -581,7 +610,7 @@ class Expr(VtlVisitor):
581
610
  token = c.getSymbol()
582
611
  op_node = token.text
583
612
  operand_node = self.visitExpr(ctx_list[2])
584
- return UnaryOp(op_node, operand_node)
613
+ return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
585
614
 
586
615
  def visitSubstrAtom(self, ctx: Parser.SubstrAtomContext):
587
616
  ctx_list = list(ctx.getChildren())
@@ -602,7 +631,9 @@ class Expr(VtlVisitor):
602
631
  for param in params:
603
632
  params_nodes.append(self.visitOptionalExpr(param))
604
633
 
605
- return ParamOp(op_node, children_nodes, params_nodes)
634
+ return ParamOp(
635
+ op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
636
+ )
606
637
 
607
638
  def visitReplaceAtom(self, ctx: Parser.ReplaceAtomContext):
608
639
  ctx_list = list(ctx.getChildren())
@@ -623,7 +654,9 @@ class Expr(VtlVisitor):
623
654
  children_nodes = [expressions[0]]
624
655
  params_nodes = [expressions[1]] + params
625
656
 
626
- return ParamOp(op_node, children_nodes, params_nodes)
657
+ return ParamOp(
658
+ op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
659
+ )
627
660
 
628
661
  def visitInstrAtom(self, ctx: Parser.InstrAtomContext):
629
662
  ctx_list = list(ctx.getChildren())
@@ -644,7 +677,9 @@ class Expr(VtlVisitor):
644
677
  children_nodes = [expressions[0]]
645
678
  params_nodes = [expressions[1]] + params
646
679
 
647
- return ParamOp(op_node, children_nodes, params_nodes)
680
+ return ParamOp(
681
+ op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
682
+ )
648
683
 
649
684
  """
650
685
  -----------------------------------
@@ -669,7 +704,7 @@ class Expr(VtlVisitor):
669
704
  token = c.getSymbol()
670
705
  op_node = token.text
671
706
  operand_node = self.visitExpr(ctx_list[2])
672
- return UnaryOp(op_node, operand_node)
707
+ return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
673
708
 
674
709
  def visitUnaryWithOptionalNumeric(self, ctx: Parser.UnaryWithOptionalNumericContext):
675
710
  ctx_list = list(ctx.getChildren())
@@ -690,7 +725,9 @@ class Expr(VtlVisitor):
690
725
  for param in params:
691
726
  params_nodes.append(self.visitOptionalExpr(param))
692
727
 
693
- return ParamOp(op_node, children_nodes, params_nodes)
728
+ return ParamOp(
729
+ op=op_node, children=children_nodes, params=params_nodes, **extract_token_info(ctx)
730
+ )
694
731
 
695
732
  def visitBinaryNumeric(self, ctx: Parser.BinaryNumericContext):
696
733
  ctx_list = list(ctx.getChildren())
@@ -701,7 +738,7 @@ class Expr(VtlVisitor):
701
738
  left_node = self.visitExpr(ctx_list[2])
702
739
  op_node = token.text
703
740
  right_node = self.visitExpr(ctx_list[4])
704
- return BinOp(left_node, op_node, right_node)
741
+ return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
705
742
 
706
743
  """
707
744
  -----------------------------------
@@ -734,7 +771,7 @@ class Expr(VtlVisitor):
734
771
  for children in childrens:
735
772
  children_nodes.append(self.visitExpr(children))
736
773
 
737
- return MulOp(op_node, children_nodes)
774
+ return MulOp(op=op_node, children=children_nodes, **extract_token_info(ctx))
738
775
 
739
776
  def visitCharsetMatchAtom(self, ctx: Parser.CharsetMatchAtomContext):
740
777
  ctx_list = list(ctx.getChildren())
@@ -744,7 +781,7 @@ class Expr(VtlVisitor):
744
781
  left_node = self.visitExpr(ctx_list[2])
745
782
  op_node = token.text
746
783
  right_node = self.visitExpr(ctx_list[4])
747
- return BinOp(left_node, op_node, right_node)
784
+ return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
748
785
 
749
786
  def visitIsNullAtom(self, ctx: Parser.IsNullAtomContext):
750
787
  ctx_list = list(ctx.getChildren())
@@ -752,7 +789,7 @@ class Expr(VtlVisitor):
752
789
  token = c.getSymbol()
753
790
  op_node = token.text
754
791
  operand_node = self.visitExpr(ctx_list[2])
755
- return UnaryOp(op_node, operand_node)
792
+ return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
756
793
 
757
794
  def visitExistInAtom(self, ctx: Parser.ExistInAtomContext):
758
795
  ctx_list = list(ctx.getChildren())
@@ -768,7 +805,7 @@ class Expr(VtlVisitor):
768
805
  if isinstance(retain, Parser.RetainTypeContext)
769
806
  ]
770
807
 
771
- return MulOp(op=op, children=operand_nodes + retain_nodes)
808
+ return MulOp(op=op, children=operand_nodes + retain_nodes, **extract_token_info(ctx))
772
809
 
773
810
  """
774
811
  -----------------------------------
@@ -826,7 +863,7 @@ class Expr(VtlVisitor):
826
863
  # AST_ASTCONSTRUCTOR.15
827
864
  raise NotImplementedError
828
865
 
829
- return UnaryOp(op=op, operand=operand_node[0])
866
+ return UnaryOp(op=op, operand=operand_node[0], **extract_token_info(ctx))
830
867
 
831
868
  def visitTimeShiftAtom(self, ctx: Parser.TimeShiftAtomContext):
832
869
  """
@@ -837,9 +874,13 @@ class Expr(VtlVisitor):
837
874
 
838
875
  op = c.getSymbol().text
839
876
  left_node = self.visitExpr(ctx_list[2])
840
- right_node = Constant("INTEGER_CONSTANT", Terminals().visitSignedInteger(ctx_list[4]))
877
+ right_node = Constant(
878
+ type_="INTEGER_CONSTANT",
879
+ value=Terminals().visitSignedInteger(ctx_list[4]),
880
+ **extract_token_info(ctx_list[4]),
881
+ )
841
882
 
842
- return BinOp(left=left_node, op=op, right=right_node)
883
+ return BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
843
884
 
844
885
  def visitFillTimeAtom(self, ctx: Parser.FillTimeAtomContext):
845
886
  """
@@ -852,11 +893,19 @@ class Expr(VtlVisitor):
852
893
  children_node = [self.visitExpr(ctx_list[2])]
853
894
 
854
895
  if len(ctx_list) > 4:
855
- param_constant_node = [ParamConstant("PARAM_TIMESERIES", ctx_list[4].getSymbol().text)]
896
+ param_constant_node = [
897
+ ParamConstant(
898
+ type_="PARAM_TIMESERIES",
899
+ value=ctx_list[4].getSymbol().text,
900
+ **extract_token_info(ctx_list[4].getSymbol()),
901
+ )
902
+ ]
856
903
  else:
857
904
  param_constant_node = []
858
905
 
859
- return ParamOp(op=op, children=children_node, params=param_constant_node)
906
+ return ParamOp(
907
+ op=op, children=children_node, params=param_constant_node, **extract_token_info(ctx)
908
+ )
860
909
 
861
910
  def visitTimeAggAtom(self, ctx: Parser.TimeAggAtomContext):
862
911
  """
@@ -886,7 +935,7 @@ class Expr(VtlVisitor):
886
935
  if isinstance(operand_node, ID):
887
936
  operand_node = None
888
937
  elif isinstance(operand_node, Identifier):
889
- operand_node = VarID(operand_node.value)
938
+ operand_node = VarID(value=operand_node.value, **extract_token_info(ctx))
890
939
  else:
891
940
  operand_node = None
892
941
 
@@ -899,6 +948,7 @@ class Expr(VtlVisitor):
899
948
  period_to=period_to,
900
949
  period_from=period_from,
901
950
  conf=conf,
951
+ **extract_token_info(ctx),
902
952
  )
903
953
 
904
954
  def visitFlowAtom(self, ctx: Parser.FlowAtomContext):
@@ -906,11 +956,11 @@ class Expr(VtlVisitor):
906
956
 
907
957
  op_node = ctx_list[0].getSymbol().text
908
958
  operand_node = self.visitExpr(ctx_list[2])
909
- return UnaryOp(op_node, operand_node)
959
+ return UnaryOp(op=op_node, operand=operand_node, **extract_token_info(ctx))
910
960
 
911
961
  def visitCurrentDateAtom(self, ctx: Parser.CurrentDateAtomContext):
912
962
  c = list(ctx.getChildren())[0]
913
- return MulOp(op=c.getSymbol().text, children=[])
963
+ return MulOp(op=c.getSymbol().text, children=[], **extract_token_info(ctx))
914
964
 
915
965
  def visitTimeDiffAtom(self, ctx: Parser.TimeShiftAtomContext):
916
966
  """ """
@@ -921,7 +971,7 @@ class Expr(VtlVisitor):
921
971
  left_node = self.visitExpr(ctx_list[2])
922
972
  right_node = self.visitExpr(ctx_list[4])
923
973
 
924
- return BinOp(left=left_node, op=op, right=right_node)
974
+ return BinOp(left=left_node, op=op, right=right_node, **extract_token_info(ctx))
925
975
 
926
976
  def visitTimeAddAtom(self, ctx: Parser.TimeShiftAtomContext):
927
977
  """ """
@@ -939,7 +989,9 @@ class Expr(VtlVisitor):
939
989
  if len(ctx_list) > 6:
940
990
  param_constant_node.append(self.visitExpr(ctx_list[6]))
941
991
 
942
- return ParamOp(op=op, children=children_node, params=param_constant_node)
992
+ return ParamOp(
993
+ op=op, children=children_node, params=param_constant_node, **extract_token_info(ctx)
994
+ )
943
995
 
944
996
  """
945
997
  -----------------------------------
@@ -962,7 +1014,7 @@ class Expr(VtlVisitor):
962
1014
  left_node = self.visitExpr(ctx_list[2])
963
1015
  op_node = token.text
964
1016
  right_node = self.visitExpr(ctx_list[4])
965
- return BinOp(left_node, op_node, right_node)
1017
+ return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
966
1018
 
967
1019
  """
968
1020
  -----------------------------------
@@ -991,7 +1043,9 @@ class Expr(VtlVisitor):
991
1043
  self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
992
1044
  ]
993
1045
 
994
- return MulOp(ctx_list[0].getSymbol().text, exprs_nodes)
1046
+ return MulOp(
1047
+ op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
1048
+ )
995
1049
 
996
1050
  def visitIntersectAtom(self, ctx: Parser.IntersectAtomContext):
997
1051
  ctx_list = list(ctx.getChildren())
@@ -999,7 +1053,9 @@ class Expr(VtlVisitor):
999
1053
  self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
1000
1054
  ]
1001
1055
 
1002
- return MulOp(op=ctx_list[0].getSymbol().text, children=exprs_nodes)
1056
+ return MulOp(
1057
+ op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
1058
+ )
1003
1059
 
1004
1060
  def visitSetOrSYmDiffAtom(self, ctx: Parser.SetOrSYmDiffAtomContext):
1005
1061
  ctx_list = list(ctx.getChildren())
@@ -1007,7 +1063,9 @@ class Expr(VtlVisitor):
1007
1063
  self.visitExpr(expr) for expr in ctx_list if isinstance(expr, Parser.ExprContext)
1008
1064
  ]
1009
1065
 
1010
- return MulOp(op=ctx_list[0].getSymbol().text, children=exprs_nodes)
1066
+ return MulOp(
1067
+ op=ctx_list[0].getSymbol().text, children=exprs_nodes, **extract_token_info(ctx)
1068
+ )
1011
1069
 
1012
1070
  """
1013
1071
  -----------------------------------
@@ -1024,13 +1082,18 @@ class Expr(VtlVisitor):
1024
1082
 
1025
1083
  op = c.getSymbol().text
1026
1084
  dataset_node = self.visitExpr(ctx_list[2])
1027
- rule_name_node = Identifier(value=ctx_list[4].getSymbol().text, kind="RuleID")
1085
+ rule_name_node = Identifier(
1086
+ value=ctx_list[4].getSymbol().text,
1087
+ kind="RuleID",
1088
+ **extract_token_info(ctx_list[4].getSymbol()),
1089
+ )
1028
1090
 
1029
1091
  conditions = []
1030
1092
  modes = "non_null"
1031
1093
  inputs = "rule"
1032
1094
  retains = "computed"
1033
1095
  rule_comp = None
1096
+
1034
1097
  for c in ctx_list:
1035
1098
  if isinstance(c, Parser.ConditionClauseContext):
1036
1099
  conditions.append(Terminals().visitConditionClause(c))
@@ -1051,9 +1114,15 @@ class Expr(VtlVisitor):
1051
1114
  raise NotImplementedError("Dataset Priority input mode on HR is not implemented")
1052
1115
  param_constant_node = []
1053
1116
 
1054
- param_constant_node.append(ParamConstant("PARAM_MODE", modes))
1055
- param_constant_node.append(ParamConstant("PARAM_INPUT", inputs))
1056
- param_constant_node.append(ParamConstant("PARAM_OUTPUT", retains))
1117
+ param_constant_node.append(
1118
+ ParamConstant(type_="PARAM_MODE", value=modes, **extract_token_info(ctx))
1119
+ )
1120
+ param_constant_node.append(
1121
+ ParamConstant(type_="PARAM_INPUT", value=inputs, **extract_token_info(ctx))
1122
+ )
1123
+ param_constant_node.append(
1124
+ ParamConstant(type_="PARAM_OUTPUT", value=retains, **extract_token_info(ctx))
1125
+ )
1057
1126
 
1058
1127
  if not rule_comp:
1059
1128
  if isinstance(de_ruleset_elements[rule_name_node.value], list):
@@ -1062,7 +1131,9 @@ class Expr(VtlVisitor):
1062
1131
  rule_element = de_ruleset_elements[rule_name_node.value]
1063
1132
  if rule_element.kind == "DatasetID":
1064
1133
  check_hierarchy_rule = rule_element.value
1065
- rule_comp = Identifier(check_hierarchy_rule, "ComponentID")
1134
+ rule_comp = Identifier(
1135
+ value=check_hierarchy_rule, kind="ComponentID", **extract_token_info(ctx)
1136
+ )
1066
1137
  else: # ValuedomainID
1067
1138
  raise SemanticError("1-1-10-4", op=op)
1068
1139
 
@@ -1070,6 +1141,7 @@ class Expr(VtlVisitor):
1070
1141
  op=op,
1071
1142
  children=[dataset_node, rule_comp, rule_name_node, *conditions],
1072
1143
  params=param_constant_node,
1144
+ **extract_token_info(ctx),
1073
1145
  )
1074
1146
 
1075
1147
  """
@@ -1118,7 +1190,12 @@ class Expr(VtlVisitor):
1118
1190
  if isinstance(ctx_list[-2], Parser.ValidationOutputContext):
1119
1191
  output = Terminals().visitValidationOutput(ctx_list[-2])
1120
1192
 
1121
- return ParamOp(op=op, children=[operand_node, rule_name, *components], params=[output])
1193
+ return ParamOp(
1194
+ op=op,
1195
+ children=[operand_node, rule_name, *components],
1196
+ params=[output],
1197
+ **extract_token_info(ctx),
1198
+ )
1122
1199
 
1123
1200
  # TODO Not fully implemented only basic usage available.
1124
1201
  def visitValidateHRruleset(self, ctx: Parser.ValidateHRrulesetContext):
@@ -1132,7 +1209,11 @@ class Expr(VtlVisitor):
1132
1209
  op = c.getSymbol().text
1133
1210
 
1134
1211
  dataset_node = self.visitExpr(ctx_list[2])
1135
- rule_name_node = Identifier(value=ctx_list[4].getSymbol().text, kind="RuleID")
1212
+ rule_name_node = Identifier(
1213
+ value=ctx_list[4].getSymbol().text,
1214
+ kind="RuleID",
1215
+ **extract_token_info(ctx_list[4].getSymbol()),
1216
+ )
1136
1217
 
1137
1218
  conditions = []
1138
1219
  # Default values
@@ -1140,6 +1221,7 @@ class Expr(VtlVisitor):
1140
1221
  inputs = "dataset"
1141
1222
  retains = "invalid"
1142
1223
  rule_comp = None
1224
+
1143
1225
  for c in ctx_list:
1144
1226
  if isinstance(c, Parser.ConditionClauseContext):
1145
1227
  conditions.append(Terminals().visitConditionClause(c))
@@ -1161,9 +1243,15 @@ class Expr(VtlVisitor):
1161
1243
  if inputs == DATASET_PRIORITY:
1162
1244
  raise NotImplementedError("Dataset Priority input mode on HR is not implemented")
1163
1245
 
1164
- param_constant_node.append(ParamConstant("PARAM_MODE", modes))
1165
- param_constant_node.append(ParamConstant("PARAM_INPUT", inputs))
1166
- param_constant_node.append(ParamConstant("PARAM_OUTPUT", retains))
1246
+ param_constant_node.append(
1247
+ ParamConstant(type_="PARAM_MODE", value=modes, **extract_token_info(ctx))
1248
+ )
1249
+ param_constant_node.append(
1250
+ ParamConstant(type_="PARAM_INPUT", value=inputs, **extract_token_info(ctx))
1251
+ )
1252
+ param_constant_node.append(
1253
+ ParamConstant(type_="PARAM_OUTPUT", value=retains, **extract_token_info(ctx))
1254
+ )
1167
1255
 
1168
1256
  if not rule_comp:
1169
1257
  if isinstance(de_ruleset_elements[rule_name_node.value], list):
@@ -1173,7 +1261,11 @@ class Expr(VtlVisitor):
1173
1261
 
1174
1262
  if rule_element.kind == "DatasetID":
1175
1263
  check_hierarchy_rule = rule_element.value
1176
- rule_comp = Identifier(check_hierarchy_rule, "ComponentID")
1264
+ rule_comp = Identifier(
1265
+ value=check_hierarchy_rule,
1266
+ kind="ComponentID",
1267
+ **extract_token_info(ctx),
1268
+ )
1177
1269
  else: # ValuedomainID
1178
1270
  raise SemanticError("1-1-10-4", op=op)
1179
1271
 
@@ -1181,6 +1273,7 @@ class Expr(VtlVisitor):
1181
1273
  op=op,
1182
1274
  children=[dataset_node, rule_comp, rule_name_node, *conditions],
1183
1275
  params=param_constant_node,
1276
+ **extract_token_info(ctx),
1184
1277
  )
1185
1278
 
1186
1279
  def visitValidationSimple(self, ctx: Parser.ValidationSimpleContext):
@@ -1214,6 +1307,7 @@ class Expr(VtlVisitor):
1214
1307
  error_level=error_level,
1215
1308
  imbalance=inbalance_node,
1216
1309
  invalid=invalid_value,
1310
+ **extract_token_info(ctx),
1217
1311
  )
1218
1312
 
1219
1313
  def visitImbalanceExpr(self, ctx: Parser.ImbalanceExprContext):
@@ -1273,6 +1367,7 @@ class Expr(VtlVisitor):
1273
1367
  grouping_op=grouping_op,
1274
1368
  grouping=group_node,
1275
1369
  having_clause=have_node,
1370
+ **extract_token_info(ctx),
1276
1371
  )
1277
1372
 
1278
1373
  """
@@ -1323,6 +1418,7 @@ class Expr(VtlVisitor):
1323
1418
  stop=0,
1324
1419
  start_mode="preceding",
1325
1420
  stop_mode="current",
1421
+ **extract_token_info(ctx),
1326
1422
  )
1327
1423
 
1328
1424
  return Analytic(
@@ -1331,6 +1427,7 @@ class Expr(VtlVisitor):
1331
1427
  partition_by=partition_by,
1332
1428
  order_by=order_by,
1333
1429
  window=window,
1430
+ **extract_token_info(ctx),
1334
1431
  )
1335
1432
 
1336
1433
  def visitLagOrLeadAn(self, ctx: Parser.LagOrLeadAnContext):
@@ -1369,6 +1466,7 @@ class Expr(VtlVisitor):
1369
1466
  partition_by=partition_by,
1370
1467
  order_by=order_by,
1371
1468
  params=params,
1469
+ **extract_token_info(ctx),
1372
1470
  )
1373
1471
 
1374
1472
  def visitRatioToReportAn(self, ctx: Parser.RatioToReportAnContext):
@@ -1382,7 +1480,13 @@ class Expr(VtlVisitor):
1382
1480
 
1383
1481
  partition_by = Terminals().visitPartitionByClause(ctx_list[5])
1384
1482
 
1385
- return Analytic(op=op_node, operand=operand, partition_by=partition_by, order_by=order_by)
1483
+ return Analytic(
1484
+ op=op_node,
1485
+ operand=operand,
1486
+ partition_by=partition_by,
1487
+ order_by=order_by,
1488
+ **extract_token_info(ctx),
1489
+ )
1386
1490
 
1387
1491
  """______________________________________________________________________________________
1388
1492
 
@@ -1458,7 +1562,9 @@ class Expr(VtlVisitor):
1458
1562
  for ctx_rename in renames:
1459
1563
  rename_nodes.append(self.visitRenameClauseItem(ctx_rename))
1460
1564
 
1461
- return RegularAggregation(op=ctx_list[0].getSymbol().text, children=rename_nodes)
1565
+ return RegularAggregation(
1566
+ op=ctx_list[0].getSymbol().text, children=rename_nodes, **extract_token_info(ctx)
1567
+ )
1462
1568
 
1463
1569
  def visitRenameClauseItem(self, ctx: Parser.RenameClauseItemContext):
1464
1570
  """
@@ -1474,7 +1580,7 @@ class Expr(VtlVisitor):
1474
1580
 
1475
1581
  right_node = Terminals().visitVarID(ctx_list[2]).value
1476
1582
 
1477
- return RenameNode(left_node, right_node)
1583
+ return RenameNode(old_name=left_node, new_name=right_node, **extract_token_info(ctx))
1478
1584
 
1479
1585
  """
1480
1586
  -----------------------------------
@@ -1522,7 +1628,7 @@ class Expr(VtlVisitor):
1522
1628
  # Cannot find another way with less lines of code
1523
1629
  left_node.role = role
1524
1630
 
1525
- return Assignment(left_node, op_node, right_node)
1631
+ return Assignment(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
1526
1632
 
1527
1633
  def visitAggrClause(self, ctx: Parser.AggrClauseContext):
1528
1634
  """
@@ -1555,10 +1661,11 @@ class Expr(VtlVisitor):
1555
1661
  grouping_op=grouping_op,
1556
1662
  grouping=group_node,
1557
1663
  having_clause=have_node,
1664
+ **extract_token_info(ctx_list[1]),
1558
1665
  )
1559
1666
  children.append(copy(element))
1560
1667
 
1561
- return RegularAggregation(op=op_node, children=children)
1668
+ return RegularAggregation(op=op_node, children=children, **extract_token_info(ctx))
1562
1669
 
1563
1670
  def visitGroupingClause(self, ctx: Parser.GroupingClauseContext):
1564
1671
  """
@@ -1612,7 +1719,9 @@ class Expr(VtlVisitor):
1612
1719
  else:
1613
1720
  raise NotImplementedError
1614
1721
 
1615
- return ParamOp(op=op_node, children=None, params=param_nodes), expr
1722
+ return ParamOp(
1723
+ op=op_node, children=None, params=param_nodes, **extract_token_info(ctx)
1724
+ ), expr
1616
1725
 
1617
1726
  def visitGroupByOrExcept(self, ctx: Parser.GroupByOrExceptContext):
1618
1727
  ctx_list = list(ctx.getChildren())
@@ -1660,7 +1769,7 @@ class Expr(VtlVisitor):
1660
1769
  operand_nodes = []
1661
1770
  operand_nodes.append(ExprComp().visitExprComponent(ctx_list[1]))
1662
1771
 
1663
- return RegularAggregation(op_node, operand_nodes)
1772
+ return RegularAggregation(op=op_node, children=operand_nodes, **extract_token_info(ctx))
1664
1773
 
1665
1774
  """
1666
1775
  -----------------------------------
@@ -1687,7 +1796,9 @@ class Expr(VtlVisitor):
1687
1796
  result = self.visitCalcClauseItem(calcClauseItem)
1688
1797
  calcClauseItems_nodes.append(result)
1689
1798
 
1690
- return RegularAggregation(op_node, calcClauseItems_nodes)
1799
+ return RegularAggregation(
1800
+ op=op_node, children=calcClauseItems_nodes, **extract_token_info(ctx)
1801
+ )
1691
1802
 
1692
1803
  def visitCalcClauseItem(self, ctx: Parser.CalcClauseItemContext):
1693
1804
  """
@@ -1702,17 +1813,25 @@ class Expr(VtlVisitor):
1702
1813
  left_node = Terminals().visitComponentID(ctx_list[1])
1703
1814
  op_node = ":="
1704
1815
  right_node = ExprComp().visitExprComponent(ctx_list[3])
1705
- operand_node = Assignment(left_node, op_node, right_node)
1816
+ operand_node = Assignment(
1817
+ left=left_node, op=op_node, right=right_node, **extract_token_info(ctx)
1818
+ )
1706
1819
  if role is None:
1707
- return UnaryOp(Role.MEASURE.value.lower(), operand_node)
1708
- return UnaryOp(role.value.lower(), operand_node)
1820
+ return UnaryOp(
1821
+ op=Role.MEASURE.value.lower(), operand=operand_node, **extract_token_info(c)
1822
+ )
1823
+ return UnaryOp(op=role.value.lower(), operand=operand_node, **extract_token_info(c))
1709
1824
  else:
1710
1825
  left_node = Terminals().visitSimpleComponentId(c)
1711
1826
  op_node = ":="
1712
1827
  right_node = ExprComp().visitExprComponent(ctx_list[2])
1713
1828
 
1714
- operand_node = Assignment(left_node, op_node, right_node)
1715
- return UnaryOp(Role.MEASURE.value.lower(), operand_node)
1829
+ operand_node = Assignment(
1830
+ left=left_node, op=op_node, right=right_node, **extract_token_info(ctx)
1831
+ )
1832
+ return UnaryOp(
1833
+ op=Role.MEASURE.value.lower(), operand=operand_node, **extract_token_info(ctx)
1834
+ )
1716
1835
 
1717
1836
  def visitKeepOrDropClause(self, ctx: Parser.KeepOrDropClauseContext):
1718
1837
  """
@@ -1729,7 +1848,7 @@ class Expr(VtlVisitor):
1729
1848
  for item in items:
1730
1849
  nodes.append(Terminals().visitComponentID(item))
1731
1850
 
1732
- return RegularAggregation(op_node, nodes)
1851
+ return RegularAggregation(op=op_node, children=nodes, **extract_token_info(ctx))
1733
1852
 
1734
1853
  """
1735
1854
  -----------------------------------
@@ -1750,7 +1869,7 @@ class Expr(VtlVisitor):
1750
1869
  children_nodes.append(Terminals().visitComponentID(ctx_list[1]))
1751
1870
  children_nodes.append(Terminals().visitComponentID(ctx_list[3]))
1752
1871
 
1753
- return RegularAggregation(op_node, children_nodes)
1872
+ return RegularAggregation(op=op_node, children=children_nodes, **extract_token_info(ctx))
1754
1873
 
1755
1874
  """
1756
1875
  -----------------------------------
@@ -1775,7 +1894,7 @@ class Expr(VtlVisitor):
1775
1894
  subspace_nodes.append(self.visitSubspaceClauseItem(subspace))
1776
1895
 
1777
1896
  op_node = c.getSymbol().text
1778
- return RegularAggregation(op_node, subspace_nodes)
1897
+ return RegularAggregation(op=op_node, children=subspace_nodes, **extract_token_info(ctx))
1779
1898
 
1780
1899
  def visitSubspaceClauseItem(self, ctx: Parser.SubspaceClauseItemContext):
1781
1900
  ctx_list = list(ctx.getChildren())
@@ -1783,7 +1902,7 @@ class Expr(VtlVisitor):
1783
1902
  left_node = Terminals().visitVarID(ctx_list[0])
1784
1903
  op_node = ctx_list[1].getSymbol().text
1785
1904
  right_node = Terminals().visitScalarItem(ctx_list[2])
1786
- return BinOp(left_node, op_node, right_node)
1905
+ return BinOp(left=left_node, op=op_node, right=right_node, **extract_token_info(ctx))
1787
1906
 
1788
1907
  def visitOptionalExpr(self, ctx: Parser.OptionalExprContext):
1789
1908
  """
@@ -1799,4 +1918,4 @@ class Expr(VtlVisitor):
1799
1918
  elif isinstance(c, TerminalNodeImpl):
1800
1919
  token = c.getSymbol()
1801
1920
  opt = token.text
1802
- return ID("OPTIONAL", opt)
1921
+ return ID(type_="OPTIONAL", value=opt, **extract_token_info(ctx))