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

Merge branch 'develop'

parents fb99eb6c c7717343
No related branches found
No related tags found
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