/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
* Last Modification date : 03-11-2003
* Remove the checking of stmt mark and + operator
* for production tranformations
* I've commented out the method
* public void caseAProd(AProd node) { ... }
* Date : 15-01-2003 :
* The method is now removed because it is not used anymore
*/
package org.sablecc.sablecc;
import org.sablecc.sablecc.analysis.*;
import org.sablecc.sablecc.node.*;
import java.util.LinkedList;
import java.util.Map;
/*
* ResolveAltIds
*
* This class computes semantic verifications for AST alternatives
* section. The same thing is done by ResolveIds class for Productions
* section.
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class ResolveAltIds extends DepthFirstAdapter {
public ResolveIds ids;
//Map of alternatives elements which are not list :
// ie not followed by * or + operator.
public Map alts_elems = new TypedTreeMap(
StringComparator.instance,
StringCast.instance,
ListCast.instance);
//Map of only alternatives elements which are list :
//followed by * or + operator.
public Map alts_elems_list = new TypedTreeMap(
StringComparator.instance,
StringCast.instance,
ListCast.instance);
//Map of all alternatives elements. Elements name are stored
//if it is specified otherwise, it is its id.
//(elem = elem_name? specifier? id un_op?)
public Map alts_elemsGlobal = new TypedTreeMap(
StringComparator.instance,
StringCast.instance,
ListCast.instance);
//Map of all alternatives elements which have explicit name.
public Map alts_elems_list_elemName = new TypedTreeMap(
StringComparator.instance,
StringCast.instance,
ListCast.instance);
private LinkedList listElemsGlobal;
private LinkedList listElems;
private LinkedList listElemslist;
String currentAlt;
//This is true if the current elem is a list and false otherwise
private boolean blist;
public ResolveAltIds(ResolveIds ids) {
this.ids = ids;
}
/*
* This method is checking if there is QMark or Plus Operator in in the
* list of productions transformations elements
*/
@Override
public void caseAProd(AProd node) {
// AElem []temp = (AElem[]) node.getProdTransform().toArray(new AElem[0]);
Object[] list_alts = node.getAlts().toArray();
for (int j = 0; j < list_alts.length; j++) {
((PAlt) list_alts[j]).apply(this);
}
}
/*
* Here, a map which associate the current alternative with the list of elems
* is created.
*/
@Override
public void caseAAlt(AAlt alt) {
//contains all the elements in the alternative, no matter if they are list or not
listElemsGlobal = new LinkedList();
//contains only single (without operator * or +) element of the alternative.
listElems = new LinkedList();
//contains only element of the alternative which are list(operator * or +).
listElemslist = new LinkedList();
currentAlt = (String) ids.names.get(alt);
AElem[] list_elems = (AElem[]) alt.getElems().toArray(new AElem[0]);
for (int i = 0; i < list_elems.length; i++) {
list_elems[i].apply(this);
}
alts_elemsGlobal.put(currentAlt, listElemsGlobal);
alts_elems.put(currentAlt, listElems);
alts_elems_list.put(currentAlt, listElemslist);
}
@Override
public void caseAElem(final AElem elem) {
blist = false;
if ((elem.getUnOp() != null) &&
((elem.getUnOp() instanceof AStarUnOp) || (elem.getUnOp() instanceof APlusUnOp))) {
blist = true;
}
String elem_name = (elem.getElemName() != null ? elem.getElemName().getText() : elem.getId().getText());
if (!blist) {
listElems.add(elem_name);
} else {
listElemslist.add(elem_name);
}
listElemsGlobal.add(elem_name);
}
//This method is overriding in order to not allow ASt traversal to visit
//AST elements.
@Override
public void caseAAst(AAst node) {
}
@Override
public String toString() {
StringBuffer s = new StringBuffer();
String nl = System.getProperty("line.separator");
s.append("Alternative elements : ");
s.append(nl);
s.append(alts_elems);
s.append(nl);
return s.toString();
}
}