src: update most tools to new constructors
[nit.git] / src / parser / parser_nodes.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # AST nodes of the Nit language
16 # Was previously based on parser_abs.nit.
17 module parser_nodes
18
19 import location
20
21 # Root of the AST class-hierarchy
22 abstract class ANode
23 # Location is set during AST building. Once built, location cannon be null.
24 # However, manual instantiated nodes may need more care.
25 var location: Location is writable, noinit
26
27 # The location of the important part of the node (identifier or whatever)
28 fun hot_location: Location do return location
29
30 # Display a message for the colored location of the node
31 fun debug(message: String)
32 do
33 sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n"
34 end
35
36 # Parent of the node in the AST
37 var parent: nullable ANode = null
38
39 # The topmost ancestor of the element
40 # This just apply `parent` until the first one
41 fun root: ANode
42 do
43 var res = self
44 loop
45 var p = res.parent
46 if p == null then return res
47 res = p
48 end
49 end
50
51 # The most specific common parent between `self` and `other`
52 # Return null if the two node are unrelated (distinct root)
53 fun common_parent(other: ANode): nullable ANode
54 do
55 # First, get the same depth
56 var s: nullable ANode = self
57 var o: nullable ANode = other
58 var d = s.depth - o.depth
59 while d > 0 do
60 s = s.parent
61 d -= 1
62 end
63 while d < 0 do
64 o = o.parent
65 d += 1
66 end
67 assert o.depth == s.depth
68 # Second, go up until same in found
69 while s != o do
70 s = s.parent
71 o = o.parent
72 end
73 return s
74 end
75
76 # Number of nodes between `self` and the `root` of the AST
77 # ENSURE `self == self.root implies result == 0 `
78 # ENSURE `self != self.root implies result == self.parent.depth + 1`
79 fun depth: Int
80 do
81 var n = self
82 var res = 0
83 loop
84 var p = n.parent
85 if p == null then return res
86 n = p
87 res += 1
88 end
89 end
90
91 # Replace a child with an other node in the AST
92 private fun replace_child(old_child: ANode, new_child: nullable ANode) is abstract
93
94 # Detach a node from its parent
95 # Aborts if the node is not detachable. use `replace_with` instead
96 # REQUIRE: parent != null
97 # REQUIRE: is_detachable
98 # ENDURE: parent == null
99 fun detach
100 do
101 assert parent != null
102 parent.replace_child(self, null)
103 parent = null
104 end
105
106 # Replace itself with an other node in the AST
107 # REQUIRE: parent != null
108 # ENSURE: node.parent == old(parent)
109 # ENSURE: parent == null
110 fun replace_with(node: ANode)
111 do
112 assert parent != null
113 parent.replace_child(self, node)
114 parent = null
115 end
116
117 # Visit all nodes in order.
118 # Thus, call `v.enter_visit(e)` for each child `e`
119 fun visit_all(v: Visitor) is abstract
120 end
121
122 # A sequence of nodes
123 # It is a specific class (instead of using a Array) to track the parent/child relation when nodes are added or removed
124 class ANodes[E: ANode]
125 super Sequence[E]
126 private var parent: ANode
127 private var items = new Array[E]
128 redef fun iterator do return items.iterator
129 redef fun length do return items.length
130 redef fun is_empty do return items.is_empty
131 redef fun push(e)
132 do
133 hook_add(e)
134 items.push(e)
135 end
136 redef fun pop
137 do
138 var res = items.pop
139 hook_remove(res)
140 return res
141 end
142 redef fun unshift(e)
143 do
144 hook_add(e)
145 items.unshift(e)
146 end
147 redef fun shift
148 do
149 var res = items.shift
150 hook_remove(res)
151 return res
152 end
153 redef fun has(e)
154 do
155 return items.has(e)
156 end
157 redef fun [](index)
158 do
159 return items[index]
160 end
161 redef fun []=(index, e)
162 do
163 hook_remove(self[index])
164 hook_add(e)
165 items[index]=e
166 end
167 redef fun remove_at(index)
168 do
169 hook_remove(items[index])
170 items.remove_at(index)
171 end
172 private fun hook_add(e: E)
173 do
174 #assert e.parent == null
175 e.parent = parent
176 end
177 private fun hook_remove(e: E)
178 do
179 assert e.parent == parent
180 e.parent = null
181 end
182
183 # Used in parent constructor to fill elements
184 private fun unsafe_add_all(nodes: Collection[Object])
185 do
186 var parent = self.parent
187 for n in nodes do
188 assert n isa E
189 add n
190 n.parent = parent
191 end
192 end
193
194 private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool
195 do
196 var parent = self.parent
197 for i in [0..length[ do
198 if self[i] == old_child then
199 if new_child != null then
200 assert new_child isa E
201 self[i] = new_child
202 new_child.parent = parent
203 else
204 self.remove_at(i)
205 end
206 return true
207 end
208 end
209 return false
210 end
211
212 private fun visit_all(v: Visitor)
213 do
214 for n in self do v.enter_visit(n)
215 end
216 end
217
218 # Ancestor of all tokens
219 # A token is a node that has a `text` but no children.
220 abstract class Token
221 super ANode
222
223 # The raw content on the token
224 fun text: String is abstract
225
226 # The raw content on the token
227 fun text=(text: String) is abstract
228
229 # The previous token in the Lexer.
230 # May have disappeared in the AST
231 var prev_token: nullable Token = null
232
233 # The next token in the Lexer.
234 # May have disappeared in the AST
235 var next_token: nullable Token = null
236
237 # The verbatim blank text between `prev_token` and `self`
238 fun blank_before: String
239 do
240 if prev_token == null then return ""
241 var from = prev_token.location.pend+1
242 var to = location.pstart
243 return location.file.string.substring(from,to-from)
244 end
245
246 redef fun to_s: String do
247 return "'{text}'"
248 end
249
250 redef fun visit_all(v: Visitor) do end
251 redef fun replace_child(old_child: ANode, new_child: nullable ANode) do end
252 end
253
254 redef class SourceFile
255 # The first token parser by the lexer
256 # May have disappeared in the final AST
257 var first_token: nullable Token = null
258
259 # The first token parser by the lexer
260 # May have disappeared in the final AST
261 var last_token: nullable Token = null
262 end
263
264 # Ancestor of all productions
265 # A production is a node without text but that usually has children.
266 abstract class Prod
267 super ANode
268
269 # All the annotations attached directly to the node
270 var n_annotations: nullable AAnnotations = null is writable
271
272 redef fun replace_with(n: ANode)
273 do
274 super
275 assert n isa Prod
276 if not isset n._location and isset _location then n._location = _location
277 end
278 end
279
280 # Abstract standard visitor on the AST
281 abstract class Visitor
282 # What the visitor do when a node is visited
283 # Concrete visitors should implement this method.
284 # @toimplement
285 protected fun visit(e: ANode) is abstract
286
287 # Ask the visitor to visit a given node.
288 # Usually automatically called by visit_all* methods.
289 # This method should not be redefined
290 fun enter_visit(e: nullable ANode)
291 do
292 if e == null then return
293 var old = _current_node
294 _current_node = e
295 visit(e)
296 _current_node = old
297 end
298
299 # The current visited node
300 var current_node: nullable ANode = null is writable
301 end
302
303 # Token of end of line (basically `\n`)
304 class TEol
305 super Token
306 redef fun to_s
307 do
308 return "end of line"
309 end
310 end
311
312 # Token of a line of comments
313 # Starts with the `#` and contains the final end-of-line (if any)
314 class TComment
315 super Token
316 end
317
318 # A token associated with a keyword
319 abstract class TokenKeyword
320 super Token
321 redef fun to_s
322 do
323 return "keyword '{text}'"
324 end
325 end
326
327 # The deprecated keyword `package`.
328 class TKwpackage
329 super TokenKeyword
330 end
331
332 # The keyword `module`
333 class TKwmodule
334 super TokenKeyword
335 end
336
337 # The keyword `import`
338 class TKwimport
339 super TokenKeyword
340 end
341
342 # The keyword `class`
343 class TKwclass
344 super TokenKeyword
345 end
346
347 # The keyword `abstract`
348 class TKwabstract
349 super TokenKeyword
350 end
351
352 # The keyword `interface`
353 class TKwinterface
354 super TokenKeyword
355 end
356
357 # The keywords `enum` ane `universal`
358 class TKwenum
359 super TokenKeyword
360 end
361
362 # The keyword `end`
363 class TKwend
364 super TokenKeyword
365 end
366
367 # The keyword `fun`
368 class TKwmeth
369 super TokenKeyword
370 end
371
372 # The keyword `type`
373 class TKwtype
374 super TokenKeyword
375 end
376
377 # The keyword `init`
378 class TKwinit
379 super TokenKeyword
380 end
381
382 # The keyword `redef`
383 class TKwredef
384 super TokenKeyword
385 end
386
387 # The keyword `is`
388 class TKwis
389 super TokenKeyword
390 end
391
392 # The keyword `do`
393 class TKwdo
394 super TokenKeyword
395 end
396
397 # The keyword `var`
398 class TKwvar
399 super TokenKeyword
400 end
401
402 # The keyword `extern`
403 class TKwextern
404 super TokenKeyword
405 end
406
407 # The keyword `public`
408 class TKwpublic
409 super TokenKeyword
410 end
411
412 # The keyword `protected`
413 class TKwprotected
414 super TokenKeyword
415 end
416
417 # The keyword `private`
418 class TKwprivate
419 super TokenKeyword
420 end
421
422 # The keyword `intrude`
423 class TKwintrude
424 super TokenKeyword
425 end
426
427 # The keyword `if`
428 class TKwif
429 super TokenKeyword
430 end
431
432 # The keyword `then`
433 class TKwthen
434 super TokenKeyword
435 end
436
437 # The keyword `else`
438 class TKwelse
439 super TokenKeyword
440 end
441
442 # The keyword `while`
443 class TKwwhile
444 super TokenKeyword
445 end
446
447 # The keyword `loop`
448 class TKwloop
449 super TokenKeyword
450 end
451
452 # The keyword `for`
453 class TKwfor
454 super TokenKeyword
455 end
456
457 # The keyword `in`
458 class TKwin
459 super TokenKeyword
460 end
461
462 # The keyword `and`
463 class TKwand
464 super TokenKeyword
465 end
466
467 # The keyword `or`
468 class TKwor
469 super TokenKeyword
470 end
471
472 # The keyword `implies`
473 class TKwimplies
474 super TokenKeyword
475 end
476
477 # The keyword `not`
478 class TKwnot
479 super TokenKeyword
480 end
481
482 # The keyword `return`
483 class TKwreturn
484 super TokenKeyword
485 end
486
487 # The keyword `continue`
488 class TKwcontinue
489 super TokenKeyword
490 end
491
492 # The keyword `break`
493 class TKwbreak
494 super TokenKeyword
495 end
496
497 # The keyword `abort`
498 class TKwabort
499 super TokenKeyword
500 end
501
502 # The keyword `assert`
503 class TKwassert
504 super TokenKeyword
505 end
506
507 # The keyword `new`
508 class TKwnew
509 super TokenKeyword
510 end
511
512 # The keyword `isa`
513 class TKwisa
514 super TokenKeyword
515 end
516
517 # The keyword `once`
518 class TKwonce
519 super TokenKeyword
520 end
521
522 # The keyword `super`
523 class TKwsuper
524 super TokenKeyword
525 end
526
527 # The keyword `self`
528 class TKwself
529 super TokenKeyword
530 end
531
532 # The keyword `true`
533 class TKwtrue
534 super TokenKeyword
535 end
536
537 # The keyword `false`
538 class TKwfalse
539 super TokenKeyword
540 end
541
542 # The keyword `null`
543 class TKwnull
544 super TokenKeyword
545 end
546
547 # The keyword `as`
548 class TKwas
549 super TokenKeyword
550 end
551
552 # The keyword `nullable`
553 class TKwnullable
554 super TokenKeyword
555 end
556
557 # The keyword `isset`
558 class TKwisset
559 super TokenKeyword
560 end
561
562 # The keyword `label`
563 class TKwlabel
564 super TokenKeyword
565 end
566
567 # The special keyword `__DEBUG__`
568 class TKwdebug
569 super Token
570 end
571
572 # The symbol `(`
573 class TOpar
574 super Token
575 end
576
577 # The symbol `)`
578 class TCpar
579 super Token
580 end
581
582 # The symbol `[`
583 class TObra
584 super Token
585 end
586
587 # The symbol `]`
588 class TCbra
589 super Token
590 end
591
592 # The symbol `,`
593 class TComma
594 super Token
595 end
596
597 # The symbol `:`
598 class TColumn
599 super Token
600 end
601
602 # The symbol `::`
603 class TQuad
604 super Token
605 end
606
607 # The symbol `=`
608 class TAssign
609 super Token
610 end
611
612 # A token associated with an operator (and other lookalike symbols)
613 abstract class TokenOperator
614 super Token
615 redef fun to_s
616 do
617 return "operator '{text}'"
618 end
619 end
620
621 # The operator `+=`
622 class TPluseq
623 super TokenOperator
624 end
625
626 # The operator `-=`
627 class TMinuseq
628 super TokenOperator
629 end
630
631 # The symbol `...`
632 class TDotdotdot
633 super Token
634 end
635
636 # The symbol `..`
637 class TDotdot
638 super Token
639 end
640
641 # The symbol `.`
642 class TDot
643 super Token
644 end
645
646 # The operator `+`
647 class TPlus
648 super TokenOperator
649 end
650
651 # The operator `-`
652 class TMinus
653 super TokenOperator
654 end
655
656 # The operator `*`
657 class TStar
658 super TokenOperator
659 end
660
661 # The operator `**`
662 class TStarstar
663 super TokenOperator
664 end
665
666 # The operator `/`
667 class TSlash
668 super TokenOperator
669 end
670
671 # The operator `+%
672 class TPercent
673 super TokenOperator
674 end
675
676 # The operator `==`
677 class TEq
678 super TokenOperator
679 end
680
681 # The operator `!=`
682 class TNe
683 super TokenOperator
684 end
685
686 # The operator `<`
687 class TLt
688 super TokenOperator
689 end
690
691 # The operator `<=`
692 class TLe
693 super TokenOperator
694 end
695
696 # The operator `<<`
697 class TLl
698 super TokenOperator
699 end
700
701 # The operator `>`
702 class TGt
703 super TokenOperator
704 end
705
706 # The operator `>=`
707 class TGe
708 super TokenOperator
709 end
710
711 # The operator `>>`
712 class TGg
713 super TokenOperator
714 end
715
716 # The operator `<=>`
717 class TStarship
718 super TokenOperator
719 end
720
721 # The operator `!`
722 class TBang
723 super TokenOperator
724 end
725
726 # The symbol `@`
727 class TAt
728 super Token
729 end
730
731 # A class (or formal type) identifier. They start with an uppercase.
732 class TClassid
733 super Token
734 redef fun to_s
735 do
736 do return "type identifier '{text}'"
737 end
738 end
739
740 # A standard identifier (variable, method...). They start with a lowercase.
741 class TId
742 super Token
743 redef fun to_s
744 do
745 do return "identifier '{text}'"
746 end
747 end
748
749 # An attribute identifier. They start with an underscore.
750 class TAttrid
751 super Token
752 redef fun to_s
753 do
754 do return "attribute '{text}'"
755 end
756 end
757
758 # A token of a literal value (string, integer, etc).
759 abstract class TokenLiteral
760 super Token
761 redef fun to_s
762 do
763 do return "literal value '{text}'"
764 end
765 end
766
767 # A literal decimal integer
768 class TNumber
769 super TokenLiteral
770 end
771
772 # A literal hexadecimal integer
773 class THexNumber
774 super TokenLiteral
775 end
776
777 # A literal floating point number
778 class TFloat
779 super TokenLiteral
780 end
781
782 # A literal character
783 class TChar
784 super TokenLiteral
785 end
786
787 # A literal string
788 class TString
789 super TokenLiteral
790 end
791
792 # The starting part of a super string (between `"` and `{`)
793 class TStartString
794 super TokenLiteral
795 end
796
797 # The middle part of a super string (between `}` and `{`)
798 class TMidString
799 super TokenLiteral
800 end
801
802 # The final part of a super string (between `}` and `"`)
803 class TEndString
804 super TokenLiteral
805 end
806
807 # A malformed string
808 class TBadString
809 super Token
810 redef fun to_s
811 do
812 do return "malformed string {text}"
813 end
814 end
815
816 # A malformed char
817 class TBadChar
818 super Token
819 redef fun to_s
820 do
821 do return "malformed character {text}"
822 end
823 end
824
825 # A extern code block
826 class TExternCodeSegment
827 super Token
828 end
829
830 # A end of file
831 class EOF
832 super Token
833 redef fun to_s
834 do
835 return "end of file"
836 end
837 end
838
839 # A mark of an error
840 class AError
841 super EOF
842 end
843 # A lexical error (unexpected character)
844 class ALexerError
845 super AError
846 end
847 # A syntactic error (unexpected token)
848 class AParserError
849 super AError
850 end
851
852 # The main node of a Nit source-file
853 class AModule
854 super Prod
855
856 var n_moduledecl: nullable AModuledecl = null is writable
857 var n_imports = new ANodes[AImport](self)
858 var n_extern_code_blocks = new ANodes[AExternCodeBlock](self)
859 var n_classdefs = new ANodes[AClassdef](self)
860 end
861
862 # The declaration of the module with the documentation, name, and annotations
863 class AModuledecl
864 super Prod
865 var n_doc: nullable ADoc = null is writable
866 var n_kwredef: nullable TKwredef = null is writable
867 var n_visibility: AVisibility is writable, noinit
868 var n_kwmodule: TKwmodule is writable, noinit
869 var n_name: AModuleName is writable, noinit
870 end
871
872 # A import clause of a module
873 abstract class AImport
874 super Prod
875 end
876
877 # A standard import clause. eg `import x`
878 class AStdImport
879 super AImport
880 var n_visibility: AVisibility is writable, noinit
881 var n_kwimport: TKwimport is writable, noinit
882 var n_name: AModuleName is writable, noinit
883 end
884
885 # The special import clause of the kernel module. eg `import end`
886 class ANoImport
887 super AImport
888 var n_visibility: AVisibility is writable, noinit
889 var n_kwimport: TKwimport is writable, noinit
890 var n_kwend: TKwend is writable, noinit
891 end
892
893 # A visibility modifier
894 #
895 # The public visibility is an empty production (no keyword).
896 #
897 # Note: even if some visibilities are only valid on some placse (for instance, no `protected` class or no `intrude` method)
898 # the parser has no such a restriction, therefore the semantic phases has to check that the visibilities make sense.
899 abstract class AVisibility
900 super Prod
901 end
902
903 # An implicit or explicit public visibility modifier
904 class APublicVisibility
905 super AVisibility
906 var n_kwpublic: nullable TKwpublic is writable
907 end
908 # An explicit private visibility modifier
909 class APrivateVisibility
910 super AVisibility
911 var n_kwprivate: TKwprivate is writable, noinit
912 end
913 # An explicit protected visibility modifier
914 class AProtectedVisibility
915 super AVisibility
916 var n_kwprotected: TKwprotected is writable, noinit
917 end
918 # An explicit intrude visibility modifier
919 class AIntrudeVisibility
920 super AVisibility
921 var n_kwintrude: TKwintrude is writable, noinit
922 end
923
924 # A class definition
925 # While most definition are `AStdClassdef`
926 # There is tow special case of class definition
927 abstract class AClassdef
928 super Prod
929 var n_propdefs = new ANodes[APropdef](self)
930 end
931
932 # A standard class definition with a name, superclasses and properties
933 class AStdClassdef
934 super AClassdef
935 var n_doc: nullable ADoc = null is writable
936 var n_kwredef: nullable TKwredef = null is writable
937 var n_visibility: AVisibility is writable, noinit
938 var n_classkind: AClasskind is writable, noinit
939 var n_id: nullable TClassid = null is writable
940 var n_formaldefs = new ANodes[AFormaldef](self)
941 var n_extern_code_block: nullable AExternCodeBlock = null is writable
942 var n_superclasses = new ANodes[ASuperclass](self)
943 var n_kwend: TKwend is writable, noinit
944 redef fun hot_location do return n_id.location
945 end
946
947 # The implicit class definition of the implicit main method
948 class ATopClassdef
949 super AClassdef
950 end
951
952 # The implicit class definition of the top-level methods
953 class AMainClassdef
954 super AClassdef
955 end
956
957 # The modifier for the kind of class (abstract, interface, etc.)
958 abstract class AClasskind
959 super Prod
960 end
961
962 # A default, or concrete class modifier (just `class`)
963 class AConcreteClasskind
964 super AClasskind
965 var n_kwclass: TKwclass is writable, noinit
966 end
967
968 # An abstract class modifier (`abstract class`)
969 class AAbstractClasskind
970 super AClasskind
971 var n_kwabstract: TKwabstract is writable, noinit
972 var n_kwclass: TKwclass is writable, noinit
973 end
974
975 # An interface class modifier (`interface`)
976 class AInterfaceClasskind
977 super AClasskind
978 var n_kwinterface: TKwinterface is writable, noinit
979 end
980
981 # An enum/universal class modifier (`enum class`)
982 class AEnumClasskind
983 super AClasskind
984 var n_kwenum: TKwenum is writable, noinit
985 end
986
987 # An extern class modifier (`extern class`)
988 class AExternClasskind
989 super AClasskind
990 var n_kwextern: TKwextern is writable, noinit
991 var n_kwclass: nullable TKwclass = null is writable
992 end
993
994 # The definition of a formal generic parameter type. eg `X: Y`
995 class AFormaldef
996 super Prod
997 var n_id: TClassid is writable, noinit
998 # The bound of the parameter type
999 var n_type: nullable AType = null is writable
1000 end
1001
1002 # A super-class. eg `super X`
1003 class ASuperclass
1004 super Prod
1005 var n_kwsuper: TKwsuper is writable, noinit
1006 var n_type: AType is writable, noinit
1007 end
1008
1009 # The definition of a property
1010 abstract class APropdef
1011 super Prod
1012 var n_doc: nullable ADoc = null is writable
1013 var n_kwredef: nullable TKwredef = null is writable
1014 var n_visibility: nullable AVisibility = null is writable
1015 end
1016
1017 # A definition of an attribute
1018 # For historical reason, old-syle and new-style attributes use the same `ANode` sub-class
1019 class AAttrPropdef
1020 super APropdef
1021 var n_kwvar: TKwvar is writable, noinit
1022
1023 # The identifier for a new-style attribute (null if old-style)
1024 var n_id2: TId is writable, noinit
1025
1026 var n_type: nullable AType = null is writable
1027
1028 # The initial value, if any
1029 var n_expr: nullable AExpr = null is writable
1030
1031 var n_block: nullable AExpr = null is writable
1032
1033 redef fun hot_location
1034 do
1035 return n_id2.location
1036 end
1037 end
1038
1039 # A definition of all kind of method (including constructors)
1040 class AMethPropdef
1041 super APropdef
1042 var n_kwmeth: nullable TKwmeth = null is writable
1043 var n_kwinit: nullable TKwinit = null is writable
1044 var n_kwnew: nullable TKwnew = null is writable
1045 var n_methid: nullable AMethid = null is writable
1046 var n_signature: nullable ASignature = null is writable
1047 var n_block: nullable AExpr = null is writable
1048 var n_extern_calls: nullable AExternCalls = null is writable
1049 var n_extern_code_block: nullable AExternCodeBlock = null is writable
1050 redef fun hot_location
1051 do
1052 if n_methid != null then
1053 return n_methid.location
1054 else if n_kwinit != null then
1055 return n_kwinit.location
1056 else if n_kwnew != null then
1057 return n_kwnew.location
1058 else
1059 return location
1060 end
1061 end
1062 end
1063
1064 # The implicit main method
1065 class AMainMethPropdef
1066 super AMethPropdef
1067 end
1068
1069 # Declaration of callbacks for extern methods
1070 class AExternCalls
1071 super Prod
1072 var n_kwimport: TKwimport is writable, noinit
1073 var n_extern_calls: ANodes[AExternCall] = new ANodes[AExternCall](self)
1074 end
1075
1076 # A single callback declaration
1077 abstract class AExternCall
1078 super Prod
1079 end
1080
1081 # A single callback declaration on a method
1082 abstract class APropExternCall
1083 super AExternCall
1084 end
1085
1086 # A single callback declaration on a method on the current receiver
1087 class ALocalPropExternCall
1088 super APropExternCall
1089 var n_methid: AMethid is writable, noinit
1090 end
1091
1092 # A single callback declaration on a method on an explicit receiver type.
1093 class AFullPropExternCall
1094 super APropExternCall
1095 var n_type: AType is writable, noinit
1096 var n_dot: nullable TDot = null is writable
1097 var n_methid: AMethid is writable, noinit
1098 end
1099
1100 # A single callback declaration on a method on a constructor
1101 class AInitPropExternCall
1102 super APropExternCall
1103 var n_type: AType is writable, noinit
1104 end
1105
1106 # A single callback declaration on a `super` call
1107 class ASuperExternCall
1108 super AExternCall
1109 var n_kwsuper: TKwsuper is writable, noinit
1110 end
1111
1112 # A single callback declaration on a cast
1113 abstract class ACastExternCall
1114 super AExternCall
1115 end
1116
1117 # A single callback declaration on a cast to a given type
1118 class ACastAsExternCall
1119 super ACastExternCall
1120 var n_from_type: AType is writable, noinit
1121 var n_dot: nullable TDot = null is writable
1122 var n_kwas: TKwas is writable, noinit
1123 var n_to_type: AType is writable, noinit
1124 end
1125
1126 # A single callback declaration on a cast to a nullable type
1127 class AAsNullableExternCall
1128 super ACastExternCall
1129 var n_type: AType is writable, noinit
1130 var n_kwas: TKwas is writable, noinit
1131 var n_kwnullable: TKwnullable is writable, noinit
1132 end
1133
1134 # A single callback declaration on a cast to a non-nullable type
1135 class AAsNotNullableExternCall
1136 super ACastExternCall
1137 var n_type: AType is writable, noinit
1138 var n_kwas: TKwas is writable, noinit
1139 var n_kwnot: TKwnot is writable, noinit
1140 var n_kwnullable: TKwnullable is writable, noinit
1141 end
1142
1143 # A definition of a virtual type
1144 class ATypePropdef
1145 super APropdef
1146 var n_kwtype: TKwtype is writable, noinit
1147 var n_id: TClassid is writable, noinit
1148 var n_type: AType is writable, noinit
1149 end
1150
1151 # The identifier of a method in a method declaration.
1152 # There is a specific class because of operator and setters.
1153 abstract class AMethid
1154 super Prod
1155 end
1156
1157 # A method name with a simple identifier
1158 class AIdMethid
1159 super AMethid
1160 var n_id: TId is writable, noinit
1161 end
1162
1163 # A method name `+`
1164 class APlusMethid
1165 super AMethid
1166 var n_plus: TPlus is writable, noinit
1167 end
1168
1169 # A method name `-`
1170 class AMinusMethid
1171 super AMethid
1172 var n_minus: TMinus is writable, noinit
1173 end
1174
1175 # A method name `*`
1176 class AStarMethid
1177 super AMethid
1178 var n_star: TStar is writable, noinit
1179 end
1180
1181 # A method name `**`
1182 class AStarstarMethid
1183 super AMethid
1184 var n_starstar: TStarstar is writable, noinit
1185 end
1186
1187 # A method name `/`
1188 class ASlashMethid
1189 super AMethid
1190 var n_slash: TSlash is writable, noinit
1191 end
1192
1193 # A method name `%`
1194 class APercentMethid
1195 super AMethid
1196 var n_percent: TPercent is writable, noinit
1197 end
1198
1199 # A method name `==`
1200 class AEqMethid
1201 super AMethid
1202 var n_eq: TEq is writable, noinit
1203 end
1204
1205 # A method name `!=`
1206 class ANeMethid
1207 super AMethid
1208 var n_ne: TNe is writable, noinit
1209 end
1210
1211 # A method name `<=`
1212 class ALeMethid
1213 super AMethid
1214 var n_le: TLe is writable, noinit
1215 end
1216
1217 # A method name `>=`
1218 class AGeMethid
1219 super AMethid
1220 var n_ge: TGe is writable, noinit
1221 end
1222
1223 # A method name `<`
1224 class ALtMethid
1225 super AMethid
1226 var n_lt: TLt is writable, noinit
1227 end
1228
1229 # A method name `>`
1230 class AGtMethid
1231 super AMethid
1232 var n_gt: TGt is writable, noinit
1233 end
1234
1235 # A method name `<<`
1236 class ALlMethid
1237 super AMethid
1238 var n_ll: TLl is writable, noinit
1239 end
1240
1241 # A method name `>>`
1242 class AGgMethid
1243 super AMethid
1244 var n_gg: TGg is writable, noinit
1245 end
1246
1247 # A method name `[]`
1248 class ABraMethid
1249 super AMethid
1250 var n_obra: TObra is writable, noinit
1251 var n_cbra: TCbra is writable, noinit
1252 end
1253
1254 # A method name `<=>`
1255 class AStarshipMethid
1256 super AMethid
1257 var n_starship: TStarship is writable, noinit
1258 end
1259
1260 # A setter method name with a simple identifier (with a `=`)
1261 class AAssignMethid
1262 super AMethid
1263 var n_id: TId is writable, noinit
1264 var n_assign: TAssign is writable, noinit
1265 end
1266
1267 # A method name `[]=`
1268 class ABraassignMethid
1269 super AMethid
1270 var n_obra: TObra is writable, noinit
1271 var n_cbra: TCbra is writable, noinit
1272 var n_assign: TAssign is writable, noinit
1273 end
1274
1275 # A signature in a method definition. eg `(x,y:X,z:Z):T`
1276 class ASignature
1277 super Prod
1278 var n_opar: nullable TOpar = null is writable
1279 var n_params = new ANodes[AParam](self)
1280 var n_cpar: nullable TCpar = null is writable
1281 var n_type: nullable AType = null is writable
1282 end
1283
1284 # A parameter definition in a signature. eg `x:X`
1285 class AParam
1286 super Prod
1287 var n_id: TId is writable, noinit
1288 var n_type: nullable AType = null is writable
1289 var n_dotdotdot: nullable TDotdotdot = null is writable
1290 end
1291
1292 # A static type. eg `nullable X[Y]`
1293 class AType
1294 super Prod
1295 var n_kwnullable: nullable TKwnullable = null is writable
1296
1297 # The name of the class or of the formal type
1298 var n_id: TClassid is writable, noinit
1299
1300 # Type arguments for a generic type
1301 var n_types = new ANodes[AType](self)
1302 end
1303
1304 # A label at the end of a block or in a break/continue statement. eg `label x`
1305 class ALabel
1306 super Prod
1307 var n_kwlabel: TKwlabel is writable, noinit
1308 var n_id: nullable TId is writable
1309 end
1310
1311 # Expression and statements
1312 # From a AST point of view there is no distinction between statement and expressions (even if the parser has to distinguish them)
1313 abstract class AExpr
1314 super Prod
1315 end
1316
1317 # A sequence of `AExpr` (usually statements)
1318 # The last `AExpr` gives the value of the whole block
1319 class ABlockExpr
1320 super AExpr
1321 var n_expr = new ANodes[AExpr](self)
1322 var n_kwend: nullable TKwend = null is writable
1323 end
1324
1325 # A declaration of a local variable. eg `var x: X = y`
1326 class AVardeclExpr
1327 super AExpr
1328 var n_kwvar: TKwvar is writable, noinit
1329 var n_id: TId is writable, noinit
1330 var n_type: nullable AType = null is writable
1331 var n_assign: nullable TAssign = null is writable
1332
1333 # The initial value, if any
1334 var n_expr: nullable AExpr = null is writable
1335 end
1336
1337 # A `return` statement. eg `return x`
1338 class AReturnExpr
1339 super AExpr
1340 var n_kwreturn: nullable TKwreturn = null is writable
1341 var n_expr: nullable AExpr = null is writable
1342 end
1343
1344 # Something that has a label.
1345 abstract class ALabelable
1346 super Prod
1347 var n_label: nullable ALabel = null is writable
1348 end
1349
1350 # A `break` or a `continue`
1351 abstract class AEscapeExpr
1352 super AExpr
1353 super ALabelable
1354 var n_expr: nullable AExpr = null is writable
1355 end
1356
1357 # A `break` statement.
1358 class ABreakExpr
1359 super AEscapeExpr
1360 var n_kwbreak: TKwbreak is writable, noinit
1361 end
1362
1363 # An `abort` statement
1364 class AAbortExpr
1365 super AExpr
1366 var n_kwabort: TKwabort is writable, noinit
1367 end
1368
1369 # A `continue` statement
1370 class AContinueExpr
1371 super AEscapeExpr
1372 var n_kwcontinue: nullable TKwcontinue = null is writable
1373 end
1374
1375 # A `do` statement
1376 class ADoExpr
1377 super AExpr
1378 super ALabelable
1379 var n_kwdo: TKwdo is writable, noinit
1380 var n_block: nullable AExpr = null is writable
1381 end
1382
1383 # A `if` statement
1384 class AIfExpr
1385 super AExpr
1386 var n_kwif: TKwif is writable, noinit
1387 var n_expr: AExpr is writable, noinit
1388 var n_then: nullable AExpr = null is writable
1389 var n_else: nullable AExpr = null is writable
1390 end
1391
1392 # A `if` expression
1393 class AIfexprExpr
1394 super AExpr
1395 var n_kwif: TKwif is writable, noinit
1396 var n_expr: AExpr is writable, noinit
1397 var n_kwthen: TKwthen is writable, noinit
1398 var n_then: AExpr is writable, noinit
1399 var n_kwelse: TKwelse is writable, noinit
1400 var n_else: AExpr is writable, noinit
1401 end
1402
1403 # A `while` statement
1404 class AWhileExpr
1405 super AExpr
1406 super ALabelable
1407 var n_kwwhile: TKwwhile is writable, noinit
1408 var n_expr: AExpr is writable, noinit
1409 var n_kwdo: TKwdo is writable, noinit
1410 var n_block: nullable AExpr = null is writable
1411 end
1412
1413 # A `loop` statement
1414 class ALoopExpr
1415 super AExpr
1416 super ALabelable
1417 var n_kwloop: TKwloop is writable, noinit
1418 var n_block: nullable AExpr = null is writable
1419 end
1420
1421 # A `for` statement
1422 class AForExpr
1423 super AExpr
1424 super ALabelable
1425 var n_kwfor: TKwfor is writable, noinit
1426 var n_ids = new ANodes[TId](self)
1427 var n_expr: AExpr is writable, noinit
1428 var n_kwdo: TKwdo is writable, noinit
1429 var n_block: nullable AExpr = null is writable
1430 end
1431
1432 # An `assert` statement
1433 class AAssertExpr
1434 super AExpr
1435 var n_kwassert: TKwassert is writable, noinit
1436 var n_id: nullable TId = null is writable
1437 var n_expr: AExpr is writable, noinit
1438 var n_else: nullable AExpr = null is writable
1439 end
1440
1441 # Whatever is a simple assignment. eg `= something`
1442 abstract class AAssignFormExpr
1443 super AExpr
1444 var n_assign: TAssign is writable, noinit
1445 var n_value: AExpr is writable, noinit
1446 end
1447
1448 # Whatever is a combined assignment. eg `+= something`
1449 abstract class AReassignFormExpr
1450 super AExpr
1451 var n_assign_op: AAssignOp is writable, noinit
1452 var n_value: AExpr is writable, noinit
1453 end
1454
1455 # A `once` expression. eg `once x`
1456 class AOnceExpr
1457 super AExpr
1458 var n_kwonce: TKwonce is writable, noinit
1459 var n_expr: AExpr is writable, noinit
1460 end
1461
1462 # A polymorphic invocation of a method
1463 # The form of the invocation (name, arguments, etc.) are specific
1464 abstract class ASendExpr
1465 super AExpr
1466 # The receiver of the method invocation
1467 var n_expr: AExpr is writable, noinit
1468 end
1469
1470 # A binary operation on a method
1471 abstract class ABinopExpr
1472 super ASendExpr
1473 # The second operand of the operation
1474 # Note: the receiver (`n_expr`) is the first operand
1475 var n_expr2: AExpr is writable, noinit
1476 end
1477
1478 # Something that is boolean expression
1479 abstract class ABoolExpr
1480 super AExpr
1481 end
1482
1483 # A `or` expression
1484 class AOrExpr
1485 super ABoolExpr
1486 var n_expr: AExpr is writable, noinit
1487 var n_expr2: AExpr is writable, noinit
1488 end
1489
1490 # A `and` expression
1491 class AAndExpr
1492 super ABoolExpr
1493 var n_expr: AExpr is writable, noinit
1494 var n_expr2: AExpr is writable, noinit
1495 end
1496
1497 # A `or else` expression
1498 class AOrElseExpr
1499 super ABoolExpr
1500 var n_expr: AExpr is writable, noinit
1501 var n_expr2: AExpr is writable, noinit
1502 end
1503
1504 # A `implies` expression
1505 class AImpliesExpr
1506 super ABoolExpr
1507 var n_expr: AExpr is writable, noinit
1508 var n_expr2: AExpr is writable, noinit
1509 end
1510
1511 # A `not` expression
1512 class ANotExpr
1513 super ABoolExpr
1514 var n_kwnot: TKwnot is writable, noinit
1515 var n_expr: AExpr is writable, noinit
1516 end
1517
1518 # A `==` expression
1519 class AEqExpr
1520 super ABinopExpr
1521 end
1522
1523 # A `!=` expression
1524 class ANeExpr
1525 super ABinopExpr
1526 end
1527
1528 # A `<` expression
1529 class ALtExpr
1530 super ABinopExpr
1531 end
1532
1533 # A `<=` expression
1534 class ALeExpr
1535 super ABinopExpr
1536 end
1537
1538 # A `<<` expression
1539 class ALlExpr
1540 super ABinopExpr
1541 end
1542
1543 # A `>` expression
1544 class AGtExpr
1545 super ABinopExpr
1546 end
1547
1548 # A `>=` expression
1549 class AGeExpr
1550 super ABinopExpr
1551 end
1552
1553 # A `>>` expression
1554 class AGgExpr
1555 super ABinopExpr
1556 end
1557
1558 # A type-ckeck expression. eg `x isa T`
1559 class AIsaExpr
1560 super ABoolExpr
1561 var n_expr: AExpr is writable, noinit
1562 var n_type: AType is writable, noinit
1563 end
1564
1565 # A `+` expression
1566 class APlusExpr
1567 super ABinopExpr
1568 end
1569
1570 # A `-` expression
1571 class AMinusExpr
1572 super ABinopExpr
1573 end
1574
1575 # A `<=>` expression
1576 class AStarshipExpr
1577 super ABinopExpr
1578 end
1579
1580 # A `*` expression
1581 class AStarExpr
1582 super ABinopExpr
1583 end
1584
1585 # A `**` expression
1586 class AStarstarExpr
1587 super ABinopExpr
1588 end
1589
1590 # A `/` expression
1591 class ASlashExpr
1592 super ABinopExpr
1593 end
1594
1595 # A `%` expression
1596 class APercentExpr
1597 super ABinopExpr
1598 end
1599
1600 # A unary minus expression. eg `-x`
1601 class AUminusExpr
1602 super ASendExpr
1603 var n_minus: TMinus is writable, noinit
1604 end
1605
1606 # An explicit instantiation. eg `new T`
1607 class ANewExpr
1608 super AExpr
1609 var n_kwnew: TKwnew is writable, noinit
1610 var n_type: AType is writable, noinit
1611
1612 # The name of the named-constructor, if any
1613 var n_id: nullable TId = null is writable
1614 var n_args: AExprs is writable, noinit
1615 end
1616
1617 # Whatever is a old-style attribute access
1618 abstract class AAttrFormExpr
1619 super AExpr
1620
1621 # The receiver of the attribute
1622 var n_expr: AExpr is writable, noinit
1623
1624 # The name of the attribute
1625 var n_id: TAttrid is writable, noinit
1626
1627 end
1628
1629 # The read of an attribute. eg `x._a`
1630 class AAttrExpr
1631 super AAttrFormExpr
1632 end
1633
1634 # The assignment of an attribute. eg `x._a=y`
1635 class AAttrAssignExpr
1636 super AAttrFormExpr
1637 super AAssignFormExpr
1638 end
1639
1640 # Whatever looks-like a call with a standard method and any number of arguments.
1641 abstract class ACallFormExpr
1642 super ASendExpr
1643
1644 # The name of the method
1645 var n_id: TId is writable, noinit
1646
1647 # The arguments of the call
1648 var n_args: AExprs is writable, noinit
1649 end
1650
1651 # A complex setter call (standard or brackets)
1652 abstract class ASendReassignFormExpr
1653 super ASendExpr
1654 super AReassignFormExpr
1655 end
1656
1657 # A complex attribute assignment. eg `x._a+=y`
1658 class AAttrReassignExpr
1659 super AAttrFormExpr
1660 super AReassignFormExpr
1661 end
1662
1663 # A call with a standard method-name and any number of arguments. eg `x.m(y)`. OR just a simple id
1664 # Note: because the parser cannot distinguish a variable read with a method call with an implicit receiver and no arguments, it always returns a `ACallExpr`.
1665 # Semantic analysis have to transform them to instance of `AVarExpr`.
1666 class ACallExpr
1667 super ACallFormExpr
1668 end
1669
1670 # A setter call with a standard method-name and any number of arguments. eg `x.m(y)=z`. OR just a simple assignment.
1671 # Note: because the parser cannot distinguish a variable write with a setter call with an implicit receiver and no arguments, it always returns a `ACallAssignExpr`.
1672 # Semantic analysis have to transform them to instance of `AVarAssignExpr`.
1673 class ACallAssignExpr
1674 super ACallFormExpr
1675 super AAssignFormExpr
1676 end
1677
1678 # A complex setter call with a standard method-name and any number of arguments. eg `x.m(y)+=z`. OR just a simple complex assignment.
1679 # Note: because the parser cannot distinguish a variable write with a complex setter call with an implicit receiver and no arguments, it always returns a `ACallReassignExpr`.
1680 # Semantic analysis have to transform them to instance of `AVarReassignExpr`.
1681 class ACallReassignExpr
1682 super ACallFormExpr
1683 super ASendReassignFormExpr
1684 end
1685
1686 # A call to `super`. OR a call of a super-constructor
1687 class ASuperExpr
1688 super AExpr
1689 var n_qualified: nullable AQualified = null is writable
1690 var n_kwsuper: TKwsuper is writable, noinit
1691 var n_args: AExprs is writable, noinit
1692 end
1693
1694 # A call to the `init` constructor.
1695 # Note: because `init` is a keyword and not a `TId`, the explicit call to init cannot be a `ACallFormExpr`.
1696 class AInitExpr
1697 super ASendExpr
1698 var n_kwinit: TKwinit is writable, noinit
1699 var n_args: AExprs is writable, noinit
1700 end
1701
1702 # Whatever looks-like a call of the brackets `[]` operator.
1703 abstract class ABraFormExpr
1704 super ASendExpr
1705 var n_args: AExprs is writable, noinit
1706 end
1707
1708 # A call of the brackets operator. eg `x[y,z]`
1709 class ABraExpr
1710 super ABraFormExpr
1711 end
1712
1713 # A setter call of the bracket operator. eg `x[y,z]=t`
1714 class ABraAssignExpr
1715 super ABraFormExpr
1716 super AAssignFormExpr
1717 end
1718
1719 # Whatever is an access to a local variable
1720 abstract class AVarFormExpr
1721 super AExpr
1722 var n_id: TId is writable, noinit
1723 end
1724
1725 # A complex setter call of the bracket operator. eg `x[y,z]+=t`
1726 class ABraReassignExpr
1727 super ABraFormExpr
1728 super ASendReassignFormExpr
1729 end
1730
1731 # A local variable read access.
1732 # The parser cannot instantiate them, see `ACallExpr`.
1733 class AVarExpr
1734 super AVarFormExpr
1735 end
1736
1737 # A local variable simple assignment access
1738 # The parser cannot instantiate them, see `ACallAssignExpr`.
1739 class AVarAssignExpr
1740 super AVarFormExpr
1741 super AAssignFormExpr
1742 end
1743
1744 # A local variable complex assignment access
1745 # The parser cannot instantiate them, see `ACallReassignExpr`.
1746 class AVarReassignExpr
1747 super AVarFormExpr
1748 super AReassignFormExpr
1749 end
1750
1751 # A literal range, open or closed
1752 abstract class ARangeExpr
1753 super AExpr
1754 var n_expr: AExpr is writable, noinit
1755 var n_expr2: AExpr is writable, noinit
1756 end
1757
1758 # A closed literal range. eg `[x..y]`
1759 class ACrangeExpr
1760 super ARangeExpr
1761 var n_obra: TObra is writable, noinit
1762 var n_cbra: TCbra is writable, noinit
1763 end
1764
1765 # An open literal range. eg `[x..y[`
1766 class AOrangeExpr
1767 super ARangeExpr
1768 var n_obra: TObra is writable, noinit
1769 var n_cbra: TObra is writable, noinit
1770 end
1771
1772 # A literal array. eg. `[x,y,z]`
1773 class AArrayExpr
1774 super AExpr
1775 var n_obra: TObra is writable, noinit
1776 var n_exprs: AExprs is writable, noinit
1777 var n_type: nullable AType = null is writable
1778 var n_cbra: TCbra is writable, noinit
1779 end
1780
1781 # A read of `self`
1782 class ASelfExpr
1783 super AExpr
1784 var n_kwself: nullable TKwself is writable
1785 end
1786
1787 # When there is no explicit receiver, `self` is implicit
1788 class AImplicitSelfExpr
1789 super ASelfExpr
1790 end
1791
1792 # A `true` boolean literal constant
1793 class ATrueExpr
1794 super ABoolExpr
1795 var n_kwtrue: TKwtrue is writable, noinit
1796 end
1797 # A `false` boolean literal constant
1798 class AFalseExpr
1799 super ABoolExpr
1800 var n_kwfalse: TKwfalse is writable, noinit
1801 end
1802 # A `null` literal constant
1803 class ANullExpr
1804 super AExpr
1805 var n_kwnull: TKwnull is writable, noinit
1806 end
1807 # An integer literal
1808 class AIntExpr
1809 super AExpr
1810 end
1811 # An integer literal in decimal format
1812 class ADecIntExpr
1813 super AIntExpr
1814 var n_number: TNumber is writable, noinit
1815 end
1816 # An integer literal in hexadecimal format
1817 class AHexIntExpr
1818 super AIntExpr
1819 var n_hex_number: THexNumber is writable, noinit
1820 end
1821 # A float literal
1822 class AFloatExpr
1823 super AExpr
1824 var n_float: TFloat is writable, noinit
1825 end
1826 # A character literal
1827 class ACharExpr
1828 super AExpr
1829 var n_char: TChar is writable, noinit
1830 end
1831 # A string literal
1832 abstract class AStringFormExpr
1833 super AExpr
1834 var n_string: Token is writable, noinit
1835 end
1836
1837 # A simple string. eg. `"abc"`
1838 class AStringExpr
1839 super AStringFormExpr
1840 end
1841
1842 # The start of a superstring. eg `"abc{`
1843 class AStartStringExpr
1844 super AStringFormExpr
1845 end
1846
1847 # The middle of a superstring. eg `}abc{`
1848 class AMidStringExpr
1849 super AStringFormExpr
1850 end
1851
1852 # The end of a superstrng. eg `}abc"`
1853 class AEndStringExpr
1854 super AStringFormExpr
1855 end
1856
1857 # A superstring literal. eg `"a{x}b{y}c"`
1858 # Each part is modeled a sequence of expression. eg. `["a{, x, }b{, y, }c"]`
1859 class ASuperstringExpr
1860 super AExpr
1861 var n_exprs = new ANodes[AExpr](self)
1862 end
1863
1864 # A simple parenthesis. eg `(x)`
1865 class AParExpr
1866 super AExpr
1867 var n_opar: TOpar is writable, noinit
1868 var n_expr: AExpr is writable, noinit
1869 var n_cpar: TCpar is writable, noinit
1870 end
1871
1872 # A type cast. eg `x.as(T)`
1873 class AAsCastExpr
1874 super AExpr
1875 var n_expr: AExpr is writable, noinit
1876 var n_kwas: TKwas is writable, noinit
1877 var n_opar: nullable TOpar = null is writable
1878 var n_type: AType is writable, noinit
1879 var n_cpar: nullable TCpar = null is writable
1880 end
1881
1882 # A as-not-null cast. eg `x.as(not null)`
1883 class AAsNotnullExpr
1884 super AExpr
1885 var n_expr: AExpr is writable, noinit
1886 var n_kwas: TKwas is writable, noinit
1887 var n_opar: nullable TOpar = null is writable
1888 var n_kwnot: TKwnot is writable, noinit
1889 var n_kwnull: TKwnull is writable, noinit
1890 var n_cpar: nullable TCpar = null is writable
1891 end
1892
1893 # A is-set check of old-style attributes. eg `isset x._a`
1894 class AIssetAttrExpr
1895 super AAttrFormExpr
1896 var n_kwisset: TKwisset is writable, noinit
1897 end
1898
1899 # An ellipsis notation used to pass an expression as it, in a vararg parameter
1900 class AVarargExpr
1901 super AExpr
1902 var n_expr: AExpr is writable, noinit
1903 var n_dotdotdot: TDotdotdot is writable, noinit
1904 end
1905
1906 # A list of expression separated with commas (arguments for instance)
1907 class AManyExpr
1908 super AExpr
1909 var n_exprs = new ANodes[AExpr](self)
1910 end
1911
1912 # A special expression that encapsulates a static type
1913 # Can only be found in special construction like arguments of annotations.
1914 class ATypeExpr
1915 super AExpr
1916 var n_type: AType is writable, noinit
1917 end
1918
1919 # A special expression that encapsulates a method identifier
1920 # Can only be found in special construction like arguments of annotations.
1921 class AMethidExpr
1922 super AExpr
1923 # The receiver, is any
1924 var n_expr: AExpr is writable, noinit
1925 var n_id: AMethid is writable, noinit
1926 end
1927
1928 # A special expression that encapsulate an annotation
1929 # Can only be found in special construction like arguments of annotations.
1930 class AAtExpr
1931 super AExpr
1932 end
1933
1934 # A special expression to debug types
1935 class ADebugTypeExpr
1936 super AExpr
1937 var n_kwdebug: TKwdebug is writable, noinit
1938 var n_kwtype: TKwtype is writable, noinit
1939 var n_expr: AExpr is writable, noinit
1940 var n_type: AType is writable, noinit
1941 end
1942
1943 # A list of expression separated with commas (arguments for instance)
1944 abstract class AExprs
1945 super Prod
1946 var n_exprs = new ANodes[AExpr](self)
1947 end
1948
1949 # A simple list of expressions
1950 class AListExprs
1951 super AExprs
1952 end
1953
1954 # A list of expressions enclosed in parentheses
1955 class AParExprs
1956 super AExprs
1957 var n_opar: TOpar is writable, noinit
1958 var n_cpar: TCpar is writable, noinit
1959 end
1960
1961 # A list of expressions enclosed in brackets
1962 class ABraExprs
1963 super AExprs
1964 var n_obra: TObra is writable, noinit
1965 var n_cbra: TCbra is writable, noinit
1966 end
1967
1968 # A complex assignment operator. (`+=` and `-=`)
1969 abstract class AAssignOp
1970 super Prod
1971 end
1972
1973 # The `+=` assignment operation
1974 class APlusAssignOp
1975 super AAssignOp
1976 var n_pluseq: TPluseq is writable, noinit
1977 end
1978
1979 # The `-=` assignment operator
1980 class AMinusAssignOp
1981 super AAssignOp
1982 var n_minuseq: TMinuseq is writable, noinit
1983 end
1984
1985 # A possibly fully-qualified module identifier
1986 class AModuleName
1987 super Prod
1988 var n_quad: nullable TQuad = null is writable
1989 var n_path = new ANodes[TId](self)
1990 var n_id: TId is writable, noinit
1991 end
1992
1993 # A language declaration for an extern block
1994 class AInLanguage
1995 super Prod
1996 var n_kwin: TKwin is writable, noinit
1997 var n_string: TString is writable, noinit
1998 end
1999
2000 # An full extern block
2001 class AExternCodeBlock
2002 super Prod
2003 var n_in_language: nullable AInLanguage = null is writable
2004 var n_extern_code_segment: TExternCodeSegment is writable, noinit
2005 end
2006
2007 # A possible full method qualifier.
2008 class AQualified
2009 super Prod
2010 var n_quad: nullable TQuad = null is writable
2011 var n_id = new ANodes[TId](self)
2012 var n_classid: nullable TClassid = null is writable
2013 end
2014
2015 # A documentation of a definition
2016 # It contains the block of comments just above the declaration
2017 class ADoc
2018 super Prod
2019 var n_comment = new ANodes[TComment](self)
2020 end
2021
2022 # A group of annotation on a node
2023 class AAnnotations
2024 super Prod
2025 var n_at: nullable TAt = null is writable
2026 var n_opar: nullable TOpar = null is writable
2027 var n_items = new ANodes[AAnnotation](self)
2028 var n_cpar: nullable TCpar = null is writable
2029 end
2030
2031 # A single annotation
2032 class AAnnotation
2033 super Prod
2034 var n_doc: nullable ADoc = null is writable
2035 var n_kwredef: nullable TKwredef = null is writable
2036 var n_visibility: nullable AVisibility is writable
2037 var n_atid: AAtid is writable, noinit
2038 var n_opar: nullable TOpar = null is writable
2039 var n_args = new ANodes[AExpr](self)
2040 var n_cpar: nullable TCpar = null is writable
2041 end
2042
2043 # An annotation name
2044 abstract class AAtid
2045 super Prod
2046 var n_id: Token is writable, noinit
2047 end
2048
2049 # An annotation name based on an identifier
2050 class AIdAtid
2051 super AAtid
2052 end
2053
2054 # An annotation name based on the keyword `extern`
2055 class AKwexternAtid
2056 super AAtid
2057 end
2058
2059 # An annotation name based on the keyword `import`
2060 class AKwimportAtid
2061 super AAtid
2062 end
2063
2064 # An annotation name based on the keyword `abstract`
2065 class AKwabstractAtid
2066 super AAtid
2067 end
2068
2069 # The root of the AST
2070 class Start
2071 super Prod
2072 var n_base: nullable AModule is writable
2073 var n_eof: EOF is writable
2074 end