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