package cide.languages;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import cide.gast.IASTNode;
/**
* Erweiterung einer LanguageExtension um die Funktionalit�t, auch einzelne Codefragmente parsen zu k�nnen
*
* @author Malte Rosenthal
*
* @param <ParserType> Typ des interner Parsers (z.B. FJParser)
*/
public abstract class ExtendedLanguageExtension<ParserType> implements ILanguageExtension {
/**
* Parsed das gegebene Codefragment, das an Stelle des gegebenen AST-Knotens stehen kann.
* D.h. z.B. auch, dass die ID des gegebenen Knotens �bernommen wird.
* @param node
* @param code
* @return
*/
public IASTNode parseCodeFragment(IASTNode node, String code) {
IASTNode result = this.parseCodeFragment(node.getClass().getSimpleName(), code);
if (result != null) {
result.setId(node.getId());
// Habe ich mal rausgenommen, weil es denke ich nicht ben�tigt wird
//result.setParent(node.getParent(), node.getLocationInParent());
}
return result;
}
private IASTNode parseCodeFragment(String nonTerminalName, String code) {
ParserType internalParser = getInternalParser(code);
if (internalParser == null)
return null;
Method method = null;
try {
method = internalParser.getClass().getMethod(nonTerminalName, (Class<?>[]) null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
if (method == null)
return null;
Object result = null;
try {
result = method.invoke(internalParser, (Object[]) null);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if ((result == null) || !(result instanceof IASTNode))
return null;
return (IASTNode) result;
}
/**
* Gibt zur�ck, ob zur gegebenen Liste von AST-Knoten Alternativen angegeben werden k�nnen. Standardwert ist true.
* Subklassen k�nnen diese Methode �berschreiben, um z.B. Alternativen nur f�r eine bestimmte Menge von AST-Knoten
* zu erm�glichen.
*/
public boolean canCreateAlternatives(List<IASTNode> nodes) { return true; }
protected abstract ParserType getInternalParser(String code);
}