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