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