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