public virtual void Process()
{
CodeGenerator gen = new CodeGenerator(g);
AbstractTarget target = gen.GetTarget();
if (target == null)
{
return;
}
IntervalSet idTypes = new IntervalSet();
idTypes.Add(ANTLRParser.ID);
idTypes.Add(ANTLRParser.RULE_REF);
idTypes.Add(ANTLRParser.TOKEN_REF);
IList<GrammarAST> idNodes = g.ast.GetNodesWithType(idTypes);
foreach (GrammarAST idNode in idNodes)
{
if (target.GrammarSymbolCausesIssueInGeneratedCode(idNode))
{
g.tool.errMgr.GrammarError(ErrorType.USE_OF_BAD_WORD,
g.fileName, idNode.Token,
idNode.Text);
}
}
// all templates are generated in memory to report the most complete
// error information possible, but actually writing output files stops
// after the first error is reported
int errorCount = g.tool.errMgr.GetNumErrors();
if (g.IsLexer())
{
if (target.NeedsHeader())
{
Template lexerHeader = gen.GenerateLexer(true); // Header file if needed.
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
WriteRecognizer(lexerHeader, gen, true);
}
}
Template lexer = gen.GenerateLexer(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
WriteRecognizer(lexer, gen, false);
}
}
else
{
if (target.NeedsHeader())
{
Template parserHeader = gen.GenerateParser(true);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
WriteRecognizer(parserHeader, gen, true);
}
}
Template parser = gen.GenerateParser(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
WriteRecognizer(parser, gen, false);
}
if (g.tool.gen_listener)
{
if (target.NeedsHeader())
{
Template listenerHeader = gen.GenerateListener(true);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteListener(listenerHeader, true);
}
}
Template listener = gen.GenerateListener(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteListener(listener, false);
}
if (target.NeedsHeader())
{
Template baseListener = gen.GenerateBaseListener(true);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteBaseListener(baseListener, true);
}
}
if (target.WantsBaseListener())
{
Template baseListener = gen.GenerateBaseListener(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteBaseListener(baseListener, false);
}
}
}
if (g.tool.gen_visitor)
{
if (target.NeedsHeader())
{
Template visitorHeader = gen.GenerateVisitor(true);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteVisitor(visitorHeader, true);
}
}
Template visitor = gen.GenerateVisitor(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteVisitor(visitor, false);
}
if (target.NeedsHeader())
{
Template baseVisitor = gen.GenerateBaseVisitor(true);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteBaseVisitor(baseVisitor, true);
}
}
if (target.WantsBaseVisitor())
{
Template baseVisitor = gen.GenerateBaseVisitor(false);
if (g.tool.errMgr.GetNumErrors() == errorCount)
{
gen.WriteBaseVisitor(baseVisitor, false);
}
}
}
}
gen.WriteVocabFile();
}