/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.deved.antlride.internal.core.dfa;
import java.util.ArrayList;
import java.util.Collection;
import org.antlr.analysis.DFA;
import org.antlr.codegen.CodeGenerator;
import org.antlr.tool.DOTGenerator;
import org.antlr.tool.Grammar;
import org.deved.antlride.core.dfa.DFAGraphProvider;
import org.deved.antlride.core.dot.DotGraph;
import org.deved.antlride.core.model.IGrammar;
import org.deved.antlride.internal.core.antlr.ANTLRGrammarProvider;
import org.deved.antlride.internal.core.dot.DotGraphProvider;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
public class DefaultDFAGraphProvider implements DFAGraphProvider {
public DotGraph[] dfa(IProgressMonitor monitor, IGrammar grammar) {
ANTLRGrammarProvider grammarProvider = new ANTLRGrammarProvider();
monitor.beginTask("Initializing Decision DFAs", 8);
grammarProvider.build(monitor, grammar);
Grammar g = grammarProvider.getGrammar();
DotGraphProvider graphProvider = new DotGraphProvider();
Collection<DotGraph> graphs = new ArrayList<DotGraph>();
SubProgressMonitor subProgressMonitor = new SubProgressMonitor(monitor,
g.getNumberOfDecisions());
subProgressMonitor.beginTask("Creating DFAs", g.getNumberOfDecisions());
CodeGenerator codeGenerator = new CodeGenerator(g.tool, g, (String) g
.getOption("language"));
// build dfa
for (int d = 1; d <= g.getNumberOfDecisions(); d++) {
DFA dfa = g.getLookaheadDFA(d);
if (dfa == null) {
continue; // not there for some reason, ignore
}
String ruleName = dfa.decisionNFAStartState.enclosingRule.name;
subProgressMonitor.subTask("Creating " + ruleName + "::dec" + d);
DOTGenerator dotGenerator = new DOTGenerator(g);
g.setCodeGenerator(codeGenerator);
String dot = dotGenerator.getDOT(dfa.startState);
DotGraph graph = graphProvider.graph(ruleName, d,
dfa.decisionNFAStartState.getDescription(), dot);
if (graph != null) {
graphs.add(graph);
}
}
subProgressMonitor.done();
monitor.done();
return graphs.toArray(new DotGraph[graphs.size()]);
}
}