/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Map;
@SuppressWarnings("rawtypes")
public class GenerateAlternativeCodeForParser extends DepthFirstAdapter {
String currentAlt;
String realcurrentAlt;
BufferedWriter file;
private File pkgDir;
private ResolveTransformIds transformIds;
private ComputeCGNomenclature CG;
private ComputeSimpleTermPosition CTP;
private MacroExpander macros;
private Map simpleTermTransformMap;
private LinkedList listSimpleTermTransform;
private Map simpleTermOrsimpleListTermTypes;
GenerateAlternativeCodeForParser(File pkgDir, String aParsedAltName,
String raParsedAltName,
BufferedWriter file,
ResolveTransformIds transformIds,
ComputeCGNomenclature CG,
ComputeSimpleTermPosition CTP,
Map simpleTermTransformMap,
MacroExpander macros,
LinkedList listSimpleTermTransform,
Map simpleTermOrsimpleListTermTypes) {
this.pkgDir = pkgDir;
this.file = file;
currentAlt = aParsedAltName;
realcurrentAlt = raParsedAltName;
this.transformIds = transformIds;
this.CG = CG;
this.CTP = CTP;
this.simpleTermTransformMap = simpleTermTransformMap;
this.macros = macros;
this.listSimpleTermTransform = listSimpleTermTransform;
this.simpleTermOrsimpleListTermTypes = simpleTermOrsimpleListTermTypes;
}
@Override
public void inAAltTransform(AAltTransform node) {
Object temp[] = node.getTerms().toArray();
String type_name;
int position;
for (int i = 0; i < temp.length; i++) {
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
try {
if (type_name.startsWith("L")) {
macros.apply(file, "ParserListVariableDeclaration", new String[]{"" + position});
} else if (type_name.equals("null")) {
macros.apply(file, "ParserNullVariableDeclaration", new String[]{"" + position});
} else {
macros.apply(file, "ParserSimpleVariableDeclaration", new String[]{type_name, type_name.toLowerCase(), "" + position});
}
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
}
@Override
public void outAAltTransform(AAltTransform node) {
Object temp[] = node.getTerms().toArray();
String type_name;
int position;
try {
for (int i = 0; i < temp.length; i++) {
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
if (type_name.startsWith("L")) {
type_name = "list";
} else if (type_name.equals("null")) {
type_name = "null";
} else {
type_name = type_name.toLowerCase();
}
macros.apply(file, "ParserNewBodyListAdd", new String[]{type_name, "" + position});
}
macros.apply(file, "ParserNewTail");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
public void inAParams(LinkedList list_param) {
String type_name;
int position;
Object temp[] = list_param.toArray();
for (int i = 0; i < temp.length; i++) {
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
try {
if (type_name.startsWith("L")) {
macros.apply(file, "ParserListVariableDeclaration", new String[]{"" + position});
} else if (type_name.equals("null")) {
macros.apply(file, "ParserNullVariableDeclaration", new String[]{"" + position});
} else {
macros.apply(file, "ParserSimpleVariableDeclaration", new String[]{type_name, type_name.toLowerCase(), "" + position});
}
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
}
@Override
public void inASimpleTerm(ASimpleTerm node) {
try {
String type_name;
if (simpleTermTransformMap.get(node) != null) {
type_name = (String) simpleTermTransformMap.get(node);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(node);
}
int position = ((Integer) CG.getTermNumbers().get(node)).intValue();
String termKey = currentAlt + "." + node.getId().getText();
int elemPosition = ((Integer) CTP.elems_position.get(termKey)).intValue();
int positionMap = 0;
if (node.getSimpleTermTail() != null) {
if (!listSimpleTermTransform.contains(node.getId().getText())) {
String type = (String) CTP.positionsMap.get(realcurrentAlt + "." + node.getId().getText());
LinkedList list = (LinkedList) transformIds.getProdTransformIds().prod_transforms.get(type);
if (list.indexOf(node.getSimpleTermTail().getText()) >= 0) {
positionMap = list.indexOf(node.getSimpleTermTail().getText());
}
}
if (simpleTermOrsimpleListTermTypes.get(node) != null) {
String type = (String) simpleTermOrsimpleListTermTypes.get(node);
LinkedList list = (LinkedList) transformIds.getProdTransformIds().prod_transforms.get(type);
if (list.indexOf(node.getSimpleTermTail().getText()) >= 0) {
positionMap = list.indexOf(node.getSimpleTermTail().getText());
}
}
}
String type;
if (type_name.startsWith("L")) {
type_name = "list";
type = "LinkedList";
} else if (type_name.equals("null")) {
type_name = "null";
type = "Object";
} else {
type = type_name;
}
macros.apply(file, "ParserSimpleTerm", new String[]
{
type_name.toLowerCase(), "" + position,
type, "" + elemPosition, "" + positionMap
}
);
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
@Override
public void inASimpleListTerm(ASimpleListTerm node) {
try {
String type_name;
if (simpleTermTransformMap.get(node) != null) {
type_name = (String) simpleTermTransformMap.get(node);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(node);
}
String termKey = currentAlt + "." + node.getId().getText();
int position = ((Integer) CG.getTermNumbers().get(node)).intValue();
int elemPosition = ((Integer) CTP.elems_position.get(termKey)).intValue();
int positionMap = 0;
if (node.getSimpleTermTail() != null) {
if (!listSimpleTermTransform.contains(node.getId().getText())) {
String type = (String) CTP.positionsMap.get(realcurrentAlt + "." + node.getId().getText());
LinkedList list = (LinkedList) transformIds.getProdTransformIds().prod_transforms.get(type);
if (list.indexOf(node.getSimpleTermTail().getText()) >= 0) {
positionMap = list.indexOf(node.getSimpleTermTail().getText());
}
}
if (simpleTermOrsimpleListTermTypes.get(node) != null) {
String type = (String) simpleTermOrsimpleListTermTypes.get(node);
LinkedList list = (LinkedList) transformIds.getProdTransformIds().prod_transforms.get(type);
if (list.indexOf(node.getSimpleTermTail().getText()) >= 0) {
positionMap = list.indexOf(node.getSimpleTermTail().getText());
}
}
}
String type;
if (type_name.startsWith("L")) {
type_name = "list";
type = "LinkedList";
} else if (type_name.equals("null")) {
type_name = "null";
type = "Object";
} else {
type = type_name;
}
macros.apply(file, "ParserSimpleTerm", new String[]
{
type_name.toLowerCase(), "" + position,
type, "" + elemPosition, "" + positionMap
}
);
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
@Override
public void inANewTerm(ANewTerm node) {
try {
macros.apply(file, "ParserBraceOpening");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
inAParams(node.getParams());
}
@Override
public void inANewListTerm(ANewListTerm node) {
try {
macros.apply(file, "ParserBraceOpening");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
inAParams(node.getParams());
}
@Override
public void inAListTerm(AListTerm node) {
try {
macros.apply(file, "ParserBraceOpening");
Object temp[] = node.getListTerms().toArray();
for (int i = 0; i < temp.length; i++) {
String type_name;
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
int position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
if (type_name.startsWith("L")) {
macros.apply(file, "ParserListVariableDeclaration", new String[]{"" + position});
} else if (type_name.equals("null")) {
macros.apply(file, "ParserNullVariableDeclaration", new String[]{"" + position});
} else {
macros.apply(file, "ParserSimpleVariableDeclaration", new String[]{type_name, type_name.toLowerCase(), "" + position});
}
}
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
@Override
public void outAListTerm(AListTerm node) {
try {
Object temp[] = node.getListTerms().toArray();
int listPosition = ((Integer) CG.getTermNumbers().get(node)).intValue();
for (int i = 0; i < temp.length; i++) {
String type_name;
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
int position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
if (!type_name.equals("null")) {
if (type_name.startsWith("L")) {
macros.apply(file, "ParserTypedLinkedListAddAll", new String[]{"list", "" + listPosition, "list", "" + position});
} else {
macros.apply(file, "ParserTypedLinkedListAdd", new String[]{"list", "" + listPosition, type_name.toLowerCase(), "" + position});
}
}
}
macros.apply(file, "ParserBraceClosing");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "Parser.java").getAbsolutePath());
}
}
@Override
public void outANewTerm(ANewTerm node) {
String type_name = (String) CG.getAltTransformElemTypes().get(node);
if (simpleTermTransformMap.get(node) != null) {
type_name = (String) simpleTermTransformMap.get(node);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(node);
}
int position = ((Integer) CG.getTermNumbers().get(node)).intValue();
String newAltName = name((AProdName) node.getProdName());
try {
if (type_name.startsWith("L")) {
type_name = "list";
} else {
type_name = type_name.toLowerCase();
}
macros.apply(file, "ParserNewBodyNew", new String[]{type_name, "" + position, newAltName});
if (node.getParams().size() > 0) {
Object temp[] = node.getParams().toArray();
String isNotTheFirstParam = "";
for (int i = 0; i < temp.length; i++) {
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
if (i != 0) {
isNotTheFirstParam = ", ";
}
if (type_name.equals("null")) {
macros.apply(file, "ParserNew&ListBodyParamsNull", new String[]{isNotTheFirstParam + "null"});
} else {
if (type_name.startsWith("L")) {
type_name = "list";
} else {
type_name = type_name.toLowerCase();
}
macros.apply(file, "ParserNew&ListBodyParams", new String[]{isNotTheFirstParam + type_name, "" + position});
}
}
}
macros.apply(file, "ParserNewBodyNewTail");
macros.apply(file, "ParserBraceClosing");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "TokenIndex.java").getAbsolutePath());
}
}
@Override
public void outANewListTerm(ANewListTerm node) {
String type_name;
if (simpleTermTransformMap.get(node) != null) {
type_name = (String) simpleTermTransformMap.get(node);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(node);
}
int position = ((Integer) CG.getTermNumbers().get(node)).intValue();
String newAltName = name((AProdName) node.getProdName());
try {
if (type_name.startsWith("L")) {
type_name = "list";
} else {
type_name = type_name.toLowerCase();
}
macros.apply(file, "ParserNewBodyNew", new String[]{type_name, "" + position, newAltName});
if (node.getParams().size() > 0) {
Object temp[] = node.getParams().toArray();
String isNotTheFirstParam = "";
for (int i = 0; i < temp.length; i++) {
if (simpleTermTransformMap.get(temp[i]) != null) {
type_name = (String) simpleTermTransformMap.get(temp[i]);
} else {
type_name = (String) CG.getAltTransformElemTypes().get(temp[i]);
}
position = ((Integer) CG.getTermNumbers().get(temp[i])).intValue();
if (i != 0) {
isNotTheFirstParam = ", ";
}
if (type_name.equals("null")) {
macros.apply(file, "ParserNew&ListBodyParamsNull", new String[]{isNotTheFirstParam + "null"});
} else {
if (type_name.startsWith("L")) {
type_name = "list";
} else {
type_name = type_name.toLowerCase();
}
macros.apply(file, "ParserNew&ListBodyParams", new String[]{isNotTheFirstParam + type_name, "" + position});
}
}
}
macros.apply(file, "ParserNewBodyNewTail");
macros.apply(file, "ParserBraceClosing");
} catch (IOException e) {
throw new RuntimeException("An error occured while writing to " +
new File(pkgDir, "TokenIndex.java").getAbsolutePath());
}
}
public String name(AProdName node) {
if (node.getProdNameTail() != null) {
return "A" +
ResolveIds.name(node.getProdNameTail().getText()) +
ResolveIds.name(node.getId().getText());
}
return "A" + ResolveIds.name(node.getId().getText());
}
}