try { CompileStatus status = compiler.compile(recipe); if (!status.isSuccess()) { Iterator<SyntaxError> errors = status.getErrors(); throw new DirectiveParseException(errors.next().getMessage(), errors); Iterator<TokenGroup> tokenGroups = status.getSymbols().iterator(); while(tokenGroups.hasNext()) { TokenGroup next = tokenGroups.next();
private CompileStatus compile(CharStream stream) throws CompileException { try { SyntaxErrorListener errorListener = new SyntaxErrorListener(); DirectivesLexer lexer = new DirectivesLexer(stream); lexer.removeErrorListeners(); lexer.addErrorListener(errorListener); DirectivesParser parser = new DirectivesParser(new CommonTokenStream(lexer)); parser.removeErrorListeners(); parser.addErrorListener(errorListener); parser.setErrorHandler(new GrammarParserInterpreter.BailButConsumeErrorStrategy()); parser.setBuildParseTree(true); ParseTree tree = parser.statements(); if(errorListener.hasErrors()) { return new CompileStatus(true, errorListener.iterator()); } RecipeVisitor visitor = new RecipeVisitor(); visitor.visit(tree); RecipeSymbol symbol = visitor.getCompiledUnit(); return new CompileStatus(symbol); } catch (StringIndexOutOfBoundsException e) { throw new CompileException("Issue in compiling directives"); } } }