From 1f10720c6e3aaf557469348c49e6bed190617684 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 9 Apr 2014 11:05:02 -0400 Subject: [PATCH] parser: clean and factorize services in parser_prod Mainly, generalize cloned services in the class ANodes Also rationalize the generated nit code. The diff seems big because some reindentation Signed-off-by: Jean Privat --- src/parser/Makefile | 2 +- src/parser/parser_nodes.nit | 34 +++++++++++++++ src/parser/xss/prods.xss | 101 +++++++++++++++---------------------------- 3 files changed, 69 insertions(+), 68 deletions(-) diff --git a/src/parser/Makefile b/src/parser/Makefile index e7d1fa8..23d31c6 100644 --- a/src/parser/Makefile +++ b/src/parser/Makefile @@ -29,7 +29,7 @@ parser.nit: .nit.sablecc3 xss/*.xss ${SABLECC3ALTGEN} -c .nit.sablecc3.dump -t xss/main.xss -p usermodule parser_nodes .nit.sablecc3 mv -f -- parser.nit .parser-nofact.nit ./fact_parser.pl .parser-nofact.nit > parser.nit - perl -np -i.orig -e 's/([ \[])P([A-Z])/\1A\2/g;' -e 's/"{"/"\\{"/g;' parser.nit parser_abs.nit parser_prod.nit lexer.nit + perl -np -i.orig -e 's/([ (\[])P([A-Z])/\1A\2/g;' -e 's/"{"/"\\{"/g;' parser.nit parser_abs.nit parser_prod.nit lexer.nit clean: rm -f -- .nit.sablecc3 .nit.sablecc3.dump .parser-nofact.nit || true diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index 295aaf2..fbd2f77 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -132,6 +132,40 @@ class ANodes[E: ANode] assert e.parent == parent e.parent = null end + + # Used in parent contructor to fill elements + private fun unsafe_add_all(nodes: Collection[Object]) + do + var parent = self.parent + for n in nodes do + assert n isa E + add n + n.parent = parent + end + end + + private fun replace_child(old_child: ANode, new_child: nullable ANode): Bool + do + var parent = self.parent + for i in [0..length[ do + if self[i] == old_child then + if new_child != null then + assert new_child isa E + self[i] = new_child + new_child.parent = parent + else + self.remove_at(i) + end + return true + end + end + return false + end + + private fun visit_all(v: Visitor) + do + for n in self do v.enter_visit(n) + end end # Ancestor of all tokens diff --git a/src/parser/xss/prods.xss b/src/parser/xss/prods.xss index a1d34a1..8a5edcb 100644 --- a/src/parser/xss/prods.xss +++ b/src/parser/xss/prods.xss @@ -58,115 +58,82 @@ $ template make_prods() $ set baseprod = {//prod/@ename} $ foreach {//alt} redef class @ename - private init empty_init do 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 + empty_init $ foreach {elem} $ if @is_list - for n in n_@{name} do - assert n isa @{etype} - _n_@{name}.add(n) - n.parent = self - end + _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 fun 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 $ foreach {elem} $ if @is_list $ else - redef fun n_@{name}=(node) - do - _n_@{name} = node + redef fun n_@{name}=(node) + do + _n_@{name} = node $ if @modifier - if node != null then - node.parent = self - end + if node != null then node.parent = self $ else - node.parent = self + node.parent = self $ end - end + end $ end $ end foreach - redef fun visit_all(v: Visitor) - do + redef fun visit_all(v: Visitor) + do $ foreach {elem} $ if @is_list - for n in _n_@{name} do - v.enter_visit(n) - end + _n_@{name}.visit_all(v) $ else -$ if @modifier - if _n_@{name} != null then - v.enter_visit(_n_@{name}.as(not null)) - end -$ else - v.enter_visit(_n_@{name}) -$ end + v.enter_visit(_n_@{name}) $ end $ end foreach - end + end end $ end foreach -- 1.7.9.5