parser: regenerate
[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` statement.
1351 class ABreakExpr
1352 super AExpr
1353 super ALabelable
1354 var n_kwbreak: TKwbreak is writable, noinit
1355 var n_expr: nullable AExpr = null is writable
1356 end
1357
1358 # An `abort` statement
1359 class AAbortExpr
1360 super AExpr
1361 var n_kwabort: TKwabort is writable, noinit
1362 end
1363
1364 # A `continue` statement
1365 class AContinueExpr
1366 super AExpr
1367 super ALabelable
1368 var n_kwcontinue: nullable TKwcontinue = null is writable
1369 var n_expr: nullable AExpr = null is writable
1370 end
1371
1372 # A `do` statement
1373 class ADoExpr
1374 super AExpr
1375 super ALabelable
1376 var n_kwdo: TKwdo is writable, noinit
1377 var n_block: nullable AExpr = null is writable
1378 end
1379
1380 # A `if` statement
1381 class AIfExpr
1382 super AExpr
1383 var n_kwif: TKwif is writable, noinit
1384 var n_expr: AExpr is writable, noinit
1385 var n_then: nullable AExpr = null is writable
1386 var n_else: nullable AExpr = null is writable
1387 end
1388
1389 # A `if` expression
1390 class AIfexprExpr
1391 super AExpr
1392 var n_kwif: TKwif is writable, noinit
1393 var n_expr: AExpr is writable, noinit
1394 var n_kwthen: TKwthen is writable, noinit
1395 var n_then: AExpr is writable, noinit
1396 var n_kwelse: TKwelse is writable, noinit
1397 var n_else: AExpr is writable, noinit
1398 end
1399
1400 # A `while` statement
1401 class AWhileExpr
1402 super AExpr
1403 super ALabelable
1404 var n_kwwhile: TKwwhile is writable, noinit
1405 var n_expr: AExpr is writable, noinit
1406 var n_kwdo: TKwdo is writable, noinit
1407 var n_block: nullable AExpr = null is writable
1408 end
1409
1410 # A `loop` statement
1411 class ALoopExpr
1412 super AExpr
1413 super ALabelable
1414 var n_kwloop: TKwloop is writable, noinit
1415 var n_block: nullable AExpr = null is writable
1416 end
1417
1418 # A `for` statement
1419 class AForExpr
1420 super AExpr
1421 super ALabelable
1422 var n_kwfor: TKwfor is writable, noinit
1423 var n_ids = new ANodes[TId](self)
1424 var n_expr: AExpr is writable, noinit
1425 var n_kwdo: TKwdo is writable, noinit
1426 var n_block: nullable AExpr = null is writable
1427 end
1428
1429 # An `assert` statement
1430 class AAssertExpr
1431 super AExpr
1432 var n_kwassert: TKwassert is writable, noinit
1433 var n_id: nullable TId = null is writable
1434 var n_expr: AExpr is writable, noinit
1435 var n_else: nullable AExpr = null is writable
1436 end
1437
1438 # Whatever is a simple assignment. eg `= something`
1439 abstract class AAssignFormExpr
1440 super AExpr
1441 var n_assign: TAssign is writable, noinit
1442 var n_value: AExpr is writable, noinit
1443 end
1444
1445 # Whatever is a combined assignment. eg `+= something`
1446 abstract class AReassignFormExpr
1447 super AExpr
1448 var n_assign_op: AAssignOp is writable, noinit
1449 var n_value: AExpr is writable, noinit
1450 end
1451
1452 # A `once` expression. eg `once x`
1453 class AOnceExpr
1454 super AExpr
1455 var n_kwonce: TKwonce is writable, noinit
1456 var n_expr: AExpr is writable, noinit
1457 end
1458
1459 # A polymorphic invocation of a method
1460 # The form of the invocation (name, arguments, etc.) are specific
1461 abstract class ASendExpr
1462 super AExpr
1463 # The receiver of the method invocation
1464 var n_expr: AExpr is writable, noinit
1465 end
1466
1467 # A binary operation on a method
1468 abstract class ABinopExpr
1469 super ASendExpr
1470 # The second operand of the operation
1471 # Note: the receiver (`n_expr`) is the first operand
1472 var n_expr2: AExpr is writable, noinit
1473 end
1474
1475 # Something that is boolean expression
1476 abstract class ABoolExpr
1477 super AExpr
1478 end
1479
1480 # A `or` expression
1481 class AOrExpr
1482 super ABoolExpr
1483 var n_expr: AExpr is writable, noinit
1484 var n_expr2: AExpr is writable, noinit
1485 end
1486
1487 # A `and` expression
1488 class AAndExpr
1489 super ABoolExpr
1490 var n_expr: AExpr is writable, noinit
1491 var n_expr2: AExpr is writable, noinit
1492 end
1493
1494 # A `or else` expression
1495 class AOrElseExpr
1496 super ABoolExpr
1497 var n_expr: AExpr is writable, noinit
1498 var n_expr2: AExpr is writable, noinit
1499 end
1500
1501 # A `implies` expression
1502 class AImpliesExpr
1503 super ABoolExpr
1504 var n_expr: AExpr is writable, noinit
1505 var n_expr2: AExpr is writable, noinit
1506 end
1507
1508 # A `not` expression
1509 class ANotExpr
1510 super ABoolExpr
1511 var n_kwnot: TKwnot is writable, noinit
1512 var n_expr: AExpr is writable, noinit
1513 end
1514
1515 # A `==` expression
1516 class AEqExpr
1517 super ABinopExpr
1518 end
1519
1520 # A `!=` expression
1521 class ANeExpr
1522 super ABinopExpr
1523 end
1524
1525 # A `<` expression
1526 class ALtExpr
1527 super ABinopExpr
1528 end
1529
1530 # A `<=` expression
1531 class ALeExpr
1532 super ABinopExpr
1533 end
1534
1535 # A `<<` expression
1536 class ALlExpr
1537 super ABinopExpr
1538 end
1539
1540 # A `>` expression
1541 class AGtExpr
1542 super ABinopExpr
1543 end
1544
1545 # A `>=` expression
1546 class AGeExpr
1547 super ABinopExpr
1548 end
1549
1550 # A `>>` expression
1551 class AGgExpr
1552 super ABinopExpr
1553 end
1554
1555 # A type-ckeck expression. eg `x isa T`
1556 class AIsaExpr
1557 super ABoolExpr
1558 var n_expr: AExpr is writable, noinit
1559 var n_type: AType is writable, noinit
1560 end
1561
1562 # A `+` expression
1563 class APlusExpr
1564 super ABinopExpr
1565 end
1566
1567 # A `-` expression
1568 class AMinusExpr
1569 super ABinopExpr
1570 end
1571
1572 # A `<=>` expression
1573 class AStarshipExpr
1574 super ABinopExpr
1575 end
1576
1577 # A `*` expression
1578 class AStarExpr
1579 super ABinopExpr
1580 end
1581
1582 # A `**` expression
1583 class AStarstarExpr
1584 super ABinopExpr
1585 end
1586
1587 # A `/` expression
1588 class ASlashExpr
1589 super ABinopExpr
1590 end
1591
1592 # A `%` expression
1593 class APercentExpr
1594 super ABinopExpr
1595 end
1596
1597 # A unary minus expression. eg `-x`
1598 class AUminusExpr
1599 super ASendExpr
1600 var n_minus: TMinus is writable, noinit
1601 end
1602
1603 # An explicit instantiation. eg `new T`
1604 class ANewExpr
1605 super AExpr
1606 var n_kwnew: TKwnew is writable, noinit
1607 var n_type: AType is writable, noinit
1608
1609 # The name of the named-constructor, if any
1610 var n_id: nullable TId = null is writable
1611 var n_args: AExprs is writable, noinit
1612 end
1613
1614 # Whatever is a old-style attribute access
1615 abstract class AAttrFormExpr
1616 super AExpr
1617
1618 # The receiver of the attribute
1619 var n_expr: AExpr is writable, noinit
1620
1621 # The name of the attribute
1622 var n_id: TAttrid is writable, noinit
1623
1624 end
1625
1626 # The read of an attribute. eg `x._a`
1627 class AAttrExpr
1628 super AAttrFormExpr
1629 end
1630
1631 # The assignment of an attribute. eg `x._a=y`
1632 class AAttrAssignExpr
1633 super AAttrFormExpr
1634 super AAssignFormExpr
1635 end
1636
1637 # Whatever looks-like a call with a standard method and any number of arguments.
1638 abstract class ACallFormExpr
1639 super ASendExpr
1640
1641 # The name of the method
1642 var n_id: TId is writable, noinit
1643
1644 # The arguments of the call
1645 var n_args: AExprs is writable, noinit
1646 end
1647
1648 # A complex setter call (standard or brackets)
1649 abstract class ASendReassignFormExpr
1650 super ASendExpr
1651 super AReassignFormExpr
1652 end
1653
1654 # A complex attribute assignment. eg `x._a+=y`
1655 class AAttrReassignExpr
1656 super AAttrFormExpr
1657 super AReassignFormExpr
1658 end
1659
1660 # A call with a standard method-name and any number of arguments. eg `x.m(y)`. OR just a simple id
1661 # 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`.
1662 # Semantic analysis have to transform them to instance of `AVarExpr`.
1663 class ACallExpr
1664 super ACallFormExpr
1665 end
1666
1667 # A setter call with a standard method-name and any number of arguments. eg `x.m(y)=z`. OR just a simple assignment.
1668 # 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`.
1669 # Semantic analysis have to transform them to instance of `AVarAssignExpr`.
1670 class ACallAssignExpr
1671 super ACallFormExpr
1672 super AAssignFormExpr
1673 end
1674
1675 # 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.
1676 # 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`.
1677 # Semantic analysis have to transform them to instance of `AVarReassignExpr`.
1678 class ACallReassignExpr
1679 super ACallFormExpr
1680 super ASendReassignFormExpr
1681 end
1682
1683 # A call to `super`. OR a call of a super-constructor
1684 class ASuperExpr
1685 super AExpr
1686 var n_qualified: nullable AQualified = null is writable
1687 var n_kwsuper: TKwsuper is writable, noinit
1688 var n_args: AExprs is writable, noinit
1689 end
1690
1691 # A call to the `init` constructor.
1692 # Note: because `init` is a keyword and not a `TId`, the explicit call to init cannot be a `ACallFormExpr`.
1693 class AInitExpr
1694 super ASendExpr
1695 var n_kwinit: TKwinit is writable, noinit
1696 var n_args: AExprs is writable, noinit
1697 end
1698
1699 # Whatever looks-like a call of the brackets `[]` operator.
1700 abstract class ABraFormExpr
1701 super ASendExpr
1702 var n_args: AExprs is writable, noinit
1703 end
1704
1705 # A call of the brackets operator. eg `x[y,z]`
1706 class ABraExpr
1707 super ABraFormExpr
1708 end
1709
1710 # A setter call of the bracket operator. eg `x[y,z]=t`
1711 class ABraAssignExpr
1712 super ABraFormExpr
1713 super AAssignFormExpr
1714 end
1715
1716 # Whatever is an access to a local variable
1717 abstract class AVarFormExpr
1718 super AExpr
1719 var n_id: TId is writable, noinit
1720 end
1721
1722 # A complex setter call of the bracket operator. eg `x[y,z]+=t`
1723 class ABraReassignExpr
1724 super ABraFormExpr
1725 super ASendReassignFormExpr
1726 end
1727
1728 # A local variable read access.
1729 # The parser cannot instantiate them, see `ACallExpr`.
1730 class AVarExpr
1731 super AVarFormExpr
1732 end
1733
1734 # A local variable simple assignment access
1735 # The parser cannot instantiate them, see `ACallAssignExpr`.
1736 class AVarAssignExpr
1737 super AVarFormExpr
1738 super AAssignFormExpr
1739 end
1740
1741 # A local variable complex assignment access
1742 # The parser cannot instantiate them, see `ACallReassignExpr`.
1743 class AVarReassignExpr
1744 super AVarFormExpr
1745 super AReassignFormExpr
1746 end
1747
1748 # A literal range, open or closed
1749 abstract class ARangeExpr
1750 super AExpr
1751 var n_expr: AExpr is writable, noinit
1752 var n_expr2: AExpr is writable, noinit
1753 end
1754
1755 # A closed literal range. eg `[x..y]`
1756 class ACrangeExpr
1757 super ARangeExpr
1758 var n_obra: TObra is writable, noinit
1759 var n_cbra: TCbra is writable, noinit
1760 end
1761
1762 # An open literal range. eg `[x..y[`
1763 class AOrangeExpr
1764 super ARangeExpr
1765 var n_obra: TObra is writable, noinit
1766 var n_cbra: TObra is writable, noinit
1767 end
1768
1769 # A literal array. eg. `[x,y,z]`
1770 class AArrayExpr
1771 super AExpr
1772 var n_obra: TObra is writable, noinit
1773 var n_exprs: AExprs is writable, noinit
1774 var n_type: nullable AType = null is writable
1775 var n_cbra: TCbra is writable, noinit
1776 end
1777
1778 # A read of `self`
1779 class ASelfExpr
1780 super AExpr
1781 var n_kwself: nullable TKwself is writable
1782 end
1783
1784 # When there is no explicit receiver, `self` is implicit
1785 class AImplicitSelfExpr
1786 super ASelfExpr
1787 end
1788
1789 # A `true` boolean literal constant
1790 class ATrueExpr
1791 super ABoolExpr
1792 var n_kwtrue: TKwtrue is writable, noinit
1793 end
1794 # A `false` boolean literal constant
1795 class AFalseExpr
1796 super ABoolExpr
1797 var n_kwfalse: TKwfalse is writable, noinit
1798 end
1799 # A `null` literal constant
1800 class ANullExpr
1801 super AExpr
1802 var n_kwnull: TKwnull is writable, noinit
1803 end
1804 # An integer literal
1805 class AIntExpr
1806 super AExpr
1807 end
1808 # An integer literal in decimal format
1809 class ADecIntExpr
1810 super AIntExpr
1811 var n_number: TNumber is writable, noinit
1812 end
1813 # An integer literal in hexadecimal format
1814 class AHexIntExpr
1815 super AIntExpr
1816 var n_hex_number: THexNumber is writable, noinit
1817 end
1818 # A float literal
1819 class AFloatExpr
1820 super AExpr
1821 var n_float: TFloat is writable, noinit
1822 end
1823 # A character literal
1824 class ACharExpr
1825 super AExpr
1826 var n_char: TChar is writable, noinit
1827 end
1828 # A string literal
1829 abstract class AStringFormExpr
1830 super AExpr
1831 var n_string: Token is writable, noinit
1832 end
1833
1834 # A simple string. eg. `"abc"`
1835 class AStringExpr
1836 super AStringFormExpr
1837 end
1838
1839 # The start of a superstring. eg `"abc{`
1840 class AStartStringExpr
1841 super AStringFormExpr
1842 end
1843
1844 # The middle of a superstring. eg `}abc{`
1845 class AMidStringExpr
1846 super AStringFormExpr
1847 end
1848
1849 # The end of a superstrng. eg `}abc"`
1850 class AEndStringExpr
1851 super AStringFormExpr
1852 end
1853
1854 # A superstring literal. eg `"a{x}b{y}c"`
1855 # Each part is modeled a sequence of expression. eg. `["a{, x, }b{, y, }c"]`
1856 class ASuperstringExpr
1857 super AExpr
1858 var n_exprs = new ANodes[AExpr](self)
1859 end
1860
1861 # A simple parenthesis. eg `(x)`
1862 class AParExpr
1863 super AExpr
1864 var n_opar: TOpar is writable, noinit
1865 var n_expr: AExpr is writable, noinit
1866 var n_cpar: TCpar is writable, noinit
1867 end
1868
1869 # A type cast. eg `x.as(T)`
1870 class AAsCastExpr
1871 super AExpr
1872 var n_expr: AExpr is writable, noinit
1873 var n_kwas: TKwas is writable, noinit
1874 var n_opar: nullable TOpar = null is writable
1875 var n_type: AType is writable, noinit
1876 var n_cpar: nullable TCpar = null is writable
1877 end
1878
1879 # A as-not-null cast. eg `x.as(not null)`
1880 class AAsNotnullExpr
1881 super AExpr
1882 var n_expr: AExpr is writable, noinit
1883 var n_kwas: TKwas is writable, noinit
1884 var n_opar: nullable TOpar = null is writable
1885 var n_kwnot: TKwnot is writable, noinit
1886 var n_kwnull: TKwnull is writable, noinit
1887 var n_cpar: nullable TCpar = null is writable
1888 end
1889
1890 # A is-set check of old-style attributes. eg `isset x._a`
1891 class AIssetAttrExpr
1892 super AAttrFormExpr
1893 var n_kwisset: TKwisset is writable, noinit
1894 end
1895
1896 # An ellipsis notation used to pass an expression as it, in a vararg parameter
1897 class AVarargExpr
1898 super AExpr
1899 var n_expr: AExpr is writable, noinit
1900 var n_dotdotdot: TDotdotdot is writable, noinit
1901 end
1902
1903 # A list of expression separated with commas (arguments for instance)
1904 class AManyExpr
1905 super AExpr
1906 var n_exprs = new ANodes[AExpr](self)
1907 end
1908
1909 # A special expression that encapsulates a static type
1910 # Can only be found in special construction like arguments of annotations.
1911 class ATypeExpr
1912 super AExpr
1913 var n_type: AType is writable, noinit
1914 end
1915
1916 # A special expression that encapsulates a method identifier
1917 # Can only be found in special construction like arguments of annotations.
1918 class AMethidExpr
1919 super AExpr
1920 # The receiver, is any
1921 var n_expr: AExpr is writable, noinit
1922 var n_id: AMethid is writable, noinit
1923 end
1924
1925 # A special expression that encapsulate an annotation
1926 # Can only be found in special construction like arguments of annotations.
1927 class AAtExpr
1928 super AExpr
1929 end
1930
1931 # A special expression to debug types
1932 class ADebugTypeExpr
1933 super AExpr
1934 var n_kwdebug: TKwdebug is writable, noinit
1935 var n_kwtype: TKwtype is writable, noinit
1936 var n_expr: AExpr is writable, noinit
1937 var n_type: AType is writable, noinit
1938 end
1939
1940 # A list of expression separated with commas (arguments for instance)
1941 abstract class AExprs
1942 super Prod
1943 var n_exprs = new ANodes[AExpr](self)
1944 end
1945
1946 # A simple list of expressions
1947 class AListExprs
1948 super AExprs
1949 end
1950
1951 # A list of expressions enclosed in parentheses
1952 class AParExprs
1953 super AExprs
1954 var n_opar: TOpar is writable, noinit
1955 var n_cpar: TCpar is writable, noinit
1956 end
1957
1958 # A list of expressions enclosed in brackets
1959 class ABraExprs
1960 super AExprs
1961 var n_obra: TObra is writable, noinit
1962 var n_cbra: TCbra is writable, noinit
1963 end
1964
1965 # A complex assignment operator. (`+=` and `-=`)
1966 abstract class AAssignOp
1967 super Prod
1968 end
1969
1970 # The `+=` assignment operation
1971 class APlusAssignOp
1972 super AAssignOp
1973 var n_pluseq: TPluseq is writable, noinit
1974 end
1975
1976 # The `-=` assignment operator
1977 class AMinusAssignOp
1978 super AAssignOp
1979 var n_minuseq: TMinuseq is writable, noinit
1980 end
1981
1982 # A possibly fully-qualified module identifier
1983 class AModuleName
1984 super Prod
1985 var n_quad: nullable TQuad = null is writable
1986 var n_path = new ANodes[TId](self)
1987 var n_id: TId is writable, noinit
1988 end
1989
1990 # A language declaration for an extern block
1991 class AInLanguage
1992 super Prod
1993 var n_kwin: TKwin is writable, noinit
1994 var n_string: TString is writable, noinit
1995 end
1996
1997 # An full extern block
1998 class AExternCodeBlock
1999 super Prod
2000 var n_in_language: nullable AInLanguage = null is writable
2001 var n_extern_code_segment: TExternCodeSegment is writable, noinit
2002 end
2003
2004 # A possible full method qualifier.
2005 class AQualified
2006 super Prod
2007 var n_quad: nullable TQuad = null is writable
2008 var n_id = new ANodes[TId](self)
2009 var n_classid: nullable TClassid = null is writable
2010 end
2011
2012 # A documentation of a definition
2013 # It contains the block of comments just above the declaration
2014 class ADoc
2015 super Prod
2016 var n_comment = new ANodes[TComment](self)
2017 end
2018
2019 # A group of annotation on a node
2020 class AAnnotations
2021 super Prod
2022 var n_at: nullable TAt = null is writable
2023 var n_opar: nullable TOpar = null is writable
2024 var n_items = new ANodes[AAnnotation](self)
2025 var n_cpar: nullable TCpar = null is writable
2026 end
2027
2028 # A single annotation
2029 class AAnnotation
2030 super Prod
2031 var n_doc: nullable ADoc = null is writable
2032 var n_kwredef: nullable TKwredef = null is writable
2033 var n_visibility: nullable AVisibility is writable
2034 var n_atid: AAtid is writable, noinit
2035 var n_opar: nullable TOpar = null is writable
2036 var n_args = new ANodes[AExpr](self)
2037 var n_cpar: nullable TCpar = null is writable
2038 end
2039
2040 # An annotation name
2041 abstract class AAtid
2042 super Prod
2043 var n_id: Token is writable, noinit
2044 end
2045
2046 # An annotation name based on an identifier
2047 class AIdAtid
2048 super AAtid
2049 end
2050
2051 # An annotation name based on the keyword `extern`
2052 class AKwexternAtid
2053 super AAtid
2054 end
2055
2056 # An annotation name based on the keyword `import`
2057 class AKwimportAtid
2058 super AAtid
2059 end
2060
2061 # An annotation name based on the keyword `abstract`
2062 class AKwabstractAtid
2063 super AAtid
2064 end
2065
2066 # The root of the AST
2067 class Start
2068 super Prod
2069 var n_base: nullable AModule is writable
2070 var n_eof: EOF is writable, noinit
2071 init(n_base: nullable AModule, n_eof: EOF)
2072 do
2073 self._n_base = n_base
2074 self._n_eof = n_eof
2075 end
2076 end