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