Skip to content
Snippets Groups Projects
Commit cdf48979 authored by dgelessus's avatar dgelessus
Browse files

Merge branch 'develop'

parents fb99eb6c c7717343
Branches
Tags 3.4.0
No related merge requests found
Pipeline #86829 passed
Showing
with 730 additions and 698 deletions
......@@ -5,3 +5,7 @@ indent_style = space
indent_size = 2
charset = utf-8
insert_final_newline = true
[*.{sablecc3,txt}]
indent_size = 4
trim_trailing_whitespace = true
......@@ -17,7 +17,11 @@ before_script:
tests:
stage: test
script: ./gradlew ${GRADLE_OPTIONS} check
script:
# We don't have proper tests for SableCC, so as a minimal test, run SableCC on itself twice.
# If this succeeds, we at least know that it's not completely broken.
- ./gradlew ${GRADLE_OPTIONS} regenerateParser
- ./gradlew ${GRADLE_OPTIONS} regenerateParser
tests:jdk-11:
extends: tests
......
......@@ -6,7 +6,7 @@ apply plugin: 'signing'
allprojects {
project.group = 'de.hhu.stups'
project.version = '3.3.3'
project.version = '3.4.0'
project.ext.isSnapshot = project.version.endsWith("-SNAPSHOT")
ext."signing.secretKeyRingFile" = rootProject.file("secring.gpg").absolutePath
......@@ -20,6 +20,10 @@ repositories {
mavenCentral()
}
dependencies {
implementation(project(":sablecc-runtime"))
}
java {
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
......@@ -39,6 +43,52 @@ processResources {
}
}
// Run this task to regenerate the SableCC parser using itself.
// The generated files are checked into Git,
// to avoid bootstrapping problems,
// so normally you do not need to run this task to build the parser.
// If you change something in the parser generator or templates that affects the output,
// please run this task manually and commit the updated generated files.
tasks.register("regenerateParser", JavaExec) {
final sableCCGrammar = file("src/main/sablecc/sablecc-3x.sablecc3")
final outputDirs = [
"src/main/java/org/sablecc/sablecc/analysis",
"src/main/java/org/sablecc/sablecc/lexer",
"src/main/java/org/sablecc/sablecc/node",
"src/main/java/org/sablecc/sablecc/parser",
"src/main/resources/org/sablecc/sablecc/lexer",
"src/main/resources/org/sablecc/sablecc/parser",
].collect {file(it)}
inputs.file(sableCCGrammar)
outputs.dir(temporaryDir)
outputs.dirs(outputDirs)
doFirst {
delete(temporaryDir)
mkdir(temporaryDir)
}
classpath(sourceSets.main.runtimeClasspath)
mainClass = application.mainClass
args = ["-d", temporaryDir, sableCCGrammar]
doLast {
delete(outputDirs)
// Split the generated files - the .dat files go into resources, the .java files go into java.
copy {
from(temporaryDir)
into("src/main/java")
exclude("**/*.dat")
}
copy {
from(temporaryDir)
into("src/main/resources")
include("**/*.dat")
}
}
}
jar {
manifest {
attributes([
......
......@@ -10,30 +10,24 @@ public class PositionedNode {
private SourcePosition startPos;
private SourcePosition endPos;
public SourcePosition getStartPos() {
/*
* Special treatment for tokens because they don't get a position in the
* PositionAspect
*/
if (this instanceof IToken) {
final IToken token = (IToken) this;
return new SourcePosition(token.getLine(), token.getPos());
public PositionedNode(final SourcePosition startPos, final SourcePosition endPos) {
this.startPos = startPos;
this.endPos = endPos;
}
return startPos;
public PositionedNode() {
this(null, null);
}
public SourcePosition getEndPos() {
/*
* Special treatment for tokens because they don't get a position in the
* PositionAspect
*/
if (this instanceof IToken) {
final IToken token = (IToken) this;
return new SourcePosition(token.getLine(), token.getPos()
+ token.getText().length());
public PositionedNode(final PositionedNode node) {
this(node.startPos, node.endPos);
}
public SourcePosition getStartPos() {
return startPos;
}
public SourcePosition getEndPos() {
return endPos;
}
......
......@@ -7,9 +7,8 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import org.sablecc.sablecc.node.*;
import java.util.*;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.Start;
public class AcceptStates extends DepthFirstAdapter
{
......@@ -24,11 +23,11 @@ public class AcceptStates extends DepthFirstAdapter
this.stateName = stateName;
}
@Override
public void caseStart(Start node)
{
for(int i = 0; i < dfa.states.size(); i++)
for(DFA.State state : dfa.states)
{
DFA.State state = (DFA.State) dfa.states.elementAt(i);
state.accept = -1;
int accept = -1;
......
......@@ -7,10 +7,11 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import java.util.LinkedList;
import java.util.List;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.util.*;
import java.io.*;
/*
* AddAstProductions
......@@ -26,16 +27,17 @@ import java.io.*;
public class AddAstProductions extends DepthFirstAdapter
{
LinkedList listAstProd = new TypedLinkedList();
List<PAstProd> listAstProd = new LinkedList<>();
private boolean firstAlt;
public AddAstProductions()
{}
@Override
public void caseAProd(AProd node)
{
firstAlt = true;
listOfAstAlts = new TypedLinkedList();
listOfAstAlts = new LinkedList<>();
/*
* Here, we assume that if there is no Abstract Syntax Tree Section specified
......@@ -46,27 +48,29 @@ public class AddAstProductions extends DepthFirstAdapter
error(node.getArrow());
}
Object []list_alt = (Object[]) node.getAlts().toArray();
for(int i=0; i<list_alt.length; i++)
{
((PAlt)list_alt[i]).apply(this);
PAlt[] list_alt = node.getAlts().toArray(new PAlt[0]);
for (PAlt alt : list_alt) {
alt.apply(this);
}
AAstProd astProd = new AAstProd(new TId(node.getId().getText()), listOfAstAlts);
listAstProd.add(astProd);
}
@Override
public void outAGrammar(AGrammar node)
{
node.setAst(new AAst(listAstProd));
}
@Override
public void inAAlt(AAlt node)
{
listElems = new TypedLinkedList();
listElems = new LinkedList<>();
processingParsedAlt = true;
}
@Override
public void inAAltTransform(AAltTransform node)
{
if(node.getLBrace() != null)
......@@ -75,9 +79,10 @@ public class AddAstProductions extends DepthFirstAdapter
}
}
@Override
public void outAAlt(AAlt node)
{
TId aAltname = node.getAltName() == null ? null : (TId)node.getAltName().clone();
TId aAltname = node.getAltName() == null ? null : node.getAltName().clone();
AAstAlt astAlt = new AAstAlt(aAltname, listElems);
listOfAstAlts.add(astAlt);
......@@ -86,17 +91,17 @@ public class AddAstProductions extends DepthFirstAdapter
boolean processingParsedAlt;
@Override
public void inAElem(AElem node)
{
if(processingParsedAlt)
{
AElem tmp = (AElem)node.clone();
listElems.add(tmp);
listElems.add(node.clone());
}
}
LinkedList listElems;
LinkedList listOfAstAlts;
List<PElem> listElems;
List<PAstAlt> listOfAstAlts;
public void error(Token token)
{
......
......@@ -7,10 +7,10 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import java.util.LinkedList;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.util.*;
import java.io.*;
/*
* AddEventualEmptyTransformationToProductions
......@@ -38,9 +38,10 @@ public class AddEventualEmptyTransformationToProductions extends DepthFirstAdapt
this.ast_ids = ast_ids;
}
@Override
public void inAProd(AProd node)
{
currentProd = (String)ids.names.get(node);
currentProd = ids.names.get(node);
/* If there is no transformation specified for the production
* and there is no AST production which has the same name as the current
......@@ -49,21 +50,22 @@ public class AddEventualEmptyTransformationToProductions extends DepthFirstAdapt
if(node.getArrow() == null && ast_ids.ast_prods.get(currentProd) == null )
{
node.setArrow(new TArrow(node.getId().getLine(), node.getId().getPos()+node.getId().getText().length() ));
node.setProdTransform(new LinkedList());
node.setProdTransform(new LinkedList<PElem>());
AAlt []alts = (AAlt[]) node.getAlts().toArray(new AAlt[0]);
PAlt[] alts = node.getAlts().toArray(new PAlt[0]);
for(int i=0; i<alts.length; i++)
for(PAlt alt : alts)
{
alts[i].apply( new DepthFirstAdapter()
alt.apply( new DepthFirstAdapter()
{
@Override
public void inAAlt(AAlt node)
{
if(node.getAltTransform() != null && ((AAltTransform)node.getAltTransform()).getTerms().size() > 0)
{
error(((AAltTransform)node.getAltTransform()).getLBrace());
}
node.setAltTransform( new AAltTransform(new TLBrace(), new LinkedList(), new TRBrace()) );
node.setAltTransform( new AAltTransform(new TLBrace(), new LinkedList<PTerm>(), new TRBrace()) );
}
}
);
......
......@@ -7,10 +7,11 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import java.util.LinkedList;
import java.util.List;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.util.*;
import java.io.*;
/*
* AddProdTransformAndAltTransform
......@@ -30,6 +31,7 @@ public class AddProdTransformAndAltTransform extends DepthFirstAdapter
private String currentProdId;
private String currentAlt;
@Override
public void inAProd(final AProd production)
{
currentProdId = production.getId().getText();
......@@ -37,22 +39,22 @@ public class AddProdTransformAndAltTransform extends DepthFirstAdapter
if(production.getArrow() == null)
{
AElem elem = new AElem(null, new AProductionSpecifier(), new TId(currentProdId), null);
LinkedList listOfProdTransformElem = new LinkedList();
List<PElem> listOfProdTransformElem = new LinkedList<>();
listOfProdTransformElem.add(elem);
production.setProdTransform(listOfProdTransformElem);
production.setArrow(new TArrow());
}
}
private int i;
private LinkedList list;
private List<PTerm> list;
@Override
public void inAAlt(AAlt alt)
{
if(alt.getAltTransform() == null)
{
currentAlt = currentProdId;
list = new LinkedList();
list = new LinkedList<>();
AProdName aProdName = new AProdName(new TId(currentProdId), null);
if(alt.getAltName() != null)
......@@ -62,12 +64,13 @@ public class AddProdTransformAndAltTransform extends DepthFirstAdapter
if( alt.getElems().size() > 0 )
{
Object temp[] = alt.getElems().toArray();
PElem[] temp = alt.getElems().toArray(new PElem[0]);
for(i = 0; i < temp.length; i++)
for(PElem e : temp)
{
((PElem) temp[i]).apply(new DepthFirstAdapter()
e.apply(new DepthFirstAdapter()
{
@Override
public void caseAElem(AElem elem)
{
PTerm term;
......@@ -87,7 +90,7 @@ public class AddProdTransformAndAltTransform extends DepthFirstAdapter
if( (elem.getUnOp() != null) &&
( (elem.getUnOp() instanceof AStarUnOp) || (elem.getUnOp() instanceof APlusUnOp) ) )
{
LinkedList listP = new LinkedList();
List<PListTerm> listP = new LinkedList<>();
if( !elemNameExplicitelySpecified && (elem.getSpecifier()!= null) )
{
if(elem.getSpecifier() instanceof ATokenSpecifier)
......@@ -135,7 +138,7 @@ public class AddProdTransformAndAltTransform extends DepthFirstAdapter
}
ANewTerm newTerm = new ANewTerm(aProdName, new TLPar(), list);
LinkedList lst = new LinkedList();
List<PTerm> lst = new LinkedList<>();
lst.add(newTerm);
alt.setAltTransform(new AAltTransform(new TLBrace(), lst, new TRBrace()));
......
......@@ -7,27 +7,28 @@
package org.sablecc.sablecc;
import java.util.*;
import org.sablecc.sablecc.analysis.*;
import java.util.List;
import java.util.Map;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.io.*;
public class AltTransformAdapter extends DepthFirstAdapter
{
ResolveAltIds altIds;
String currentNewAltName;
private Map isElementIsAlist;
private Map<String, String> isElementIsAlist;
private LinkedList listSimpleTermTransform;
private Map simpleTermTransform;
private Map simpleTermOrsimpleListTermTypes;
private List<Node> listSimpleTermTransform;
private Map<Node, String> simpleTermTransform;
private Map<Node, String> simpleTermOrsimpleListTermTypes;
AltTransformAdapter(Map simpleTermTransform,
LinkedList listSimpleTermTransform,
AltTransformAdapter(Map<Node, String> simpleTermTransform,
List<Node> listSimpleTermTransform,
String currentNewAltName,
ResolveAltIds altIds, Map isElementIsAlist,
Map simpleTermOrsimpleListTermTypes)
ResolveAltIds altIds, Map<String, String> isElementIsAlist,
Map<Node, String> simpleTermOrsimpleListTermTypes)
{
this.currentNewAltName = currentNewAltName;
this.altIds = altIds;
......@@ -37,12 +38,13 @@ public class AltTransformAdapter extends DepthFirstAdapter
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) )
if( !altIds.alts_elems.get(currentNewAltName).contains(name) &&
!altIds.alts_elems.get(currentNewAltName).contains("$"+name) )
{
node.replaceBy( new ANullTerm() );
}
......@@ -56,30 +58,31 @@ public class AltTransformAdapter extends DepthFirstAdapter
}
else
{
simpleTermTail = new TId( (String)isElementIsAlist.get(currentNewAltName+name) );
simpleTermTail = new TId(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));
simpleTermOrsimpleListTermTypes.put(asimpleTerm, simpleTermOrsimpleListTermTypes.get(node));
}
node.replaceBy(asimpleTerm);
simpleTermTransform.put(asimpleTerm, "L"+ResolveIds.name((String)isElementIsAlist.get(currentNewAltName+name)) );
simpleTermTransform.put(asimpleTerm, "L"+ResolveIds.name(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) )
if( !altIds.alts_elems.get(currentNewAltName).contains(name) &&
!altIds.alts_elems.get(currentNewAltName).contains("$"+name) )
{
node.replaceBy( null );
}
......@@ -93,28 +96,29 @@ public class AltTransformAdapter extends DepthFirstAdapter
}
else
{
simpleTermTail = new TId((String)isElementIsAlist.get(currentNewAltName+name));
simpleTermTail = new TId(isElementIsAlist.get(currentNewAltName+name));
}
TId tid;
tid = ( ((LinkedList)altIds.alts_elems_list_elemName.get(currentNewAltName)).contains(name) ?
tid = ( 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));
simpleTermOrsimpleListTermTypes.put(asimpleListTerm, simpleTermOrsimpleListTermTypes.get(node));
}
node.replaceBy(asimpleListTerm);
simpleTermTransform.put(asimpleListTerm, "L"+ResolveIds.name((String)isElementIsAlist.get(currentNewAltName+name) ));
simpleTermTransform.put(asimpleListTerm, "L"+ResolveIds.name(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) )
......@@ -123,7 +127,7 @@ public class AltTransformAdapter extends DepthFirstAdapter
if(simpleTermTransform.get(temp[0]) != null)
{
String firstTermType = (String)simpleTermTransform.get(temp[0]);
String firstTermType = simpleTermTransform.get(temp[0]);
if(firstTermType != null)
{
......
......@@ -7,15 +7,15 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import java.util.HashMap;
import java.util.Map;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.util.*;
import java.io.*;
public class AlternativeElementTypes extends DepthFirstAdapter
{
private Map altElemTypes = new TypedHashMap(StringCast.instance,
StringCast.instance);
private Map<String, String> altElemTypes = new HashMap<>();
private ResolveIds ids;
private String currentAlt;
......@@ -25,36 +25,40 @@ public class AlternativeElementTypes extends DepthFirstAdapter
this.ids = ids;
}
public Map getMapOfAltElemType()
public Map<String, String> getMapOfAltElemType()
{
return altElemTypes;
}
@Override
public void caseAAst(AAst node)
{}
@Override
public void caseAProd(final AProd production)
{
Object []temp = production.getAlts().toArray();
for(int i = 0; i<temp.length; i++)
PAlt[] temp = production.getAlts().toArray(new PAlt[0]);
for(PAlt alt : temp)
{
((PAlt)temp[i]).apply(this);
alt.apply(this);
}
}
@Override
public void caseAAlt(AAlt node)
{
currentAlt = (String)ids.names.get(node);
Object []temp = node.getElems().toArray();
for(int i = 0; i<temp.length; i++)
currentAlt = ids.names.get(node);
PElem[] temp = node.getElems().toArray(new PElem[0]);
for(PElem elem : temp)
{
((PElem)temp[i]).apply(this);
elem.apply(this);
}
}
@Override
public void inAElem(AElem node)
{
String elemType = (String)ids.elemTypes.get(node);
String elemType = ids.elemTypes.get(node);
if(node.getElemName() != null)
{
......
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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 java.util.*;
public class BooleanCast implements Cast
{
public final static BooleanCast instance = new BooleanCast();
private BooleanCast()
{}
public Object cast(Object o)
{
return (Boolean) o;
}
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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;
public interface Cast
{
Object cast(Object o);
}
......@@ -7,33 +7,34 @@
package org.sablecc.sablecc;
import java.util.*;
import java.util.Enumeration;
import java.util.Vector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class CharSet implements Cloneable
{
private final Vector intervals = new Vector(0);
private final List<Interval> intervals = new ArrayList<>();
public CharSet(char c)
{
intervals.addElement(new Interval(c, c));
intervals.add(new Interval(c, c));
}
public CharSet(char start, char end)
{
intervals.addElement(new Interval(start, end));
intervals.add(new Interval(start, end));
}
private CharSet(Vector intervals)
private CharSet(Collection<Interval> intervals)
{
for(Enumeration e = intervals.elements(); e.hasMoreElements();)
for(Interval i : intervals)
{
this.intervals.addElement(((Interval) e.nextElement()).clone());
this.intervals.add(i.clone());
}
}
public Object clone()
@Override
public CharSet clone()
{
return new CharSet(intervals);
}
......@@ -47,9 +48,9 @@ public class CharSet implements Cloneable
while(high >= low)
{
int middle = (high + low) / 2;
int middle = (high + low) >>> 1;
interval2 = (Interval) intervals.elementAt(middle);
interval2 = intervals.get(middle);
if(interval1.start <= interval2.end)
{
......@@ -70,40 +71,38 @@ public class CharSet implements Cloneable
return result;
}
private void remove
(Interval interval)
private void remove(Interval interval)
{
intervals.removeElement(interval);
intervals.remove(interval);
}
private void add
(Interval interval)
private void add(Interval interval)
{
for(int i = 0; i < intervals.size(); i++)
{
Interval iv = (Interval) intervals.elementAt(i);
Interval iv = intervals.get(i);
if(iv.start > interval.start)
{
intervals.insertElementAt(interval, i);
intervals.add(i, interval);
return;
}
}
intervals.addElement(interval);
intervals.add(interval);
}
public CharSet union(CharSet chars)
{
CharSet result = (CharSet) clone();
CharSet result = clone();
Interval interval;
Interval largeInterval;
Interval overlap;
for(Enumeration e = chars.intervals.elements(); e.hasMoreElements();)
for(Interval i : chars.intervals)
{
interval = (Interval) ((Interval) e.nextElement()).clone();
interval = i.clone();
do
{
......@@ -129,14 +128,14 @@ public class CharSet implements Cloneable
public CharSet diff(CharSet chars)
{
CharSet result = (CharSet) clone();
CharSet result = clone();
Interval interval;
Interval overlap;
for(Enumeration e = chars.intervals.elements(); e.hasMoreElements();)
for(Interval i : chars.intervals)
{
interval = (Interval) ((Interval) e.nextElement()).clone();
interval = i.clone();
do
{
......@@ -160,16 +159,19 @@ public class CharSet implements Cloneable
return result;
}
@Override
public String toString()
{
StringBuffer result = new StringBuffer();
StringBuilder result = new StringBuilder();
for(Enumeration e = intervals.elements(); e.hasMoreElements();)
for(Interval i : intervals)
{
result.append("[" + e.nextElement() + "] ");
result.append("[");
result.append(i);
result.append("] ");
}
return "" + result;
return result.toString();
}
public static class Interval implements Cloneable
......@@ -180,7 +182,8 @@ public class CharSet implements Cloneable
this.end = end;
}
public Object clone()
@Override
public Interval clone()
{
return new Interval(start, end);
}
......@@ -195,6 +198,7 @@ public class CharSet implements Cloneable
return "" + ((int) c);
}
@Override
public String toString()
{
if(start < end)
......@@ -210,17 +214,4 @@ public class CharSet implements Cloneable
public char start;
public char end;
}
public static class IntervalCast implements Cast
{
public final static IntervalCast instance = new IntervalCast();
private IntervalCast()
{}
public Object cast(Object o)
{
return (Interval) o;
}
}
}
......@@ -19,10 +19,11 @@
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import java.util.HashMap;
import java.util.Map;
import org.sablecc.sablecc.analysis.DepthFirstAdapter;
import org.sablecc.sablecc.node.*;
import java.util.*;
import java.io.*;
public class ComputeCGNomenclature extends DepthFirstAdapter
{
......@@ -31,14 +32,11 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
private int counter;
private ResolveIds ids;
private ResolveProdTransformIds prodTransformIds;
private Map altElemTypes;
private Map<String, String> altElemTypes;
private final Map altTransformElemTypes = new TypedHashMap(
NodeCast.instance,
StringCast.instance);
private final Map<Node, String> altTransformElemTypes = new HashMap<>();
private final Map termNumbers = new TypedHashMap(NodeCast.instance,
IntegerCast.instance);
private final Map<Node, Integer> termNumbers = new HashMap<>();
public ComputeCGNomenclature(ResolveIds ids, ResolveProdTransformIds prodTransformIds)
{
......@@ -46,31 +44,33 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
this.prodTransformIds = prodTransformIds;
}
public void setAltElemTypes(Map aMap)
public void setAltElemTypes(Map<String, String> aMap)
{
this.altElemTypes = aMap;
}
public Map getAltTransformElemTypes()
public Map<Node, String> getAltTransformElemTypes()
{
return altTransformElemTypes;
}
public Map getTermNumbers()
public Map<Node, Integer> getTermNumbers()
{
return termNumbers;
}
@Override
public void caseAProd(final AProd production)
{
currentProd = "P" + ids.name(production.getId().getText());
Object []temp = production.getAlts().toArray();
for(int i = 0; i<temp.length; i++)
currentProd = "P" + ResolveIds.name(production.getId().getText());
PAlt[] temp = production.getAlts().toArray(new PAlt[0]);
for(PAlt alt : temp)
{
((PAlt)temp[i]).apply(this);
alt.apply(this);
}
}
@Override
public void inAAlt(AAlt nodeAlt)
{
counter = 0;
......@@ -78,7 +78,7 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
if(nodeAlt.getAltName() != null)
{
currentAlt = "A"+
ids.name( nodeAlt.getAltName().getText() )+
ResolveIds.name( nodeAlt.getAltName().getText() )+
currentProd.substring(1);
}
else
......@@ -89,12 +89,14 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
counter = 0;
}
@Override
public void caseAAst(AAst node)
{}
@Override
public void inAElem(AElem node)
{
String elemType = (String)ids.elemTypes.get(node);
String elemType = ids.elemTypes.get(node);
if(node.getElemName() != null)
{
......@@ -102,31 +104,34 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
}
}
@Override
public void inANewTerm(ANewTerm node)
{
AProdName aProdName = (AProdName)node.getProdName();
String type = "P" + ids.name(aProdName.getId().getText());
String type = "P" + ResolveIds.name(aProdName.getId().getText());
altTransformElemTypes.put(node, type);
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
@Override
public void inANewListTerm(ANewListTerm node)
{
AProdName aProdName = (AProdName)node.getProdName();
String type = "P" + ids.name(aProdName.getId().getText());
String type = "P" + ResolveIds.name(aProdName.getId().getText());
altTransformElemTypes.put(node, type);
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
@Override
public void outAListTerm(AListTerm node)
{
if( node.getListTerms().size() > 0 )
{
Object[] temp = node.getListTerms().toArray();
PListTerm[] temp = node.getListTerms().toArray(new PListTerm[0]);
String firstTermType = (String)altTransformElemTypes.get(temp[0]);
String firstTermType = altTransformElemTypes.get(temp[0]);
if(firstTermType != null)
{
......@@ -144,13 +149,14 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
{
altTransformElemTypes.put(node, "Lnull");
}
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
@Override
public void caseASimpleTerm(ASimpleTerm node)
{
String name;
String elemType = (String) this.altElemTypes.get( currentAlt+"."+node.getId().getText() );
String elemType = this.altElemTypes.get( currentAlt+"."+node.getId().getText() );
if(node.getSimpleTermTail() == null)
{
......@@ -158,13 +164,13 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
if(name.startsWith("P") )
{
//add termtail to the simpleterm
node.setSimpleTermTail( (TId)node.getId().clone() );
node.setSimpleTermTail(node.getId().clone());
}
}
else
{
String termTail = node.getSimpleTermTail().getText();
name = (String)prodTransformIds.prodTransformElemTypesString.get(elemType+"."+termTail);
name = prodTransformIds.prodTransformElemTypesString.get(elemType+"."+termTail);
}
if(name.endsWith("?"))
......@@ -173,7 +179,7 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
}
altTransformElemTypes.put(node, name);
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
/*
......@@ -235,16 +241,18 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
termNumbers.put(node, new Integer(++counter));
}
*/
@Override
public void caseANullTerm(ANullTerm node)
{
altTransformElemTypes.put(node, "null");
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
@Override
public void caseASimpleListTerm(ASimpleListTerm node)
{
String name;
String elemType = (String)altElemTypes.get( currentAlt+"."+node.getId().getText() );
String elemType = altElemTypes.get( currentAlt+"."+node.getId().getText() );
if(node.getSimpleTermTail() == null)
{
......@@ -252,13 +260,13 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
if( name.startsWith("P") )
{
//add termtail to the simpleterm
node.setSimpleTermTail( (TId)node.getId().clone() );
node.setSimpleTermTail(node.getId().clone());
}
}
else
{
String termTail = node.getSimpleTermTail().getText();
name = (String)prodTransformIds.prodTransformElemTypesString.get(elemType+"."+termTail);
name = prodTransformIds.prodTransformElemTypesString.get(elemType+"."+termTail);
}
if(name.endsWith("?"))
......@@ -266,7 +274,7 @@ public class ComputeCGNomenclature extends DepthFirstAdapter
name = name.substring(0, name.length()-1);
}
altTransformElemTypes.put(node, name);
termNumbers.put(node, new Integer(++counter));
termNumbers.put(node, ++counter);
}
/*
public void caseASimpleListTerm(ASimpleListTerm node)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment