/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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;
@SuppressWarnings({"rawtypes", "unchecked"})
public class RecursiveProductionsDetections extends DepthFirstAdapter {
public LinkedList listOfRecursiveProds = new TypedLinkedList(StringCast.instance);
private String currentProd;
@Override
public void caseAProd(AProd node) {
currentProd = node.getId().getText();
if (!node.getId().getText().startsWith("$")) {
Object[] alts = node.getAlts().toArray();
for (int i = 0; i < alts.length; i++) {
((PAlt) alts[i]).apply(this);
}
} else {
listOfRecursiveProds.add(ResolveIds.name(currentProd));
}
}
@Override
public void caseAAlt(AAlt node) {
Object temp[] = node.getElems().toArray();
for (int i = 0; i < temp.length; i++) {
((PElem) temp[i]).apply(this);
}
}
/*
public void caseAIgnoredAlt(AIgnoredAlt node)
{
Object temp[] = node.getElems().toArray();
for(int i = 0; i < temp.length; i++)
{
((PElem) temp[i]).apply(this);
}
}
*/
@Override
public void caseAElem(AElem node) {
if (node.getId().getText().equals(currentProd)) {
if (node.getSpecifier() != null && node.getSpecifier() instanceof ATokenSpecifier) {
return;
}
if (!listOfRecursiveProds.contains(ResolveIds.name(currentProd))) {
listOfRecursiveProds.add(ResolveIds.name(currentProd));
}
}
}
}