package de.gaalop.gaalet;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import de.gaalop.CodeParser;
import de.gaalop.CodeParserException;
import de.gaalop.InputFile;
import de.gaalop.cfg.ControlFlowGraph;
import de.gaalop.gaalet.antlr.GaaletLexer;
import de.gaalop.gaalet.antlr.GaaletParser;
import de.gaalop.gaalet.antlr.GaaletTransformer;
/*
* This class is taken form the the ClucalcCodeParser source.
* It was modified to fit the GaaletLexer, Parser and Transformer.
*
*/
public enum GaaletCodeParser implements CodeParser{
INSTANCE;
private static final Log log = LogFactory.getLog(GaaletCodeParser.class);
private Plugin plugin;
public void setPluginReference(Plugin plugin) {
if (this.plugin == null)
this.plugin = plugin;
}
@Override
public ControlFlowGraph parseFile(InputFile input) throws CodeParserException {
log.debug("Processing" + input.getName() + ", Content: " + input.getContent());
ControlFlowGraph graph;
try {
graph = parse(input);
} catch (Throwable e) {
throw new CodeParserException(input, "Unable to parse Gaalet file.\n" + e.getMessage(), e);
}
graph.setSource(input);
return graph;
}
private ControlFlowGraph parse(InputFile input) throws CodeParserException, RecognitionException {
ANTLRStringStream inputStream = new ANTLRStringStream(input.getContent());
GaaletLexer lexer = new GaaletLexer(inputStream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
GaaletParser parser = new GaaletParser(tokenStream);
GaaletParser.script_return parserResult = parser.script();
if (!parser.getErrors().isEmpty()) {
StringBuilder message = new StringBuilder();
message.append("Unable to parse Gaalet file:\n");
for (String error : parser.getErrors()) {
message.append(error);
message.append('\n');
}
throw new CodeParserException(input, message.toString());
}
if (parserResult.getTree() == null) {
throw new CodeParserException(input, "The input file is empty.");
}
CommonTreeNodeStream treeNodeStream = new CommonTreeNodeStream(parserResult.getTree());
GaaletTransformer transformer = new GaaletTransformer(treeNodeStream);
ControlFlowGraph graph = transformer.script();
// if (plugin != null) {
// plugin.setNumberOfAssignments(transformer.getNumberOfAssignments());
// }
if (!parser.getErrors().isEmpty()) {
StringBuilder message = new StringBuilder();
message.append("Unable to parse Gaalet file:\n");
for (String error : parser.getErrors()) {
message.append(error);
message.append('\n');
}
throw new CodeParserException(input, message.toString());
}
return graph;
}
}