/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package org.sablecc.sablecc; import org.sablecc.sablecc.analysis.*; import org.sablecc.sablecc.node.*; import java.util.LinkedList; import java.util.Map; @SuppressWarnings({"rawtypes", "unchecked"}) public class In_Production { private String name; private String[] prodTransformElems; private int nbAlts; private In_Alternative[] alternatives; public In_Production(AProd prod) { setName(prod.getId().getText()); AElem[] prodTransforms = (AElem[]) prod.getProdTransform().toArray(new AElem[0]); prodTransformElems = new String[prodTransforms.length]; for (int i = 0; i < prodTransforms.length; i++) { if (prodTransforms[i].getElemName() != null) { prodTransformElems[i] = prodTransforms[i].getElemName().getText(); } else { prodTransformElems[i] = prodTransforms[i].getId().getText(); } } if (prodTransforms.length == 0) { prodTransformElems = new String[1]; prodTransformElems[0] = new String(" "); } AAlt[] alts = (AAlt[]) prod.getAlts().toArray(new AAlt[0]); alternatives = new In_Alternative[alts.length]; for (int i = 0; i < alts.length; i++) { addAlternative(i, new In_Alternative(alts[i], prodTransformElems, name)); } nbAlts = alts.length; } public void setName(String name) { this.name = name; } public String getName() { return name; } public int getNbAlts() { return nbAlts; } public void addAlternative(int position, In_Alternative alt) { alternatives[position] = alt; } public In_Alternative getAlternative(int position) { return alternatives[position]; } class In_Alternative { String name; int nbElems; AElem[] elements; Map prodTransform_altTransform; In_Alternative(AAlt alt, String[] prodTransformElems, String prodName) { setName(alt.getAltName() != null ? alt.getAltName().getText() : ""); elements = new AElem[alt.getElems().size()]; AElem[] listOfElems = (AElem[]) alt.getElems().toArray(new AElem[0]); final String newElemName = (name.equals("") ? prodName : prodName + "#" + name); for (int i = 0; i < listOfElems.length; i++) { AElem tmpElem = (AElem) listOfElems[i].clone(); if (tmpElem.getElemName() != null) { tmpElem.setElemName(new TId(newElemName + "#" + tmpElem.getElemName().getText())); } else { tmpElem.setElemName(new TId(newElemName + "#" + tmpElem.getId().getText())); } addElem(i, tmpElem); } nbElems = listOfElems.length; prodTransform_altTransform = new TypedHashMap(prodTransformElems.length, StringCast.instance, NodeCast.instance); LinkedList list = ((AAltTransform) alt.getAltTransform()).getTerms(); for (int i = 0; i < list.size(); i++) { PTerm tmpTerm = (PTerm) list.get(i); tmpTerm.apply(new DepthFirstAdapter() { @Override public void caseASimpleListTerm(ASimpleListTerm node) { node.setId(new TId(newElemName + "#" + node.getId().getText(), node.getId().getLine(), node.getId().getPos())); } @Override public void caseASimpleTerm(ASimpleTerm node) { node.setId(new TId(newElemName + "#" + node.getId().getText(), node.getId().getLine(), node.getId().getPos())); } } ); prodTransform_altTransform.put(prodTransformElems[i], tmpTerm); } } void setName(String name) { this.name = name; } String getName() { return name; } int getNbElems() { return nbElems; } Map getProdTransform_AlTransformMap() { return prodTransform_altTransform; } void addElem(int position, AElem elem) { elements[position] = elem; } AElem[] getElems() { return elements; } } }