/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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; /* * AddProdTransformAndAltTransform * * This class provide the second part of the support by SableCC3.x.x * for SableCC2.x.x grammars. * Its role is to add Productions and Alternatives transformations within * Productions section. * Assuming this is run after the eventual AddAstProductions it also add * default transformations to productions and alternatives which have not * not specified them. */ @SuppressWarnings({"rawtypes", "unchecked"}) public class AddProdTransformAndAltTransform extends DepthFirstAdapter { private String currentProdId; // private String currentAlt; @Override public void inAProd(final AProd production) { currentProdId = production.getId().getText(); if (production.getArrow() == null) { AElem elem = new AElem(null, new AProductionSpecifier(), new TId(currentProdId), null); LinkedList listOfProdTransformElem = new LinkedList(); listOfProdTransformElem.add(elem); production.setProdTransform(listOfProdTransformElem); production.setArrow(new TArrow()); } } private int i; private LinkedList list; @Override public void inAAlt(AAlt alt) { if (alt.getAltTransform() == null) { // currentAlt = currentProdId; list = new LinkedList(); AProdName aProdName = new AProdName(new TId(currentProdId), null); if (alt.getAltName() != null) { aProdName.setProdNameTail(new TId(alt.getAltName().getText())); } if (alt.getElems().size() > 0) { Object temp[] = alt.getElems().toArray(); for (i = 0; i < temp.length; i++) { ((PElem) temp[i]).apply(new DepthFirstAdapter() { @Override public void caseAElem(AElem elem) { PTerm term; String termId; boolean elemNameExplicitelySpecified = false; if (elem.getElemName() != null) { termId = elem.getElemName().getText(); elemNameExplicitelySpecified = true; } else { termId = elem.getId().getText(); } if ((elem.getUnOp() != null) && ((elem.getUnOp() instanceof AStarUnOp) || (elem.getUnOp() instanceof APlusUnOp))) { LinkedList listP = new LinkedList(); if (!elemNameExplicitelySpecified && (elem.getSpecifier() != null)) { if (elem.getSpecifier() instanceof ATokenSpecifier) { listP.add(new ASimpleListTerm(new ATokenSpecifier(), new TId(termId), null)); term = new AListTerm(new TLBkt(), listP); } else { listP.add(new ASimpleListTerm(new AProductionSpecifier(), new TId(termId), null)); term = new AListTerm(new TLBkt(), listP); } } else { listP.add(new ASimpleListTerm(null, new TId(termId), null)); term = new AListTerm(new TLBkt(), listP); } } else { if (!elemNameExplicitelySpecified && (elem.getSpecifier() != null)) { if (elem.getSpecifier() instanceof ATokenSpecifier) { term = new ASimpleTerm(new ATokenSpecifier(), new TId(termId), null); } else { term = new ASimpleTerm(new AProductionSpecifier(), new TId(termId), null); } } else { term = new ASimpleTerm(null, new TId(termId), null); } } list.add(term); } } ); } } ANewTerm newTerm = new ANewTerm(aProdName, new TLPar(), list); LinkedList lst = new LinkedList(); lst.add(newTerm); alt.setAltTransform(new AAltTransform(new TLBrace(), lst, new TRBrace())); } } }