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