/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableCC. * * See the file "LICENSE" for copyright information and the * * terms and conditions for copying, distribution and * * modification of SableCC. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * Last Modification date :: 04-February-2004 * Add termtail to simple term and simple listterm * in order to support scripting generation for parser by * the new scripting engine. * * Fix bug related to code generation. * Method #public void caseASimpleTerm(ASimpleTerm node)# * and #public void caseASimpleTerm(ASimpleTerm node)# * were rewrite. The type of simpleTerm was the problem. */ package org.sablecc.sablecc; import org.sablecc.sablecc.analysis.*; import org.sablecc.sablecc.node.*; import java.util.Map; @SuppressWarnings({"rawtypes", "unchecked"}) public class ComputeCGNomenclature extends DepthFirstAdapter { private String currentProd; private String currentAlt; private int counter; private ResolveIds ids; private ResolveProdTransformIds prodTransformIds; private Map altElemTypes; private final Map altTransformElemTypes = new TypedHashMap( NodeCast.instance, StringCast.instance); private final Map termNumbers = new TypedHashMap(NodeCast.instance, IntegerCast.instance); public ComputeCGNomenclature(ResolveIds ids, ResolveProdTransformIds prodTransformIds) { this.ids = ids; this.prodTransformIds = prodTransformIds; } public void setAltElemTypes(Map aMap) { this.altElemTypes = aMap; } public Map getAltTransformElemTypes() { return altTransformElemTypes; } public Map getTermNumbers() { return termNumbers; } @Override public void caseAProd(final AProd production) { currentProd = "P" + ResolveIds.name(production.getId().getText()); Object[] temp = production.getAlts().toArray(); for (int i = 0; i < temp.length; i++) { ((PAlt) temp[i]).apply(this); } } @Override public void inAAlt(AAlt nodeAlt) { counter = 0; if (nodeAlt.getAltName() != null) { currentAlt = "A" + ResolveIds.name(nodeAlt.getAltName().getText()) + currentProd.substring(1); } else { currentAlt = "A" + currentProd.substring(1); } counter = 0; } @Override public void caseAAst(AAst node) { } @Override public void inAElem(AElem node) { String elemType = (String) ids.elemTypes.get(node); if (node.getElemName() != null) { ids.altsElemNameTypes.put(currentAlt + "." + node.getElemName().getText(), elemType); } } @Override public void inANewTerm(ANewTerm node) { AProdName aProdName = (AProdName) node.getProdName(); String type = "P" + ResolveIds.name(aProdName.getId().getText()); altTransformElemTypes.put(node, type); termNumbers.put(node, new Integer(++counter)); } @Override public void inANewListTerm(ANewListTerm node) { AProdName aProdName = (AProdName) node.getProdName(); String type = "P" + ResolveIds.name(aProdName.getId().getText()); altTransformElemTypes.put(node, type); termNumbers.put(node, new Integer(++counter)); } @Override public void outAListTerm(AListTerm node) { if (node.getListTerms().size() > 0) { Object[] temp = node.getListTerms().toArray(); String firstTermType = (String) altTransformElemTypes.get(temp[0]); if (firstTermType != null) { if (!firstTermType.startsWith("L")) { altTransformElemTypes.put(node, "L" + firstTermType); } else { altTransformElemTypes.put(node, firstTermType); } } } else { altTransformElemTypes.put(node, "Lnull"); } termNumbers.put(node, new Integer(++counter)); } @Override public void caseASimpleTerm(ASimpleTerm node) { String name; String elemType = (String) this.altElemTypes.get(currentAlt + "." + node.getId().getText()); if (node.getSimpleTermTail() == null) { name = elemType; if (name.startsWith("P")) { //add termtail to the simpleterm node.setSimpleTermTail((TId) node.getId().clone()); } } else { String termTail = node.getSimpleTermTail().getText(); name = (String) prodTransformIds.prodTransformElemTypesString.get(elemType + "." + termTail); } if (name.endsWith("?")) { name = name.substring(0, name.length() - 1); } altTransformElemTypes.put(node, name); termNumbers.put(node, new Integer(++counter)); } /* public void caseASimpleTerm(ASimpleTerm node) { String name; String elemType = (String)altElemTypes.get( currentAlt+"."+node.getId().getText() ); if( ( (elemType != null) && elemType.startsWith("T") ) || ( (elemType == null) && ids.tokens.get("T" + ids.name(node.getId().getText())) != null ) ) { if(elemType != null) { name = elemType; } else { name = "T" + ids.name(node.getId().getText()); } } else { if(node.getSimpleTermTail() == null) { if(elemType != null) { name = elemType; } else { name = "P" + ids.name(node.getId().getText()); } //add termtail to the simpleterm node.setSimpleTermTail( (TId)node.getId().clone() ); } else { String prodType; if(elemType != null) { prodType = elemType; } else { prodType = "P" + ids.name(node.getId().getText()); } String termTail = node.getSimpleTermTail().getText(); name = (String)prodTransformIds.prodTransformElemTypesString.get(prodType+"."+termTail); } } if(name.endsWith("?")) { name = name.substring(0, name.length()-1); } altTransformElemTypes.put(node, name); termNumbers.put(node, new Integer(++counter)); } */ @Override public void caseANullTerm(ANullTerm node) { altTransformElemTypes.put(node, "null"); termNumbers.put(node, new Integer(++counter)); } @Override public void caseASimpleListTerm(ASimpleListTerm node) { String name; String elemType = (String) altElemTypes.get(currentAlt + "." + node.getId().getText()); if (node.getSimpleTermTail() == null) { name = elemType; if (name.startsWith("P")) { //add termtail to the simpleterm node.setSimpleTermTail((TId) node.getId().clone()); } } else { String termTail = node.getSimpleTermTail().getText(); name = (String) prodTransformIds.prodTransformElemTypesString.get(elemType + "." + termTail); } if (name.endsWith("?")) { name = name.substring(0, name.length() - 1); } altTransformElemTypes.put(node, name); termNumbers.put(node, new Integer(++counter)); } /* public void caseASimpleListTerm(ASimpleListTerm node) { String name; String elemType = (String)altElemTypes.get( currentAlt+"."+node.getId().getText() ); if( ( (elemType != null) && elemType.startsWith("T") ) || ( (elemType == null) && ids.tokens.get("T" + ids.name(node.getId().getText())) != null ) ) { if(elemType != null) { name = elemType; } else { name = "T" + ids.name(node.getId().getText()); } } //it seems to be a production without a specifier else { if(node.getSimpleTermTail() == null) { if(elemType != null) { name = elemType; } else { name = "P" + ids.name(node.getId().getText()); } //add termtail to the simpleterm node.setSimpleTermTail( (TId)node.getId().clone() ); } else { String prodType; if(elemType != null) { prodType = elemType; } else { prodType = "P" + ids.name(node.getId().getText()); } String termTail = node.getSimpleTermTail().getText(); name = (String)prodTransformIds.prodTransformElemTypesString.get(prodType+"."+termTail); } } if(name.endsWith("?")) { name = name.substring(0, name.length()-1); } altTransformElemTypes.put(node, name); termNumbers.put(node, new Integer(++counter)); } */ }