metamodel: rename 'universal' to 'enum'
[nit.git] / src / parser / xss / prods.xss
index c6ebc43..9f2b330 100644 (file)
@@ -1,45 +1,48 @@
-/* This file is part of NIT ( http://www.nitlanguage.org ).
- *
- * Copyright 2008 Jean Privat <jean@pryen.org>
- * Based on algorithms developped for ( http://www.sablecc.org/ ).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+$ // This file is part of NIT ( http://www.nitlanguage.org ).
+$ //
+$ // Copyright 2008 Jean Privat <jean@pryen.org>
+$ // Based on algorithms developped for ( http://www.sablecc.org/ ).
+$ //
+$ // Licensed under the Apache License, Version 2.0 (the "License");
+$ // you may not use this file except in compliance with the License.
+$ // You may obtain a copy of the License at
+$ //
+$ //     http://www.apache.org/licenses/LICENSE-2.0
+$ //
+$ // Unless required by applicable law or agreed to in writing, software
+$ // distributed under the License is distributed on an "AS IS" BASIS,
+$ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+$ // See the License for the specific language governing permissions and
+$ // limitations under the License.
 
 $ template make_abs_prods()
 $ set baseprod = {//prod/@ename}
 
 $ foreach {//prod}
-class @ename special Prod end
+class @ename super Prod end
 $ end
 
 $ foreach {//alt}
 class @ename
-special ${../@ename}
+       super ${../@ename}
 $ foreach {elem}
 $   if @is_list
-    readable writable attr _n_@name: List[@etype] = null
+    readable var _n_@name: List[@etype] = new List[@etype]
 $   else
-    readable writable attr _n_@name: @etype = null
+$   if @modifier
+    readable var _n_@name: nullable @etype = null
+$   else
+    readable var _n_@name: @etype
+$   end
 $   end
 $ end
 end
 $ end
 
 class Start
-special Prod
-    readable writable attr _n_base: $baseprod 
-    readable writable attr _n_eof: EOF 
+       super Prod
+    readable var _n_base: nullable $baseprod
+    readable var _n_eof: EOF
 end
 $ end template
 
@@ -47,28 +50,15 @@ $ template make_prods()
 $ set baseprod = {//prod/@ename}
 $ foreach {//alt}
 redef class @ename
-$ foreach {elem}
-$   if @is_list
-$   else
-    redef meth n_@name=(n: @etype)
-    do
-        _n_@name = n
-        if n != null then
-           n.parent = self
-        end
-    end
-$   end
-$ end
-
     private init empty_init do end
 
 $ if {count(elem)!=0}
     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
 $ foreach {elem}
 $   if {@is_list}
-            n_@{name}: Array[Object] [-sep ','-] # Should be Array[@etype]
+            n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
 $   else
-            n_@{name}: @etype [-sep ','-]
+            n_@{name}: nullable @etype[-sep ','-]
 $   end
 $ end
     )
@@ -79,24 +69,27 @@ $ end
         empty_init
 $ foreach {elem}
 $   if @is_list
-        _n_@{name} = new List[@{etype}]
        for n in n_@{name} do
                assert n isa @{etype}
                _n_@{name}.add(n)
                n.parent = self
        end
 $   else
+$   if {@modifier}
         _n_@name = n_@{name}
        if n_@{name} != null then
                n_@{name}.parent = self
        end
+$   else
+        _n_@name = n_@{name}.as(not null)
+       n_@{name}.parent = self
+$   end
 $   end
 $ end
     end
 
-    redef meth replace_child(old_child: PNode, new_child: PNode)
+    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
     do
-        assert old_child != null
 $ foreach {elem}
 $   if @is_list
         for i in [0.._n_@{name}.length[ do
@@ -118,7 +111,11 @@ $   else
                assert new_child isa @etype
                 _n_@{name} = new_child
            else
+$   if @modifier
                _n_@{name} = null
+$   else
+               abort
+$   end
             end
             return
        end
@@ -126,36 +123,21 @@ $   end
 $ end foreach
     end
 
-    redef meth visit_all(v: Visitor)
+    redef fun visit_all(v: Visitor)
     do
 $   foreach {elem}
 $     if @is_list
             for n in _n_@{name} do
-                v.visit(n)
-           end
-$     else
-        if _n_@{name} != null then
-            v.visit(_n_@{name})
-        end
-$     end
-$   end foreach
-    end
-
-    redef meth visit_all_reverse(v: Visitor)
-    do
-$   foreach {elem}
-$     if @is_list
-       do
-           var i = _n_@{name}.length
-            while i >= 0 do
-                v.visit(_n_@{name}[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
 $     else
+$       if @modifier
         if _n_@{name} != null then
-            v.visit(_n_@{name})
+            v.enter_visit(_n_@{name}.as(not null))
         end
+$       else
+        v.enter_visit(_n_@{name})
+$       end
 $     end
 $   end foreach
     end
@@ -164,16 +146,15 @@ $ end foreach
 
 redef class Start
     init(
-        n_base: $baseprod,
+        n_base: nullable $baseprod,
         n_eof: EOF)
     do
         _n_base = n_base
         _n_eof = n_eof
     end
 
-    redef meth replace_child(old_child: PNode, new_child: PNode)
+    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
     do
-        assert old_child != null
         if _n_base == old_child then
             if new_child == null then
             else
@@ -186,18 +167,12 @@ redef class Start
        end
     end
 
-    redef meth visit_all(v: Visitor)
-    do
-        if _n_base != null then
-            v.visit(_n_base)
-        end
-    end
-
-    redef meth visit_all_reverse(v: Visitor)
+    redef fun visit_all(v: Visitor)
     do
         if _n_base != null then
-            v.visit(_n_base)
+            v.enter_visit(_n_base.as(not null))
         end
+       v.enter_visit(_n_eof)
     end
 end
 $ end template