src: make AUnaryopExpr abstract
[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 import ordered_tree
21
22 # Root of the AST class-hierarchy
23 abstract class ANode
24 # Location is set during AST building. Once built, location cannon be null.
25 # However, manual instantiated nodes may need more care.
26 var location: Location is writable, noinit
27
28 # The location of the important part of the node (identifier or whatever)
29 fun hot_location: Location do return location
30
31 # Display a message for the colored location of the node
32 fun debug(message: String)
33 do
34 sys.stderr.write "{hot_location} {self.class_name}: {message}\n{hot_location.colored_line("0;32")}\n"
35 end
36
37 # Write the subtree on stdout.
38 # See `ASTDump`
39 fun dump_tree
40 do
41 var d = new ASTDump
42 d.enter_visit(self)
43 d.write_to(sys.stdout)
44 end
45
46 # Parent of the node in the AST
47 var parent: nullable ANode = null
48
49 # The topmost ancestor of the element
50 # This just apply `parent` until the first one
51 fun root: ANode
52 do
53 var res = self
54 loop
55 var p = res.parent
56 if p == null then return res
57 res = p
58 end
59 end
60
61 # The most specific common parent between `self` and `other`
62 # Return null if the two node are unrelated (distinct root)
63 fun common_parent(other: ANode): nullable ANode
64 do
65 # First, get the same depth
66 var s: nullable ANode = self
67 var o: nullable ANode = other
68 var d = s.depth - o.depth
69 while d > 0 do
70 s = s.parent
71 d -= 1
72 end
73 while d < 0 do
74 o = o.parent
75 d += 1
76 end
77 assert o.depth == s.depth
78 # Second, go up until same in found
79 while s != o do
80 s = s.parent
81 o = o.parent
82 end
83 return s
84 end
85
86 # Number of nodes between `self` and the `root` of the AST
87 # ENSURE `self == self.root implies result == 0 `
88 # ENSURE `self != self.root implies result == self.parent.depth + 1`
89 fun depth: Int
90 do
91 var n = self
92 var res = 0
93 loop
94 var p = n.parent
95 if p == null then return res
96 n = p
97 res += 1
98 end
99 end
100
101 # Replace a child with an other node in the AST
102 private fun replace_child(old_child: ANode, new_child: nullable ANode) is abstract
103
104 # Detach a node from its parent
105 # Aborts if the node is not detachable. use `replace_with` instead
106 # REQUIRE: parent != null
107 # REQUIRE: is_detachable
108 # ENDURE: parent == null
109 fun detach
110 do
111 assert parent != null
112 parent.replace_child(self, null)
113 parent = null
114 end
115
116 # Replace itself with an other node in the AST
117 # REQUIRE: parent != null
118 # ENSURE: node.parent == old(parent)
119 # ENSURE: parent == null
120 fun replace_with(node: ANode)
121 do
122 assert parent != null
123 parent.replace_child(self, node)
124 parent = null
125 end
126
127 # Visit all nodes in order.
128 # Thus, call `v.enter_visit(e)` for each child `e`
129 fun visit_all(v: Visitor) is abstract
130
131 # Do a deep search and return an array of tokens that match a given text
132 fun collect_tokens_by_text(text: String): Array[Token]
133 do
134 var v = new CollectTokensByTextVisitor(text)
135 v.enter_visit(self)
136 return v.result
137 end
138
139 # Do a deep search and return an array of node that are annotated
140 # The attached node can be retrieved by two invocations of parent
141 fun collect_annotations_by_name(name: String): Array[AAnnotation]
142 do
143 var v = new CollectAnnotationsByNameVisitor(name)
144 v.enter_visit(self)
145 return v.result
146 end
147 end
148
149 private class CollectTokensByTextVisitor
150 super Visitor
151 var text: String
152 var result = new Array[Token]
153 redef fun visit(node)
154 do
155 node.visit_all(self)
156 if node isa Token and node.text == text then result.add(node)
157 end
158 end
159
160 private class CollectAnnotationsByNameVisitor
161 super Visitor
162 var name: String
163 var result = new Array[AAnnotation]
164 redef fun visit(node)
165 do
166 node.visit_all(self)
167 if node isa AAnnotation and node.n_atid.n_id.text == name then result.add(node)
168 end
169 end
170
171 # A helper class to handle (print) Nit AST as an OrderedTree
172 class ASTDump
173 super Visitor
174 super OrderedTree[ANode]
175
176 # Reference to the last parent in the Ordered Tree
177 # Is used to handle the initial node parent and workaround possible inconsistent `ANode::parent`
178 private var last_parent: nullable ANode = null
179
180 redef fun visit(n)
181 do
182 var p = last_parent
183 add(p, n)
184 last_parent = n
185 n.visit_all(self)
186 last_parent = p
187 end
188
189 redef fun display(n)
190 do
191 if n isa Token then
192 return "{n.class_name} \"{n.text.escape_to_c}\" @{n.location}"
193 else
194 return "{n.class_name} @{n.location}"
195 end
196 end
197 end
198
199 # A sequence of nodes
200 # It is a specific class (instead of using a Array) to track the parent/child relation when nodes are added or removed
201 class ANodes[E: ANode]
202 super Sequence[E]
203 private var parent: ANode
204 private var items = new Array[E]
205 redef fun iterator do return items.iterator
206 redef fun length do return items.length
207 redef fun is_empty do return items.is_empty
208 redef fun push(e)
209 do
210 hook_add(e)
211 items.push(e)
212 end
213 redef fun pop
214 do
215 var res = items.pop
216 hook_remove(res)
217 return res
218 end
219 redef fun unshift(e)
220 do
221 hook_add(e)
222 items.unshift(e)
223 end
224 redef fun shift
225 do
226 var res = items.shift
227 hook_remove(res)
228 return res
229 end
230 redef fun has(e)
231 do
232 return items.has(e)
233 end
234 redef fun [](index)
235 do
236 return items[index]
237 end
238 redef fun []=(index, e)
239 do
240 hook_remove(self[index])
241 hook_add(e)
242 items[index]=e
243 end
244 redef fun remove_at(index)
245 do
246 hook_remove(items[index])
247 items.remove_at(index)
248 end
249 private fun hook_add(e: E)
250 do
251 #assert e.parent == null
252 e.parent = parent
253 end
254 private fun hook_remove(e: E)
255 do
256 assert e.parent == parent
257 e.parent = null
258 end
259
260 # Used in parent constructor to fill elements
261 private fun unsafe_add_all(nodes: Collection[Object])
262 do
263 var parent = self.parent
264 for n in nodes do
265 assert n isa E
266 add n
267 n.parent = parent
268 end
269 end
270
271 private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool
272 do
273 var parent = self.parent
274 for i in [0..length[ do
275 if self[i] == old_child then
276 if new_child != null then
277 assert new_child isa E
278 self[i] = new_child
279 new_child.parent = parent
280 else
281 self.remove_at(i)
282 end
283 return true
284 end
285 end
286 return false
287 end
288
289 private fun visit_all(v: Visitor)
290 do
291 for n in self do v.enter_visit(n)
292 end
293 end
294
295 # Ancestor of all tokens
296 # A token is a node that has a `text` but no children.
297 abstract class Token
298 super ANode
299
300 # The raw content on the token
301 fun text: String is abstract
302
303 # The raw content on the token
304 fun text=(text: String) is abstract
305
306 # The previous token in the Lexer.
307 # May have disappeared in the AST
308 var prev_token: nullable Token = null
309
310 # The next token in the Lexer.
311 # May have disappeared in the AST
312 var next_token: nullable Token = null
313
314 # Is `self` a token discarded from the AST?
315 #
316 # Loose tokens are not present in the AST.
317 # It means they were identified by the lexer but were discarded by the parser.
318 # It also means that they are not visited or manipulated by AST-related functions.
319 #
320 # Each loose token is attached to the non-loose token that precedes or follows it.
321 # The rules are the following:
322 #
323 # * tokens that follow a non-loose token on a same line are attached to it.
324 # See `next_looses`.
325 # * other tokens, thus that precede a non-loose token on the same line or the next one,
326 # are attached to this one. See `prev_looses`.
327 #
328 # Loose tokens are mostly end of lines (`TEol`) and comments (`TComment`).
329 # Whitespace are ignored by the lexer, so they are not even considered as loose tokens.
330 # See `blank_before` to get the whitespace that separate tokens.
331 var is_loose = false
332
333 # Loose tokens that precede `self`.
334 #
335 # These tokens start the line or belong to a line with only loose tokens.
336 var prev_looses = new Array[Token] is lazy
337
338 # Loose tokens that follow `self`
339 #
340 # These tokens are on the same line than `self`.
341 var next_looses = new Array[Token] is lazy
342
343 # The verbatim blank text between `prev_token` and `self`
344 fun blank_before: String
345 do
346 if prev_token == null then return ""
347 var from = prev_token.location.pend+1
348 var to = location.pstart
349 return location.file.string.substring(from,to-from)
350 end
351
352 redef fun to_s: String do
353 return "'{text}'"
354 end
355
356 redef fun visit_all(v: Visitor) do end
357 redef fun replace_child(old_child: ANode, new_child: nullable ANode) do end
358 end
359
360 redef class SourceFile
361 # The first token parser by the lexer
362 # May have disappeared in the final AST
363 var first_token: nullable Token = null
364
365 # The first token parser by the lexer
366 # May have disappeared in the final AST
367 var last_token: nullable Token = null
368 end
369
370 # Ancestor of all productions
371 # A production is a node without text but that usually has children.
372 abstract class Prod
373 super ANode
374
375 # All the annotations attached directly to the node
376 var n_annotations: nullable AAnnotations = null is writable
377
378 # Return all its annotations of a given name in the order of their declaration
379 # Retun an empty array if no such an annotation.
380 fun get_annotations(name: String): Array[AAnnotation]
381 do
382 var res = new Array[AAnnotation]
383 var nas = n_annotations
384 if nas != null then for na in nas.n_items do
385 if na.name != name then continue
386 res.add(na)
387 end
388 if self isa AClassdef then for na in n_propdefs do
389 if na isa AAnnotPropdef then
390 if na.name != name then continue
391 res.add na
392 end
393 end
394
395 return res
396 end
397
398 redef fun replace_with(n: ANode)
399 do
400 super
401 assert n isa Prod
402 if not isset n._location and isset _location then n._location = _location
403 end
404 end
405
406 # Abstract standard visitor on the AST
407 abstract class Visitor
408 # What the visitor do when a node is visited
409 # Concrete visitors should implement this method.
410 # @toimplement
411 protected fun visit(e: ANode) is abstract
412
413 # Ask the visitor to visit a given node.
414 # Usually automatically called by visit_all* methods.
415 # This method should not be redefined
416 fun enter_visit(e: nullable ANode)
417 do
418 if e == null then return
419 var old = _current_node
420 _current_node = e
421 visit(e)
422 _current_node = old
423 end
424
425 # The current visited node
426 var current_node: nullable ANode = null is writable
427 end
428
429 # Token of end of line (basically `\n`)
430 class TEol
431 super Token
432 redef fun to_s
433 do
434 return "end of line"
435 end
436 end
437
438 # Token of a line of comments
439 # Starts with the `#` and contains the final end-of-line (if any)
440 class TComment
441 super Token
442 end
443
444 # A token associated with a keyword
445 abstract class TokenKeyword
446 super Token
447 redef fun to_s
448 do
449 return "keyword '{text}'"
450 end
451 end
452
453 # The deprecated keyword `package`.
454 class TKwpackage
455 super TokenKeyword
456 end
457
458 # The keyword `module`
459 class TKwmodule
460 super TokenKeyword
461 end
462
463 # The keyword `import`
464 class TKwimport
465 super TokenKeyword
466 end
467
468 # The keyword `class`
469 class TKwclass
470 super TokenKeyword
471 end
472
473 # The keyword `abstract`
474 class TKwabstract
475 super TokenKeyword
476 end
477
478 # The keyword `interface`
479 class TKwinterface
480 super TokenKeyword
481 end
482
483 # The keywords `enum` ane `universal`
484 class TKwenum
485 super TokenKeyword
486 end
487
488 # The keyword `end`
489 class TKwend
490 super TokenKeyword
491 end
492
493 # The keyword `fun`
494 class TKwmeth
495 super TokenKeyword
496 end
497
498 # The keyword `type`
499 class TKwtype
500 super TokenKeyword
501 end
502
503 # The keyword `init`
504 class TKwinit
505 super TokenKeyword
506 end
507
508 # The keyword `redef`
509 class TKwredef
510 super TokenKeyword
511 end
512
513 # The keyword `is`
514 class TKwis
515 super TokenKeyword
516 end
517
518 # The keyword `do`
519 class TKwdo
520 super TokenKeyword
521 end
522
523 # The keyword `var`
524 class TKwvar
525 super TokenKeyword
526 end
527
528 # The keyword `extern`
529 class TKwextern
530 super TokenKeyword
531 end
532
533 # The keyword `public`
534 class TKwpublic
535 super TokenKeyword
536 end
537
538 # The keyword `protected`
539 class TKwprotected
540 super TokenKeyword
541 end
542
543 # The keyword `private`
544 class TKwprivate
545 super TokenKeyword
546 end
547
548 # The keyword `intrude`
549 class TKwintrude
550 super TokenKeyword
551 end
552
553 # The keyword `if`
554 class TKwif
555 super TokenKeyword
556 end
557
558 # The keyword `then`
559 class TKwthen
560 super TokenKeyword
561 end
562
563 # The keyword `else`
564 class TKwelse
565 super TokenKeyword
566 end
567
568 # The keyword `while`
569 class TKwwhile
570 super TokenKeyword
571 end
572
573 # The keyword `loop`
574 class TKwloop
575 super TokenKeyword
576 end
577
578 # The keyword `for`
579 class TKwfor
580 super TokenKeyword
581 end
582
583 # The keyword `in`
584 class TKwin
585 super TokenKeyword
586 end
587
588 # The keyword `and`
589 class TKwand
590 super TokenKeyword
591 end
592
593 # The keyword `or`
594 class TKwor
595 super TokenKeyword
596 end
597
598 # The keyword `implies`
599 class TKwimplies
600 super TokenKeyword
601 end
602
603 # The keyword `not`
604 class TKwnot
605 super TokenKeyword
606 end
607
608 # The keyword `return`
609 class TKwreturn
610 super TokenKeyword
611 end
612
613 # The keyword `continue`
614 class TKwcontinue
615 super TokenKeyword
616 end
617
618 # The keyword `break`
619 class TKwbreak
620 super TokenKeyword
621 end
622
623 # The keyword `abort`
624 class TKwabort
625 super TokenKeyword
626 end
627
628 # The keyword `assert`
629 class TKwassert
630 super TokenKeyword
631 end
632
633 # The keyword `new`
634 class TKwnew
635 super TokenKeyword
636 end
637
638 # The keyword `isa`
639 class TKwisa
640 super TokenKeyword
641 end
642
643 # The keyword `once`
644 class TKwonce
645 super TokenKeyword
646 end
647
648 # The keyword `super`
649 class TKwsuper
650 super TokenKeyword
651 end
652
653 # The keyword `self`
654 class TKwself
655 super TokenKeyword
656 end
657
658 # The keyword `true`
659 class TKwtrue
660 super TokenKeyword
661 end
662
663 # The keyword `false`
664 class TKwfalse
665 super TokenKeyword
666 end
667
668 # The keyword `null`
669 class TKwnull
670 super TokenKeyword
671 end
672
673 # The keyword `as`
674 class TKwas
675 super TokenKeyword
676 end
677
678 # The keyword `nullable`
679 class TKwnullable
680 super TokenKeyword
681 end
682
683 # The keyword `isset`
684 class TKwisset
685 super TokenKeyword
686 end
687
688 # The keyword `label`
689 class TKwlabel
690 super TokenKeyword
691 end
692
693 # The keyword `with`
694 class TKwwith
695 super TokenKeyword
696 end
697
698 # The special keyword `__DEBUG__`
699 class TKwdebug
700 super Token
701 end
702
703 # The symbol `(`
704 class TOpar
705 super Token
706 end
707
708 # The symbol `)`
709 class TCpar
710 super Token
711 end
712
713 # The symbol `[`
714 class TObra
715 super Token
716 end
717
718 # The symbol `]`
719 class TCbra
720 super Token
721 end
722
723 # The symbol `,`
724 class TComma
725 super Token
726 end
727
728 # The symbol `:`
729 class TColumn
730 super Token
731 end
732
733 # The symbol `::`
734 class TQuad
735 super Token
736 end
737
738 # The symbol `=`
739 class TAssign
740 super Token
741 end
742
743 # A token associated with an operator (and other lookalike symbols)
744 abstract class TokenOperator
745 super Token
746 redef fun to_s
747 do
748 return "operator '{text}'"
749 end
750 end
751
752 # The operator `+=`
753 class TPluseq
754 super TokenOperator
755 end
756
757 # The operator `-=`
758 class TMinuseq
759 super TokenOperator
760 end
761
762 # The operator `*=`
763 class TStareq
764 super TokenOperator
765 end
766
767 # The operator `/=`
768 class TSlasheq
769 super TokenOperator
770 end
771
772 # The operator `%=`
773 class TPercenteq
774 super TokenOperator
775 end
776
777 # The operator `**=`
778 class TStarstareq
779 super TokenOperator
780 end
781
782 # The operator `|=`
783 class TPipeeq
784 super TokenOperator
785 end
786
787 # The operator `^=`
788 class TCareteq
789 super TokenOperator
790 end
791
792 # The operator `&=`
793 class TAmpeq
794 super TokenOperator
795 end
796
797 # The operator `<<=`
798 class TLleq
799 super TokenOperator
800 end
801
802 # The operator `>>=`
803 class TGgeq
804 super TokenOperator
805 end
806
807 # The symbol `...`
808 class TDotdotdot
809 super Token
810 end
811
812 # The symbol `..`
813 class TDotdot
814 super Token
815 end
816
817 # The symbol `.`
818 class TDot
819 super Token
820 end
821
822 # The operator `+`
823 class TPlus
824 super TokenOperator
825 end
826
827 # The operator `-`
828 class TMinus
829 super TokenOperator
830 end
831
832 # The operator `*`
833 class TStar
834 super TokenOperator
835 end
836
837 # The operator `**`
838 class TStarstar
839 super TokenOperator
840 end
841
842 # The operator `/`
843 class TSlash
844 super TokenOperator
845 end
846
847 # The operator `%`
848 class TPercent
849 super TokenOperator
850 end
851
852 # The operator `|`
853 class TPipe
854 super TokenOperator
855 end
856
857 # The operator `^`
858 class TCaret
859 super TokenOperator
860 end
861
862 # The operator `&`
863 class TAmp
864 super TokenOperator
865 end
866
867 # The operator `~`
868 class TTilde
869 super TokenOperator
870 end
871
872 # The operator `==`
873 class TEq
874 super TokenOperator
875 end
876
877 # The operator `!=`
878 class TNe
879 super TokenOperator
880 end
881
882 # The operator `<`
883 class TLt
884 super TokenOperator
885 end
886
887 # The operator `<=`
888 class TLe
889 super TokenOperator
890 end
891
892 # The operator `<<`
893 class TLl
894 super TokenOperator
895 end
896
897 # The operator `>`
898 class TGt
899 super TokenOperator
900 end
901
902 # The operator `>=`
903 class TGe
904 super TokenOperator
905 end
906
907 # The operator `>>`
908 class TGg
909 super TokenOperator
910 end
911
912 # The operator `<=>`
913 class TStarship
914 super TokenOperator
915 end
916
917 # The operator `!`
918 class TBang
919 super TokenOperator
920 end
921
922 # The symbol `@`
923 class TAt
924 super Token
925 end
926
927 # The symbol `;`
928 class TSemi
929 super Token
930 end
931
932 # A class (or formal type) identifier. They start with an uppercase.
933 class TClassid
934 super Token
935 redef fun to_s
936 do
937 do return "type identifier '{text}'"
938 end
939 end
940
941 # A standard identifier (variable, method...). They start with a lowercase.
942 class TId
943 super Token
944 redef fun to_s
945 do
946 do return "identifier '{text}'"
947 end
948 end
949
950 # An attribute identifier. They start with an underscore.
951 class TAttrid
952 super Token
953 redef fun to_s
954 do
955 do return "attribute '{text}'"
956 end
957 end
958
959 # A token of a literal value (string, integer, etc).
960 abstract class TokenLiteral
961 super Token
962 redef fun to_s
963 do
964 do return "literal value '{text}'"
965 end
966 end
967
968 # A literal integer
969 class TInteger
970 super TokenLiteral
971 end
972
973 # A literal floating point number
974 class TFloat
975 super TokenLiteral
976 end
977
978 # A literal character
979 class TChar
980 super TokenLiteral
981 end
982
983 # A literal string
984 class TString
985 super TokenLiteral
986 end
987
988 # The starting part of a super string (between `"` and `{`)
989 class TStartString
990 super TokenLiteral
991 end
992
993 # The middle part of a super string (between `}` and `{`)
994 class TMidString
995 super TokenLiteral
996 end
997
998 # The final part of a super string (between `}` and `"`)
999 class TEndString
1000 super TokenLiteral
1001 end
1002
1003 # A malformed string
1004 class TBadString
1005 super Token
1006 redef fun to_s
1007 do
1008 do return "malformed string {text}"
1009 end
1010 end
1011
1012 # A malformed char
1013 class TBadChar
1014 super Token
1015 redef fun to_s
1016 do
1017 do return "malformed character {text}"
1018 end
1019 end
1020
1021 # A extern code block
1022 class TExternCodeSegment
1023 super Token
1024 end
1025
1026 # A end of file
1027 class EOF
1028 super Token
1029 redef fun to_s
1030 do
1031 return "end of file"
1032 end
1033 end
1034
1035 # A mark of an error
1036 class AError
1037 super EOF
1038 end
1039 # A lexical error (unexpected character)
1040 class ALexerError
1041 super AError
1042 end
1043 # A syntactic error (unexpected token)
1044 class AParserError
1045 super AError
1046 end
1047
1048 # The main node of a Nit source-file
1049 class AModule
1050 super Prod
1051
1052 # The declaration part of the module
1053 var n_moduledecl: nullable AModuledecl = null is writable
1054
1055 # List of importation clauses
1056 var n_imports = new ANodes[AImport](self)
1057
1058 # List of extern blocks
1059 var n_extern_code_blocks = new ANodes[AExternCodeBlock](self)
1060
1061 # List of class definition (including top-level methods and the main)
1062 var n_classdefs = new ANodes[AClassdef](self)
1063 end
1064
1065 # Abstract class for definition of entities
1066 abstract class ADefinition
1067 super Prod
1068 # The documentation
1069 var n_doc: nullable ADoc = null is writable
1070
1071 # The `redef` keyword
1072 var n_kwredef: nullable TKwredef = null is writable
1073
1074 # The declared visibility
1075 var n_visibility: nullable AVisibility = null is writable
1076 end
1077
1078 # The declaration of the module with the documentation, name, and annotations
1079 class AModuledecl
1080 super ADefinition
1081
1082 # The `module` keyword
1083 var n_kwmodule: TKwmodule is writable, noinit
1084
1085 # The declared module name
1086 var n_name: AModuleName is writable, noinit
1087 end
1088
1089 # A import clause of a module
1090 abstract class AImport
1091 super Prod
1092
1093 # The declared visibility
1094 var n_visibility: AVisibility is writable, noinit
1095
1096 # The `import` keyword
1097 var n_kwimport: TKwimport is writable, noinit
1098 end
1099
1100 # A standard import clause. eg `import x`
1101 class AStdImport
1102 super AImport
1103 # The imported module name
1104 var n_name: AModuleName is writable, noinit
1105 end
1106
1107 # The special import clause of the kernel module. eg `import end`
1108 class ANoImport
1109 super AImport
1110 # The `end` keyword, that indicate the root module
1111 var n_kwend: TKwend is writable, noinit
1112 end
1113
1114 # A visibility modifier
1115 #
1116 # The public visibility is an empty production (no keyword).
1117 #
1118 # Note: even if some visibilities are only valid on some placse (for instance, no `protected` class or no `intrude` method)
1119 # the parser has no such a restriction, therefore the semantic phases has to check that the visibilities make sense.
1120 abstract class AVisibility
1121 super Prod
1122 end
1123
1124 # An implicit or explicit public visibility modifier
1125 class APublicVisibility
1126 super AVisibility
1127 # The `public` keyword, if any
1128 var n_kwpublic: nullable TKwpublic is writable
1129 end
1130 # An explicit private visibility modifier
1131 class APrivateVisibility
1132 super AVisibility
1133 # The `private` keyword
1134 var n_kwprivate: TKwprivate is writable, noinit
1135 end
1136 # An explicit protected visibility modifier
1137 class AProtectedVisibility
1138 super AVisibility
1139 # The `protected` keyword
1140 var n_kwprotected: TKwprotected is writable, noinit
1141 end
1142 # An explicit intrude visibility modifier
1143 class AIntrudeVisibility
1144 super AVisibility
1145 # The `intrude` keyword
1146 var n_kwintrude: TKwintrude is writable, noinit
1147 end
1148
1149 # A class definition
1150 # While most definition are `AStdClassdef`
1151 # There is tow special case of class definition
1152 abstract class AClassdef
1153 super Prod
1154 # All the declared properties (including the main method)
1155 var n_propdefs = new ANodes[APropdef](self)
1156 end
1157
1158 # A standard class definition with a name, superclasses and properties
1159 class AStdClassdef
1160 super AClassdef
1161 super ADefinition
1162
1163 # The class kind (interface, abstract class, etc.)
1164 var n_classkind: AClasskind is writable, noinit
1165
1166 # The name of the class
1167 var n_id: nullable TClassid = null is writable
1168
1169 # The `[` symbol
1170 var n_obra: nullable TObra = null is writable
1171
1172 # The list of formal parameter types
1173 var n_formaldefs = new ANodes[AFormaldef](self)
1174
1175 # The `]` symbol
1176 var n_cbra: nullable TCbra = null is writable
1177
1178 # The extern block code
1179 var n_extern_code_block: nullable AExternCodeBlock = null is writable
1180
1181 # The `end` keyword
1182 var n_kwend: TKwend is writable, noinit
1183
1184 fun n_superclasses: Array[ASuperPropdef] do
1185 return [for d in n_propdefs do if d isa ASuperPropdef then d]
1186 end
1187
1188 redef fun hot_location do return n_id.location
1189 end
1190
1191 # The implicit class definition of the implicit main method
1192 class ATopClassdef
1193 super AClassdef
1194 end
1195
1196 # The implicit class definition of the top-level methods
1197 class AMainClassdef
1198 super AClassdef
1199 end
1200
1201 # The modifier for the kind of class (abstract, interface, etc.)
1202 abstract class AClasskind
1203 super Prod
1204 end
1205
1206 # A default, or concrete class modifier (just `class`)
1207 class AConcreteClasskind
1208 super AClasskind
1209
1210 # The `class` keyword.
1211 var n_kwclass: TKwclass is writable, noinit
1212 end
1213
1214 # An abstract class modifier (`abstract class`)
1215 class AAbstractClasskind
1216 super AClasskind
1217
1218 # The `abstract` keyword.
1219 var n_kwabstract: TKwabstract is writable, noinit
1220
1221 # The `class` keyword.
1222 var n_kwclass: TKwclass is writable, noinit
1223 end
1224
1225 # An interface class modifier (`interface`)
1226 class AInterfaceClasskind
1227 super AClasskind
1228
1229 # The `interface` keyword.
1230 var n_kwinterface: TKwinterface is writable, noinit
1231 end
1232
1233 # An enum/universal class modifier (`enum class`)
1234 class AEnumClasskind
1235 super AClasskind
1236
1237 # The `enum` keyword.
1238 var n_kwenum: TKwenum is writable, noinit
1239 end
1240
1241 # An extern class modifier (`extern class`)
1242 class AExternClasskind
1243 super AClasskind
1244
1245 # The `extern` keyword.
1246 var n_kwextern: TKwextern is writable, noinit
1247
1248 # The `class` keyword.
1249 var n_kwclass: nullable TKwclass = null is writable
1250 end
1251
1252 # The definition of a formal generic parameter type. eg `X: Y`
1253 class AFormaldef
1254 super Prod
1255
1256 # The name of the parameter type
1257 var n_id: TClassid is writable, noinit
1258
1259 # The bound of the parameter type
1260 var n_type: nullable AType = null is writable
1261 end
1262
1263 # The definition of a property
1264 abstract class APropdef
1265 super ADefinition
1266 end
1267
1268 # A definition of an attribute
1269 # For historical reason, old-syle and new-style attributes use the same `ANode` sub-class
1270 class AAttrPropdef
1271 super APropdef
1272
1273 # The `var` keyword
1274 var n_kwvar: TKwvar is writable, noinit
1275
1276 # The identifier for a new-style attribute
1277 var n_id2: TId is writable, noinit
1278
1279 # The declared type of the attribute
1280 var n_type: nullable AType = null is writable
1281
1282 # The `=` symbol
1283 var n_assign: nullable TAssign = null is writable
1284
1285 # The initial value, if any (set with `=`)
1286 var n_expr: nullable AExpr = null is writable
1287
1288 # The `do` keyword
1289 var n_kwdo: nullable TKwdo = null is writable
1290
1291 # The initial value, if any (set with `do return`)
1292 var n_block: nullable AExpr = null is writable
1293
1294 # The `end` keyword
1295 var n_kwend: nullable TKwend = null is writable
1296
1297 redef fun hot_location
1298 do
1299 return n_id2.location
1300 end
1301 end
1302
1303 # A definition of all kind of method (including constructors)
1304 class AMethPropdef
1305 super APropdef
1306
1307 # The `fun` keyword, if any
1308 var n_kwmeth: nullable TKwmeth = null is writable
1309
1310 # The `init` keyword, if any
1311 var n_kwinit: nullable TKwinit = null is writable
1312
1313 # The `new` keyword, if any
1314 var n_kwnew: nullable TKwnew = null is writable
1315
1316 # The name of the method, if any
1317 var n_methid: nullable AMethid = null is writable
1318
1319 # The signature of the method, if any
1320 var n_signature: nullable ASignature = null is writable
1321
1322 # The `do` keyword
1323 var n_kwdo: nullable TKwdo = null is writable
1324
1325 # The body (in Nit) of the method, if any
1326 var n_block: nullable AExpr = null is writable
1327
1328 # The `end` keyword
1329 var n_kwend: nullable TKwend = null is writable
1330
1331 # The list of declared callbacks (for extern methods)
1332 var n_extern_calls: nullable AExternCalls = null is writable
1333
1334 # The body (in extern code) of the method, if any
1335 var n_extern_code_block: nullable AExternCodeBlock = null is writable
1336
1337 redef fun hot_location
1338 do
1339 if n_methid != null then
1340 return n_methid.location
1341 else if n_kwinit != null then
1342 return n_kwinit.location
1343 else if n_kwnew != null then
1344 return n_kwnew.location
1345 else
1346 return location
1347 end
1348 end
1349 end
1350
1351 # The implicit main method
1352 class AMainMethPropdef
1353 super AMethPropdef
1354 end
1355
1356 class AAnnotPropdef
1357 super APropdef
1358 super AAnnotation
1359 end
1360
1361 # A super-class. eg `super X`
1362 class ASuperPropdef
1363 super APropdef
1364
1365 # The super keyword
1366 var n_kwsuper: TKwsuper is writable, noinit
1367
1368 # The super-class (indicated as a type)
1369 var n_type: AType is writable, noinit
1370 end
1371
1372
1373 # Declaration of callbacks for extern methods
1374 class AExternCalls
1375 super Prod
1376
1377 # The `import` keyword
1378 var n_kwimport: TKwimport is writable, noinit
1379
1380 # The list of declared callbacks
1381 var n_extern_calls: ANodes[AExternCall] = new ANodes[AExternCall](self)
1382 end
1383
1384 # A single callback declaration
1385 abstract class AExternCall
1386 super Prod
1387 end
1388
1389 # A single callback declaration on a method
1390 abstract class APropExternCall
1391 super AExternCall
1392 end
1393
1394 # A single callback declaration on a method on the current receiver
1395 class ALocalPropExternCall
1396 super APropExternCall
1397
1398 # The name of the called-back method
1399 var n_methid: AMethid is writable, noinit
1400 end
1401
1402 # A single callback declaration on a method on an explicit receiver type.
1403 class AFullPropExternCall
1404 super APropExternCall
1405
1406 # The type of the receiver of the called-back method
1407 var n_type: AType is writable, noinit
1408
1409 # The dot `.`
1410 var n_dot: nullable TDot = null is writable
1411
1412 # The name of the called-back method
1413 var n_methid: AMethid is writable, noinit
1414 end
1415
1416 # A single callback declaration on a method on a constructor
1417 class AInitPropExternCall
1418 super APropExternCall
1419
1420 # The allocated type
1421 var n_type: AType is writable, noinit
1422 end
1423
1424 # A single callback declaration on a `super` call
1425 class ASuperExternCall
1426 super AExternCall
1427
1428 # The `super` keyword
1429 var n_kwsuper: TKwsuper is writable, noinit
1430 end
1431
1432 # A single callback declaration on a cast
1433 abstract class ACastExternCall
1434 super AExternCall
1435 end
1436
1437 # A single callback declaration on a cast to a given type
1438 class ACastAsExternCall
1439 super ACastExternCall
1440
1441 # The origin type of the cast
1442 var n_from_type: AType is writable, noinit
1443
1444 # The dot (`.`)
1445 var n_dot: nullable TDot = null is writable
1446
1447 # The `as` keyword
1448 var n_kwas: TKwas is writable, noinit
1449
1450 # The destination of the cast
1451 var n_to_type: AType is writable, noinit
1452 end
1453
1454 # A single callback declaration on a cast to a nullable type
1455 class AAsNullableExternCall
1456 super ACastExternCall
1457
1458 # The origin type to cast as nullable
1459 var n_type: AType is writable, noinit
1460
1461 # The `as` keyword
1462 var n_kwas: TKwas is writable, noinit
1463
1464 # The `nullable` keyword
1465 var n_kwnullable: TKwnullable is writable, noinit
1466 end
1467
1468 # A single callback declaration on a cast to a non-nullable type
1469 class AAsNotNullableExternCall
1470 super ACastExternCall
1471
1472 # The destination type on a cast to not nullable
1473 var n_type: AType is writable, noinit
1474
1475 # The `as` keyword.
1476 var n_kwas: TKwas is writable, noinit
1477
1478 # The `not` keyword
1479 var n_kwnot: TKwnot is writable, noinit
1480
1481 # The `nullable` keyword
1482 var n_kwnullable: TKwnullable is writable, noinit
1483 end
1484
1485 # A definition of a virtual type
1486 class ATypePropdef
1487 super APropdef
1488
1489 # The `type` keyword
1490 var n_kwtype: TKwtype is writable, noinit
1491
1492 # The name of the virtual type
1493 var n_id: TClassid is writable, noinit
1494
1495 # The bound of the virtual type
1496 var n_type: AType is writable, noinit
1497 end
1498
1499 # The identifier of a method in a method declaration.
1500 # There is a specific class because of operator and setters.
1501 abstract class AMethid
1502 super Prod
1503 end
1504
1505 # A method name with a simple identifier
1506 class AIdMethid
1507 super AMethid
1508
1509 # The simple identifier
1510 var n_id: TId is writable, noinit
1511 end
1512
1513 # A method name for an operator
1514 class AOperatorMethid
1515 super AMethid
1516
1517 # The associated operator symbol
1518 var n_op: Token is writable, noinit
1519 end
1520 # A method name `+`
1521 class APlusMethid
1522 super AOperatorMethid
1523 end
1524
1525 # A method name `-`
1526 class AMinusMethid
1527 super AOperatorMethid
1528 end
1529
1530 # A method name `*`
1531 class AStarMethid
1532 super AOperatorMethid
1533 end
1534
1535 # A method name `**`
1536 class AStarstarMethid
1537 super AOperatorMethid
1538 end
1539
1540 # A method name `/`
1541 class ASlashMethid
1542 super AOperatorMethid
1543 end
1544
1545 # A method name `%`
1546 class APercentMethid
1547 super AOperatorMethid
1548 end
1549
1550 # A method name `|`
1551 class APipeMethid
1552 super AOperatorMethid
1553 end
1554
1555 # A method name `^`
1556 class ACaretMethid
1557 super AOperatorMethid
1558 end
1559
1560 # A method name `&`
1561 class AAmpMethid
1562 super AOperatorMethid
1563 end
1564
1565 # A method name `~`
1566 class ATildeMethid
1567 super AOperatorMethid
1568 end
1569
1570 # A method name `==`
1571 class AEqMethid
1572 super AOperatorMethid
1573 end
1574
1575 # A method name `!=`
1576 class ANeMethid
1577 super AOperatorMethid
1578 end
1579
1580 # A method name `<=`
1581 class ALeMethid
1582 super AOperatorMethid
1583 end
1584
1585 # A method name `>=`
1586 class AGeMethid
1587 super AOperatorMethid
1588 end
1589
1590 # A method name `<`
1591 class ALtMethid
1592 super AOperatorMethid
1593 end
1594
1595 # A method name `>`
1596 class AGtMethid
1597 super AOperatorMethid
1598 end
1599
1600 # A method name `<<`
1601 class ALlMethid
1602 super AOperatorMethid
1603 end
1604
1605 # A method name `>>`
1606 class AGgMethid
1607 super AOperatorMethid
1608 end
1609
1610 # A method name `<=>`
1611 class AStarshipMethid
1612 super AOperatorMethid
1613 end
1614
1615 # A method name `[]`
1616 class ABraMethid
1617 super AMethid
1618
1619 # The `[` symbol
1620 var n_obra: TObra is writable, noinit
1621
1622 # The `]` symbol
1623 var n_cbra: TCbra is writable, noinit
1624 end
1625
1626 # A setter method name with a simple identifier (with a `=`)
1627 class AAssignMethid
1628 super AMethid
1629
1630 # The base identifier
1631 var n_id: TId is writable, noinit
1632
1633 # The `=` symbol
1634 var n_assign: TAssign is writable, noinit
1635 end
1636
1637 # A method name `[]=`
1638 class ABraassignMethid
1639 super AMethid
1640
1641 # The `[` symbol
1642 var n_obra: TObra is writable, noinit
1643
1644 # The `]` symbol
1645 var n_cbra: TCbra is writable, noinit
1646
1647 # The `=` symbol
1648 var n_assign: TAssign is writable, noinit
1649 end
1650
1651 # A signature in a method definition. eg `(x,y:X,z:Z):T`
1652 class ASignature
1653 super Prod
1654
1655 # The `(` symbol
1656 var n_opar: nullable TOpar = null is writable
1657
1658 # The list of parameters
1659 var n_params = new ANodes[AParam](self)
1660
1661 # The `)` symbol
1662 var n_cpar: nullable TCpar = null is writable
1663
1664 # The return type
1665 var n_type: nullable AType = null is writable
1666 end
1667
1668 # A parameter definition in a signature. eg `x:X`
1669 class AParam
1670 super Prod
1671
1672 # The name of the parameter
1673 var n_id: TId is writable, noinit
1674
1675 # The type of the parameter, if any
1676 var n_type: nullable AType = null is writable
1677
1678 # The `...` symbol to indicate varargs
1679 var n_dotdotdot: nullable TDotdotdot = null is writable
1680 end
1681
1682 # A static type. eg `nullable X[Y]`
1683 class AType
1684 super Prod
1685 # The `nullable` keyword
1686 var n_kwnullable: nullable TKwnullable = null is writable
1687
1688 # The name of the class or of the formal type
1689 var n_id: TClassid is writable, noinit
1690
1691 # The opening bracket
1692 var n_obra: nullable TObra = null is writable
1693
1694 # Type arguments for a generic type
1695 var n_types = new ANodes[AType](self)
1696
1697 # The closing bracket
1698 var n_cbra: nullable TCbra = null is writable
1699 end
1700
1701 # A label at the end of a block or in a break/continue statement. eg `label x`
1702 class ALabel
1703 super Prod
1704
1705 # The `label` keyword
1706 var n_kwlabel: TKwlabel is writable, noinit
1707
1708 # The name of the label, if any
1709 var n_id: nullable TId is writable, noinit
1710 end
1711
1712 # Expression and statements
1713 # From a AST point of view there is no distinction between statement and expressions (even if the parser has to distinguish them)
1714 abstract class AExpr
1715 super Prod
1716 end
1717
1718 # A sequence of `AExpr` (usually statements)
1719 # The last `AExpr` gives the value of the whole block
1720 class ABlockExpr
1721 super AExpr
1722
1723 # The list of statements in the bloc.
1724 # The last element is often considered as an expression that give the value of the whole block.
1725 var n_expr = new ANodes[AExpr](self)
1726
1727 # The `end` keyword
1728 var n_kwend: nullable TKwend = null is writable
1729 end
1730
1731 # A declaration of a local variable. eg `var x: X = y`
1732 class AVardeclExpr
1733 super AExpr
1734
1735 # The `var` keyword
1736 var n_kwvar: nullable TKwvar = null is writable
1737
1738 # The name of the local variable
1739 var n_id: TId is writable, noinit
1740
1741 # The declaration type of the local variable
1742 var n_type: nullable AType = null is writable
1743
1744 # The `=` symbol (for the initial value)
1745 var n_assign: nullable TAssign = null is writable
1746
1747 # The initial value, if any
1748 var n_expr: nullable AExpr = null is writable
1749 end
1750
1751 # A `return` statement. eg `return x`
1752 class AReturnExpr
1753 super AExpr
1754
1755 # The `return` keyword
1756 var n_kwreturn: nullable TKwreturn = null is writable
1757
1758 # The return value, if any
1759 var n_expr: nullable AExpr = null is writable
1760 end
1761
1762 # Something that has a label.
1763 abstract class ALabelable
1764 super Prod
1765
1766 # The associated label declatation
1767 var n_label: nullable ALabel = null is writable
1768 end
1769
1770 # A `break` or a `continue`
1771 abstract class AEscapeExpr
1772 super AExpr
1773 super ALabelable
1774
1775 # The return value, if nay (unused currently)
1776 var n_expr: nullable AExpr = null is writable
1777 end
1778
1779 # A `break` statement.
1780 class ABreakExpr
1781 super AEscapeExpr
1782
1783 # The `break` keyword
1784 var n_kwbreak: TKwbreak is writable, noinit
1785 end
1786
1787 # An `abort` statement
1788 class AAbortExpr
1789 super AExpr
1790
1791 # The `abort` keyword
1792 var n_kwabort: TKwabort is writable, noinit
1793 end
1794
1795 # A `continue` statement
1796 class AContinueExpr
1797 super AEscapeExpr
1798
1799 # The `continue` keyword.
1800 var n_kwcontinue: nullable TKwcontinue = null is writable
1801 end
1802
1803 # A `do` statement
1804 class ADoExpr
1805 super AExpr
1806 super ALabelable
1807
1808 # The `do` keyword
1809 var n_kwdo: TKwdo is writable, noinit
1810
1811 # The list of statements of the `do`.
1812 var n_block: nullable AExpr = null is writable
1813 end
1814
1815 # A `if` statement
1816 class AIfExpr
1817 super AExpr
1818
1819 # The `if` keyword
1820 var n_kwif: TKwif is writable, noinit
1821
1822 # The expression used as the condition of the `if`
1823 var n_expr: AExpr is writable, noinit
1824
1825 # The `then` keyword
1826 var n_kwthen: TKwthen is writable, noinit
1827
1828 # The body of the `then` part
1829 var n_then: nullable AExpr = null is writable
1830
1831 # The `else` keyword
1832 var n_kwelse: nullable TKwelse = null is writable
1833
1834 # The body of the `else` part
1835 var n_else: nullable AExpr = null is writable
1836 end
1837
1838 # A `if` expression (ternary conditional). eg. `if true then 1 else 0`
1839 class AIfexprExpr
1840 super AExpr
1841
1842 # The `if` keyword
1843 var n_kwif: TKwif is writable, noinit
1844
1845 # The expression used as the condition of the `if`
1846 var n_expr: AExpr is writable, noinit
1847
1848 # The `then` keyword
1849 var n_kwthen: TKwthen is writable, noinit
1850
1851 # The expression in the `then` part
1852 var n_then: AExpr is writable, noinit
1853
1854 # The `else` keyword
1855 var n_kwelse: TKwelse is writable, noinit
1856
1857 # The expression in the `else` part
1858 var n_else: AExpr is writable, noinit
1859 end
1860
1861 # A `while` statement
1862 class AWhileExpr
1863 super AExpr
1864 super ALabelable
1865
1866 # The `while` keyword
1867 var n_kwwhile: TKwwhile is writable, noinit
1868
1869 # The expression used as the condition of the `while`
1870 var n_expr: AExpr is writable, noinit
1871
1872 # The `do` keyword
1873 var n_kwdo: TKwdo is writable, noinit
1874
1875 # The body of the loop
1876 var n_block: nullable AExpr = null is writable
1877 end
1878
1879 # A `loop` statement
1880 class ALoopExpr
1881 super AExpr
1882 super ALabelable
1883
1884 # The `loop` keyword
1885 var n_kwloop: TKwloop is writable, noinit
1886
1887 # The body of the loop
1888 var n_block: nullable AExpr = null is writable
1889 end
1890
1891 # A `for` statement
1892 class AForExpr
1893 super AExpr
1894 super ALabelable
1895
1896 # The `for` keyword
1897 var n_kwfor: TKwfor is writable, noinit
1898
1899 # The list of name of the automatic variables
1900 var n_ids = new ANodes[TId](self)
1901
1902 # The `in` keyword
1903 var n_kwin: TKwin is writable, noinit
1904
1905 # The expression used as the collection to iterate on
1906 var n_expr: AExpr is writable, noinit
1907
1908 # The `do` keyword
1909 var n_kwdo: TKwdo is writable, noinit
1910
1911 # The body of the loop
1912 var n_block: nullable AExpr = null is writable
1913 end
1914
1915 # A `with` statement
1916 class AWithExpr
1917 super AExpr
1918 super ALabelable
1919
1920 # The `with` keyword
1921 var n_kwwith: TKwwith is writable, noinit
1922
1923 # The expression used to get the value to control
1924 var n_expr: AExpr is writable, noinit
1925
1926 # The `do` keyword
1927 var n_kwdo: TKwdo is writable, noinit
1928
1929 # The body of the loop
1930 var n_block: nullable AExpr = null is writable
1931 end
1932
1933 # An `assert` statement
1934 class AAssertExpr
1935 super AExpr
1936
1937 # The `assert` keyword
1938 var n_kwassert: TKwassert is writable, noinit
1939
1940 # The name of the assert, if any
1941 var n_id: nullable TId = null is writable
1942
1943 # The expression used as the condition of the `assert`
1944 var n_expr: AExpr is writable, noinit
1945
1946 # The `else` keyword
1947 var n_kwelse: nullable TKwelse = null is writable
1948
1949 # The body to execute when the assert fails
1950 var n_else: nullable AExpr = null is writable
1951 end
1952
1953 # Whatever is a simple assignment. eg `= something`
1954 abstract class AAssignFormExpr
1955 super AExpr
1956
1957 # The `=` symbol
1958 var n_assign: TAssign is writable, noinit
1959
1960 # The right-value to assign.
1961 var n_value: AExpr is writable, noinit
1962 end
1963
1964 # Whatever is a combined assignment. eg `+= something`
1965 abstract class AReassignFormExpr
1966 super AExpr
1967
1968 # The combined operator (eg. `+=`)
1969 var n_assign_op: AAssignOp is writable, noinit
1970
1971 # The right-value to apply on the combined operator.
1972 var n_value: AExpr is writable, noinit
1973 end
1974
1975 # A `once` expression. eg `once x`
1976 class AOnceExpr
1977 super AExpr
1978
1979 # The `once` keyword
1980 var n_kwonce: TKwonce is writable, noinit
1981
1982 # The expression to evaluate only one time
1983 var n_expr: AExpr is writable, noinit
1984 end
1985
1986 # A polymorphic invocation of a method
1987 # The form of the invocation (name, arguments, etc.) are specific
1988 abstract class ASendExpr
1989 super AExpr
1990 # The receiver of the method invocation
1991 var n_expr: AExpr is writable, noinit
1992 end
1993
1994 # A binary operation on a method
1995 abstract class ABinopExpr
1996 super ASendExpr
1997
1998 # The operator
1999 var n_op: Token is writable, noinit
2000
2001 # The second operand of the operation
2002 # Note: the receiver (`n_expr`) is the first operand
2003 var n_expr2: AExpr is writable, noinit
2004
2005 # The name of the operator (eg '+')
2006 fun operator: String is abstract
2007 end
2008
2009 # Something that is boolean expression
2010 abstract class ABoolExpr
2011 super AExpr
2012 end
2013
2014 # Something that is binary boolean expression
2015 abstract class ABinBoolExpr
2016 super ABoolExpr
2017
2018 # The first boolean operand
2019 var n_expr: AExpr is writable, noinit
2020
2021 # The operator
2022 var n_op: Token is writable, noinit
2023
2024 # The second boolean operand
2025 var n_expr2: AExpr is writable, noinit
2026 end
2027
2028 # A `or` expression
2029 class AOrExpr
2030 super ABinBoolExpr
2031 end
2032
2033 # A `and` expression
2034 class AAndExpr
2035 super ABinBoolExpr
2036 end
2037
2038 # A `or else` expression
2039 class AOrElseExpr
2040 super ABinBoolExpr
2041
2042 # The `else` keyword
2043 var n_kwelse: TKwelse is writable, noinit
2044 end
2045
2046 # A `implies` expression
2047 class AImpliesExpr
2048 super ABinBoolExpr
2049 end
2050
2051 # A `not` expression
2052 class ANotExpr
2053 super ABoolExpr
2054
2055 # The `not` keyword
2056 var n_kwnot: TKwnot is writable, noinit
2057
2058 # The boolean operand of the `not`
2059 var n_expr: AExpr is writable, noinit
2060 end
2061
2062 # A `==` or a `!=` expression
2063 #
2064 # Both have a similar effect on adaptive typing, so this class factorizes the common behavior.
2065 class AEqFormExpr
2066 super ABinopExpr
2067 end
2068
2069 # A `==` expression
2070 class AEqExpr
2071 super AEqFormExpr
2072 redef fun operator do return "=="
2073 end
2074
2075 # A `!=` expression
2076 class ANeExpr
2077 super AEqFormExpr
2078 redef fun operator do return "!="
2079 end
2080
2081 # A `<` expression
2082 class ALtExpr
2083 super ABinopExpr
2084 redef fun operator do return "<"
2085 end
2086
2087 # A `<=` expression
2088 class ALeExpr
2089 super ABinopExpr
2090 redef fun operator do return "<="
2091 end
2092
2093 # A `<<` expression
2094 class ALlExpr
2095 super ABinopExpr
2096 redef fun operator do return "<<"
2097 end
2098
2099 # A `>` expression
2100 class AGtExpr
2101 super ABinopExpr
2102 redef fun operator do return ">"
2103 end
2104
2105 # A `>=` expression
2106 class AGeExpr
2107 super ABinopExpr
2108 redef fun operator do return ">="
2109 end
2110
2111 # A `>>` expression
2112 class AGgExpr
2113 super ABinopExpr
2114 redef fun operator do return ">>"
2115 end
2116
2117 # A type-ckeck expression. eg `x isa T`
2118 class AIsaExpr
2119 super ABoolExpr
2120
2121 # The expression to check
2122 var n_expr: AExpr is writable, noinit
2123
2124 # The `isa` keyword
2125 var n_kwisa: TKwisa is writable, noinit
2126
2127 # The destination type to check to
2128 var n_type: AType is writable, noinit
2129 end
2130
2131 # A `+` expression
2132 class APlusExpr
2133 super ABinopExpr
2134 redef fun operator do return "+"
2135 end
2136
2137 # A `-` expression
2138 class AMinusExpr
2139 super ABinopExpr
2140 redef fun operator do return "-"
2141 end
2142
2143 # A `<=>` expression
2144 class AStarshipExpr
2145 super ABinopExpr
2146 redef fun operator do return "<=>"
2147 end
2148
2149 # A `*` expression
2150 class AStarExpr
2151 super ABinopExpr
2152 redef fun operator do return "*"
2153 end
2154
2155 # A `**` expression
2156 class AStarstarExpr
2157 super ABinopExpr
2158 redef fun operator do return "**"
2159 end
2160
2161 # A `/` expression
2162 class ASlashExpr
2163 super ABinopExpr
2164 redef fun operator do return "/"
2165 end
2166
2167 # A `%` expression
2168 class APercentExpr
2169 super ABinopExpr
2170 redef fun operator do return "%"
2171 end
2172
2173 # A `|` expression
2174 class APipeExpr
2175 super ABinopExpr
2176 redef fun operator do return "|"
2177 end
2178
2179 # A `^` expression
2180 class ACaretExpr
2181 super ABinopExpr
2182 redef fun operator do return "^"
2183 end
2184
2185 # A `&` expression
2186 class AAmpExpr
2187 super ABinopExpr
2188 redef fun operator do return "&"
2189 end
2190
2191 # A unary operation on a method
2192 abstract class AUnaryopExpr
2193 super ASendExpr
2194
2195 # The operator
2196 var n_op: Token is writable, noinit
2197
2198 # The name of the operator (eg '+')
2199 fun operator: String is abstract
2200 end
2201
2202 # A unary minus expression. eg `-x`
2203 class AUminusExpr
2204 super AUnaryopExpr
2205 redef fun operator do return "-"
2206 end
2207
2208 # A unary plus expression. eg `+x`
2209 class AUplusExpr
2210 super AUnaryopExpr
2211 redef fun operator do return "+"
2212 end
2213
2214 # A unary `~` expression
2215 class AUtildeExpr
2216 super AUnaryopExpr
2217 redef fun operator do return "~"
2218 end
2219
2220 # An explicit instantiation. eg `new T`
2221 class ANewExpr
2222 super AExpr
2223
2224 # The `new` keyword
2225 var n_kwnew: TKwnew is writable, noinit
2226
2227 # The `type` keyword
2228 var n_type: AType is writable, noinit
2229
2230 # The name of the named-constructor, if any
2231 var n_id: nullable TId = null is writable
2232
2233 # The arguments of the `new`
2234 var n_args: AExprs is writable, noinit
2235 end
2236
2237 # Whatever is a old-style attribute access
2238 abstract class AAttrFormExpr
2239 super AExpr
2240
2241 # The receiver of the attribute
2242 var n_expr: AExpr is writable, noinit
2243
2244 # The name of the attribute
2245 var n_id: TAttrid is writable, noinit
2246
2247 end
2248
2249 # The read of an attribute. eg `x._a`
2250 class AAttrExpr
2251 super AAttrFormExpr
2252 end
2253
2254 # The assignment of an attribute. eg `x._a=y`
2255 class AAttrAssignExpr
2256 super AAttrFormExpr
2257 super AAssignFormExpr
2258 end
2259
2260 # Whatever looks-like a call with a standard method and any number of arguments.
2261 abstract class ACallFormExpr
2262 super ASendExpr
2263
2264 # The name of the method
2265 var n_id: TId is writable, noinit
2266
2267 # The arguments of the call
2268 var n_args: AExprs is writable, noinit
2269 end
2270
2271 # A complex setter call (standard or brackets)
2272 abstract class ASendReassignFormExpr
2273 super ASendExpr
2274 super AReassignFormExpr
2275 end
2276
2277 # A complex attribute assignment. eg `x._a+=y`
2278 class AAttrReassignExpr
2279 super AAttrFormExpr
2280 super AReassignFormExpr
2281 end
2282
2283 # A call with a standard method-name and any number of arguments. eg `x.m(y)`. OR just a simple id
2284 # 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`.
2285 # Semantic analysis have to transform them to instance of `AVarExpr`.
2286 class ACallExpr
2287 super ACallFormExpr
2288 end
2289
2290 # A setter call with a standard method-name and any number of arguments. eg `x.m(y)=z`. OR just a simple assignment.
2291 # 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`.
2292 # Semantic analysis have to transform them to instance of `AVarAssignExpr`.
2293 class ACallAssignExpr
2294 super ACallFormExpr
2295 super AAssignFormExpr
2296 end
2297
2298 # 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.
2299 # 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`.
2300 # Semantic analysis have to transform them to instance of `AVarReassignExpr`.
2301 class ACallReassignExpr
2302 super ACallFormExpr
2303 super ASendReassignFormExpr
2304 end
2305
2306 # A call to `super`. OR a call of a super-constructor
2307 class ASuperExpr
2308 super AExpr
2309
2310 # The qualifier part before the super (currenlty unused)
2311 var n_qualified: nullable AQualified = null is writable
2312
2313 # The `super` keyword
2314 var n_kwsuper: TKwsuper is writable, noinit
2315
2316 # The arguments of the super
2317 var n_args: AExprs is writable, noinit
2318 end
2319
2320 # A call to the `init` constructor.
2321 # Note: because `init` is a keyword and not a `TId`, the explicit call to init cannot be a `ACallFormExpr`.
2322 class AInitExpr
2323 super ASendExpr
2324
2325 # The `init` keyword
2326 var n_kwinit: TKwinit is writable, noinit
2327
2328 # The arguments of the init
2329 var n_args: AExprs is writable, noinit
2330 end
2331
2332 # Whatever looks-like a call of the brackets `[]` operator.
2333 abstract class ABraFormExpr
2334 super ASendExpr
2335
2336 # The arguments inside the brackets
2337 var n_args: AExprs is writable, noinit
2338 end
2339
2340 # A call of the brackets operator. eg `x[y,z]`
2341 class ABraExpr
2342 super ABraFormExpr
2343 end
2344
2345 # A setter call of the bracket operator. eg `x[y,z]=t`
2346 class ABraAssignExpr
2347 super ABraFormExpr
2348 super AAssignFormExpr
2349 end
2350
2351 # Whatever is an access to a local variable
2352 abstract class AVarFormExpr
2353 super AExpr
2354
2355 # The name of the attribute
2356 var n_id: TId is writable, noinit
2357 end
2358
2359 # A complex setter call of the bracket operator. eg `x[y,z]+=t`
2360 class ABraReassignExpr
2361 super ABraFormExpr
2362 super ASendReassignFormExpr
2363 end
2364
2365 # A local variable read access.
2366 # The parser cannot instantiate them, see `ACallExpr`.
2367 class AVarExpr
2368 super AVarFormExpr
2369 end
2370
2371 # A local variable simple assignment access
2372 # The parser cannot instantiate them, see `ACallAssignExpr`.
2373 class AVarAssignExpr
2374 super AVarFormExpr
2375 super AAssignFormExpr
2376 end
2377
2378 # A local variable complex assignment access
2379 # The parser cannot instantiate them, see `ACallReassignExpr`.
2380 class AVarReassignExpr
2381 super AVarFormExpr
2382 super AReassignFormExpr
2383 end
2384
2385 # A literal range, open or closed
2386 abstract class ARangeExpr
2387 super AExpr
2388
2389 # The left (lower) element of the range
2390 var n_expr: AExpr is writable, noinit
2391
2392 # The `..`
2393 var n_dotdot: TDotdot is writable, noinit
2394
2395 # The right (upper) element of the range
2396 var n_expr2: AExpr is writable, noinit
2397 end
2398
2399 # A closed literal range. eg `[x..y]`
2400 class ACrangeExpr
2401 super ARangeExpr
2402
2403 # The opening bracket `[`
2404 var n_obra: TObra is writable, noinit
2405
2406 # The closing bracket `]`
2407 var n_cbra: TCbra is writable, noinit
2408 end
2409
2410 # An open literal range. eg `[x..y[`
2411 class AOrangeExpr
2412 super ARangeExpr
2413
2414 # The opening bracket `[`
2415 var n_obra: TObra is writable, noinit
2416
2417 # The closing bracket `[` (because open range)
2418 var n_cbra: TObra is writable, noinit
2419 end
2420
2421 # A literal array. eg. `[x,y,z]`
2422 class AArrayExpr
2423 super AExpr
2424
2425 # The opening bracket `[`
2426 var n_obra: TObra is writable, noinit
2427
2428 # The elements of the array
2429 var n_exprs = new ANodes[AExpr](self)
2430
2431 # The type of the element of the array (if any)
2432 var n_type: nullable AType = null is writable
2433
2434 # The closing bracket `]`
2435 var n_cbra: TCbra is writable, noinit
2436 end
2437
2438 # A read of `self`
2439 class ASelfExpr
2440 super AExpr
2441
2442 # The `self` keyword
2443 var n_kwself: nullable TKwself = null is writable
2444 end
2445
2446 # When there is no explicit receiver, `self` is implicit
2447 class AImplicitSelfExpr
2448 super ASelfExpr
2449 end
2450
2451 # A `true` boolean literal constant
2452 class ATrueExpr
2453 super ABoolExpr
2454
2455 # The `true` keyword
2456 var n_kwtrue: TKwtrue is writable, noinit
2457 end
2458
2459 # A `false` boolean literal constant
2460 class AFalseExpr
2461 super ABoolExpr
2462
2463 # The `false` keyword
2464 var n_kwfalse: TKwfalse is writable, noinit
2465 end
2466
2467 # A `null` literal constant
2468 class ANullExpr
2469 super AExpr
2470
2471 # The `null` keyword
2472 var n_kwnull: TKwnull is writable, noinit
2473 end
2474
2475 # An integer literal
2476 class AIntegerExpr
2477 super AExpr
2478
2479 # The integer token
2480 var n_integer: TInteger is writable, noinit
2481 end
2482
2483 # A float literal
2484 class AFloatExpr
2485 super AExpr
2486
2487 # The float token
2488 var n_float: TFloat is writable, noinit
2489 end
2490
2491 # A character literal
2492 class ACharExpr
2493 super AExpr
2494
2495 # The character token
2496 var n_char: TChar is writable, noinit
2497 end
2498
2499 # A string literal
2500 abstract class AStringFormExpr
2501 super AExpr
2502
2503 # The string token
2504 var n_string: Token is writable, noinit
2505 end
2506
2507 # A simple string. eg. `"abc"`
2508 class AStringExpr
2509 super AStringFormExpr
2510 end
2511
2512 # The start of a superstring. eg `"abc{`
2513 class AStartStringExpr
2514 super AStringFormExpr
2515 end
2516
2517 # The middle of a superstring. eg `}abc{`
2518 class AMidStringExpr
2519 super AStringFormExpr
2520 end
2521
2522 # The end of a superstrng. eg `}abc"`
2523 class AEndStringExpr
2524 super AStringFormExpr
2525 end
2526
2527 # A superstring literal. eg `"a{x}b{y}c"`
2528 # Each part is modeled a sequence of expression. eg. `["a{, x, }b{, y, }c"]`
2529 class ASuperstringExpr
2530 super AExpr
2531
2532 # The list of the expressions of the superstring
2533 var n_exprs = new ANodes[AExpr](self)
2534 end
2535
2536 # A simple parenthesis. eg `(x)`
2537 class AParExpr
2538 super AExpr
2539
2540 # The opening parenthesis
2541 var n_opar: TOpar is writable, noinit
2542
2543 # The inner expression
2544 var n_expr: AExpr is writable, noinit
2545
2546 # The closing parenthesis
2547 var n_cpar: TCpar is writable, noinit
2548 end
2549
2550 # A cast, against a type or `not null`
2551 class AAsCastForm
2552 super AExpr
2553
2554 # The expression to cast
2555 var n_expr: AExpr is writable, noinit
2556
2557 # The `as` keyword
2558 var n_kwas: TKwas is writable, noinit
2559
2560 # The opening parenthesis
2561 var n_opar: nullable TOpar = null is writable
2562
2563 # The closing parenthesis
2564 var n_cpar: nullable TCpar = null is writable
2565 end
2566
2567 # A type cast. eg `x.as(T)`
2568 class AAsCastExpr
2569 super AAsCastForm
2570
2571 # The target type to cast to
2572 var n_type: AType is writable, noinit
2573 end
2574
2575 # A as-not-null cast. eg `x.as(not null)`
2576 class AAsNotnullExpr
2577 super AAsCastForm
2578
2579 # The `not` keyword
2580 var n_kwnot: TKwnot is writable, noinit
2581
2582 # The `null` keyword
2583 var n_kwnull: TKwnull is writable, noinit
2584 end
2585
2586 # A is-set check of old-style attributes. eg `isset x._a`
2587 class AIssetAttrExpr
2588 super AAttrFormExpr
2589
2590 # The `isset` keyword
2591 var n_kwisset: TKwisset is writable, noinit
2592 end
2593
2594 # An ellipsis notation used to pass an expression as it, in a vararg parameter
2595 class AVarargExpr
2596 super AExpr
2597
2598 # The passed expression
2599 var n_expr: AExpr is writable, noinit
2600
2601 # The `...` symbol
2602 var n_dotdotdot: TDotdotdot is writable, noinit
2603 end
2604
2605 # An named notation used to pass an expression by name in a parameter
2606 class ANamedargExpr
2607 super AExpr
2608
2609 # The name of the argument
2610 var n_id: TId is writable, noinit
2611
2612 # The `=` synbol
2613 var n_assign: TAssign is writable, noinit
2614
2615 # The passed expression
2616 var n_expr: AExpr is writable, noinit
2617 end
2618
2619 # A list of expression separated with commas (arguments for instance)
2620 class AManyExpr
2621 super AExpr
2622
2623 # The list of expressions
2624 var n_exprs = new ANodes[AExpr](self)
2625 end
2626
2627 # A special expression that encapsulates a static type
2628 # Can only be found in special construction like arguments of annotations.
2629 class ATypeExpr
2630 super AExpr
2631
2632 # The encapsulated type
2633 var n_type: AType is writable, noinit
2634 end
2635
2636 # A special expression that encapsulates a method identifier
2637 # Can only be found in special construction like arguments of annotations.
2638 class AMethidExpr
2639 super AExpr
2640
2641 # The receiver
2642 var n_expr: AExpr is writable, noinit
2643
2644 # The encapsulated method identifier
2645 var n_id: AMethid is writable, noinit
2646 end
2647
2648 # A special expression that encapsulate an annotation
2649 # Can only be found in special construction like arguments of annotations.
2650 #
2651 # The encapsulated annotations are in `n_annotations`
2652 class AAtExpr
2653 super AExpr
2654 end
2655
2656 # A special expression to debug types
2657 class ADebugTypeExpr
2658 super AExpr
2659
2660 # The `debug` keyword
2661 var n_kwdebug: TKwdebug is writable, noinit
2662
2663 # The `type` keyword
2664 var n_kwtype: TKwtype is writable, noinit
2665
2666 # The expression to check
2667 var n_expr: AExpr is writable, noinit
2668
2669 # The type to check
2670 var n_type: AType is writable, noinit
2671 end
2672
2673 # A list of expression separated with commas (arguments for instance)
2674 abstract class AExprs
2675 super Prod
2676
2677 # The list of expressions
2678 var n_exprs = new ANodes[AExpr](self)
2679 end
2680
2681 # A simple list of expressions
2682 class AListExprs
2683 super AExprs
2684 end
2685
2686 # A list of expressions enclosed in parentheses
2687 class AParExprs
2688 super AExprs
2689
2690 # The opening parenthesis
2691 var n_opar: TOpar is writable, noinit
2692
2693 # The closing parenthesis
2694 var n_cpar: TCpar is writable, noinit
2695 end
2696
2697 # A list of expressions enclosed in brackets
2698 class ABraExprs
2699 super AExprs
2700
2701 # The opening bracket
2702 var n_obra: TObra is writable, noinit
2703
2704 # The closing bracket
2705 var n_cbra: TCbra is writable, noinit
2706 end
2707
2708 # A complex assignment operator. (`+=` and `-=`)
2709 abstract class AAssignOp
2710 super Prod
2711
2712 # The combined assignment operator
2713 var n_op: Token is writable, noinit
2714
2715 # The name of the operator without the `=` (eg '+')
2716 fun operator: String is abstract
2717 end
2718
2719 # A `+=` assignment operation
2720 class APlusAssignOp
2721 super AAssignOp
2722
2723 redef fun operator do return "+"
2724 end
2725
2726 # A `-=` assignment operation
2727 class AMinusAssignOp
2728 super AAssignOp
2729
2730 redef fun operator do return "-"
2731 end
2732
2733 # A `*=` assignment operation
2734 class AStarAssignOp
2735 super AAssignOp
2736
2737 redef fun operator do return "*"
2738 end
2739
2740 # A `/=` assignment operation
2741 class ASlashAssignOp
2742 super AAssignOp
2743
2744 redef fun operator do return "/"
2745 end
2746
2747 # A `%=` assignment operation
2748 class APercentAssignOp
2749 super AAssignOp
2750
2751 redef fun operator do return "%"
2752 end
2753
2754 # A `**=` assignment operation
2755 class AStarstarAssignOp
2756 super AAssignOp
2757
2758 redef fun operator do return "**"
2759 end
2760
2761 # A `|=` assignment operation
2762 class APipeAssignOp
2763 super AAssignOp
2764
2765 redef fun operator do return "|"
2766 end
2767
2768 # A `^=` assignment operation
2769 class ACaretAssignOp
2770 super AAssignOp
2771
2772 redef fun operator do return "^"
2773 end
2774
2775 # A `&=` assignment operation
2776 class AAmpAssignOp
2777 super AAssignOp
2778
2779 redef fun operator do return "&"
2780 end
2781
2782 # A `<<=` assignment operation
2783 class ALlAssignOp
2784 super AAssignOp
2785
2786 redef fun operator do return "<<"
2787 end
2788
2789 # A `>>=` assignment operation
2790 class AGgAssignOp
2791 super AAssignOp
2792
2793 redef fun operator do return ">>"
2794 end
2795
2796 # A possibly fully-qualified module identifier
2797 class AModuleName
2798 super Prod
2799
2800 # The starting quad (`::`)
2801 var n_quad: nullable TQuad = null is writable
2802
2803 # The list of quad-separated project/group identifiers
2804 var n_path = new ANodes[TId](self)
2805
2806 # The final module identifier
2807 var n_id: TId is writable, noinit
2808 end
2809
2810 # A language declaration for an extern block
2811 class AInLanguage
2812 super Prod
2813
2814 # The `in` keyword
2815 var n_kwin: TKwin is writable, noinit
2816
2817 # The language name
2818 var n_string: TString is writable, noinit
2819 end
2820
2821 # An full extern block
2822 class AExternCodeBlock
2823 super Prod
2824
2825 # The language declration
2826 var n_in_language: nullable AInLanguage = null is writable
2827
2828 # The block of extern code
2829 var n_extern_code_segment: TExternCodeSegment is writable, noinit
2830 end
2831
2832 # A possible full method qualifier.
2833 class AQualified
2834 super Prod
2835
2836 # The starting quad (`::`)
2837 var n_quad: nullable TQuad = null is writable
2838
2839 # The list of quad-separated project/group/module identifiers
2840 var n_id = new ANodes[TId](self)
2841
2842 # A class identifier
2843 var n_classid: nullable TClassid = null is writable
2844 end
2845
2846 # A documentation of a definition
2847 # It contains the block of comments just above the declaration
2848 class ADoc
2849 super Prod
2850
2851 # A list of lines of comment
2852 var n_comment = new ANodes[TComment](self)
2853 end
2854
2855 # A group of annotation on a node
2856 #
2857 # This same class is used for the 3 kind of annotations:
2858 #
2859 # * *is* annotations. eg `module foo is bar`.
2860 # * *at* annotations. eg `foo@bar` or `foo@(bar,baz)`.
2861 # * *class* annotations, defined in classes.
2862 class AAnnotations
2863 super Prod
2864
2865 # The `is` keyword, for *is* annotations
2866 var n_kwis: nullable TKwis = null is writable
2867
2868 # The `@` symbol, for *at* annotations
2869 var n_at: nullable TAt = null is writable
2870
2871 # The opening parenthesis in *at* annotations
2872 var n_opar: nullable TOpar = null is writable
2873
2874 # The list of annotations
2875 var n_items = new ANodes[AAnnotation](self)
2876
2877 # The closing parenthesis in *at* annotations
2878 var n_cpar: nullable TCpar = null is writable
2879
2880 # The `end` keyword, for *is* annotations
2881 var n_kwend: nullable TKwend = null is writable
2882 end
2883
2884 # A single annotation
2885 class AAnnotation
2886 super ADefinition
2887
2888 # The name of the annotation
2889 var n_atid: AAtid is writable, noinit
2890
2891 # The opening parenthesis of the arguments
2892 var n_opar: nullable TOpar = null is writable
2893
2894 # The list of arguments
2895 var n_args = new ANodes[AExpr](self)
2896
2897 # The closing parenthesis
2898 var n_cpar: nullable TCpar = null is writable
2899
2900 # The name of the annotation
2901 fun name: String
2902 do
2903 return n_atid.n_id.text
2904 end
2905 end
2906
2907 # An annotation name
2908 abstract class AAtid
2909 super Prod
2910
2911 # The identifier of the annotation.
2912 # Can be a TId of a keyword
2913 var n_id: Token is writable, noinit
2914 end
2915
2916 # An annotation name based on an identifier
2917 class AIdAtid
2918 super AAtid
2919 end
2920
2921 # An annotation name based on the keyword `extern`
2922 class AKwexternAtid
2923 super AAtid
2924 end
2925
2926 # An annotation name based on the keyword `import`
2927 class AKwimportAtid
2928 super AAtid
2929 end
2930
2931 # An annotation name based on the keyword `abstract`
2932 class AKwabstractAtid
2933 super AAtid
2934 end
2935
2936 # The root of the AST
2937 class Start
2938 super Prod
2939
2940 # The main module
2941 var n_base: nullable AModule is writable
2942
2943 # The end of file (or error) token
2944 var n_eof: EOF is writable
2945 end