/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 AltTransformAdapter extends DepthFirstAdapter {
ResolveAltIds altIds;
String currentNewAltName;
private Map isElementIsAlist;
private LinkedList listSimpleTermTransform;
private Map simpleTermTransform;
private Map simpleTermOrsimpleListTermTypes;
AltTransformAdapter(Map simpleTermTransform,
LinkedList listSimpleTermTransform,
String currentNewAltName,
ResolveAltIds altIds, Map isElementIsAlist,
Map simpleTermOrsimpleListTermTypes) {
this.currentNewAltName = currentNewAltName;
this.altIds = altIds;
this.isElementIsAlist = isElementIsAlist;
this.listSimpleTermTransform = listSimpleTermTransform;
this.simpleTermTransform = simpleTermTransform;
this.simpleTermOrsimpleListTermTypes = simpleTermOrsimpleListTermTypes;
}
@Override
public void inASimpleTerm(ASimpleTerm node) {
String name = node.getId().getText();
if (!((LinkedList) altIds.alts_elems.get(currentNewAltName)).contains(name) &&
!((LinkedList) altIds.alts_elems.get(currentNewAltName)).contains("$" + name)) {
node.replaceBy(new ANullTerm());
}
if (isElementIsAlist.get(currentNewAltName + name) != null) {
TId simpleTermTail;
if (node.getSimpleTermTail() != null) {
simpleTermTail = node.getSimpleTermTail();
} else {
simpleTermTail = new TId((String) isElementIsAlist.get(currentNewAltName + name));
}
ASimpleTerm asimpleTerm = new ASimpleTerm(node.getSpecifier(), node.getId(), simpleTermTail);
if (simpleTermOrsimpleListTermTypes.get(node) != null) {
simpleTermOrsimpleListTermTypes.put(asimpleTerm, (String) simpleTermOrsimpleListTermTypes.get(node));
}
node.replaceBy(asimpleTerm);
simpleTermTransform.put(asimpleTerm, "L" + ResolveIds.name((String) isElementIsAlist.get(currentNewAltName + name)));
//Terms are added here only if they were implicitely transformed
listSimpleTermTransform.add(asimpleTerm);
}
}
@Override
public void inASimpleListTerm(ASimpleListTerm node) {
String name = node.getId().getText();
if (!((LinkedList) altIds.alts_elems.get(currentNewAltName)).contains(name) &&
!((LinkedList) altIds.alts_elems.get(currentNewAltName)).contains("$" + name)) {
node.replaceBy(null);
}
if (isElementIsAlist.get(currentNewAltName + name) != null) {
TId simpleTermTail;
if (node.getSimpleTermTail() != null) {
simpleTermTail = node.getSimpleTermTail();
} else {
simpleTermTail = new TId((String) isElementIsAlist.get(currentNewAltName + name));
}
TId tid;
tid = (((LinkedList) altIds.alts_elems_list_elemName.get(currentNewAltName)).contains(name) ?
node.getId() : new TId("$" + node.getId().getText()));
ASimpleListTerm asimpleListTerm = new ASimpleListTerm(node.getSpecifier(), tid, simpleTermTail);
if (simpleTermOrsimpleListTermTypes.get(node) != null) {
simpleTermOrsimpleListTermTypes.put(asimpleListTerm, (String) simpleTermOrsimpleListTermTypes.get(node));
}
node.replaceBy(asimpleListTerm);
simpleTermTransform.put(asimpleListTerm, "L" + ResolveIds.name((String) isElementIsAlist.get(currentNewAltName + name)));
//Terms are added here only if they were implicitely transformed
listSimpleTermTransform.add(asimpleListTerm);
}
}
@Override
public void outAListTerm(AListTerm node) {
if ((node.getListTerms() != null) && (node.getListTerms().size() > 0)) {
Object[] temp = node.getListTerms().toArray();
if (simpleTermTransform.get(temp[0]) != null) {
String firstTermType = (String) simpleTermTransform.get(temp[0]);
if (firstTermType != null) {
if (!firstTermType.startsWith("L")) {
simpleTermTransform.put(node, "L" + firstTermType);
} else {
simpleTermTransform.put(node, firstTermType);
}
}
}
}
}
}