-/* 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] = new List[@etype]
+ var n_@name: List[@etype] = new List[@etype]
$ else
$ if @modifier
- readable writable attr _n_@name: nullable @etype = null
+ var n_@name: nullable @etype = null is writable
$ else
- readable writable attr _n_@name: @etype
+ var n_@name: @etype is writable, noinit
$ end
$ end
$ end
$ end
class Start
-special Prod
- readable writable attr _n_base: nullable $baseprod
- readable writable attr _n_eof: EOF
+ super Prod
+ var n_base: nullable $baseprod is writable, noinit
+ var n_eof: EOF is writable, noinit
+ init(
+ n_base: nullable $baseprod,
+ n_eof: EOF)
+ do
+ _n_base = n_base
+ _n_eof = n_eof
+ end
end
$ end template
$ set baseprod = {//prod/@ename}
$ foreach {//alt}
redef class @ename
-$ foreach {elem}
-$ if @is_list
-$ else
- redef meth n_@name=(n)
- do
- _n_@name = n
-$ if @modifier
- if n != null then
- n.parent = self
- end
-$ else
- n.parent = self
-$ end
- end
-$ end
-$ end
-
- private init empty_init do end
-
$ if {count(elem)!=0}
- init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
+ init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
$ foreach {elem}
$ if {@is_list}
- n_@{name}: Collection[Object] [-sep ','-] # Should be Collection[@etype]
+ n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
$ else
- n_@{name}: nullable @etype [-sep ','-]
+ n_@{name}: nullable @etype[-sep ','-]
$ end
$ end
- )
+ )
$ else
- init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
+ init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
$ end
- do
- empty_init
+ do
$ foreach {elem}
$ if @is_list
- for n in n_@{name} do
- assert n isa @{etype}
- _n_@{name}.add(n)
- n.parent = self
- end
+ self.n_@{name}.unsafe_add_all(n_@{name})
$ else
$ if {@modifier}
- _n_@name = n_@{name}
- if n_@{name} != null then
- n_@{name}.parent = self
- end
+ _n_@name = n_@{name}
+ if n_@{name} != null then n_@{name}.parent = self
$ else
- _n_@name = n_@{name}.as(not null)
- n_@{name}.parent = self
+ _n_@name = n_@{name}.as(not null)
+ n_@{name}.parent = self
$ end
$ end
$ end
- end
+ end
- redef meth replace_child(old_child: PNode, new_child: nullable PNode)
- do
+ redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+ do
$ foreach {elem}
$ if @is_list
- for i in [0.._n_@{name}.length[ do
- if _n_@{name}[i] == old_child then
- if new_child != null then
- assert new_child isa @etype
- _n_@{name}[i] = new_child
- new_child.parent = self
- else
- _n_@{name}.remove_at(i)
- end
- return
- end
- end
+ if n_@{name}.replace_child(old_child, new_child) then return
$ else
- if _n_@{name} == old_child then
- if new_child != null then
- new_child.parent = self
- assert new_child isa @etype
- _n_@{name} = new_child
- else
+ if _n_@{name} == old_child then
$ if @modifier
- _n_@{name} = null
+ n_@{name} = new_child.as(nullable @etype)
$ else
- abort
+ n_@{name} = new_child.as(@etype)
$ end
- end
- return
- end
+ return
+ end
$ end
$ end foreach
- end
+ end
- redef meth visit_all(v: Visitor)
- do
$ foreach {elem}
$ if @is_list
- for n in _n_@{name} do
- v.visit(n)
- end
$ else
+ redef fun n_@{name}=(node)
+ do
+ _n_@{name} = node
$ if @modifier
- if _n_@{name} != null then
- v.visit(_n_@{name}.as(not null))
- end
+ if node != null then node.parent = self
$ else
- v.visit(_n_@{name})
+ node.parent = self
$ end
+ end
$ end
$ end foreach
- end
- redef meth visit_all_reverse(v: Visitor)
- do
+
+ redef fun visit_all(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
- end
- end
+ n_@{name}.visit_all(v)
$ else
-$ if @modifier
- if _n_@{name} != null then
- v.visit(_n_@{name}.as(not null))
- end
-$ else
- v.visit(_n_@{name})
-$ end
+ v.enter_visit(_n_@{name})
$ end
$ end foreach
- end
+ end
end
$ end foreach
redef class Start
- init(
- 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: nullable PNode)
+ redef fun replace_child(old_child: PNode, new_child: nullable PNode)
do
if _n_base == old_child then
if new_child == null then
end
end
- redef meth visit_all(v: Visitor)
- do
- if _n_base != null then
- v.visit(_n_base.as(not null))
- 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.as(not null))
+ v.enter_visit(_n_base.as(not null))
end
+ v.enter_visit(_n_eof)
end
end
$ end template