/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.grammar.parser;
import java.io.File;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.antlr.Tool;
import org.antlr.grammar.v3.ANTLRParser;
import org.antlr.netbeans.editor.text.DocumentSnapshot;
import org.antlr.netbeans.parsing.spi.ParseContext;
import org.antlr.netbeans.parsing.spi.ParserTaskManager;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.Token;
import org.antlr.tool.ErrorManager;
import org.openide.util.Parameters;
/**
*
* @author Sam Harwell
*/
public class CompiledModelParserV3 extends CompiledModelParser {
private final Object lock = new Object();
private DocumentSnapshot lastSnapshot;
private CompiledFileModelV3 lastResult;
private Throwable lastException;
@Override
protected CompiledModelV3 parseImpl(ParserTaskManager taskManager, ParseContext context, DocumentSnapshot snapshot)
throws InterruptedException, ExecutionException {
Parameters.notNull("snapshot", snapshot);
synchronized (lock) {
if (snapshot.equals(lastSnapshot)) {
if (lastException != null) {
throw new ExecutionException("An unexpected error occurred.", lastException);
}
return new CompiledModelV3(snapshot, lastResult);
}
ANTLRStringStream input = new ANTLRStringStream(snapshot.getText().toString());
ANTLRErrorProvidingLexer lexer = new ANTLRErrorProvidingLexer(input);
ANTLRParserTokenStream tokenStream = new ANTLRParserTokenStream(lexer);
ANTLRErrorProvidingParser parser = new ANTLRErrorProvidingParser(tokenStream, snapshot);
lexer.setParser(parser);
tokenStream.setParser(parser);
parser.setTreeAdaptor(new ANTLRErrorProvidingParser.grammar_Adaptor(parser));
try {
ErrorManager.setErrorListener(new ANTLRErrorProvidingParser.ErrorListener(snapshot));
Tool tool = new Tool();
tool.setLibDirectory(new File(snapshot.getVersionedDocument().getFileObject().getPath()).getParent());
GrammarWrapper g = new GrammarWrapper(tool, snapshot);
g.setFileName(""); // work around a bug in Grammar.setName that results in a NPE
ANTLRParser.grammar__return result = parser.grammar_(g);
List<? extends Token> tokenList = tokenStream.getTokens();
CommonToken[] tokens = new CommonToken[tokenList.size()];
tokens = tokenList.toArray(tokens);
CompiledFileModelV3 currentResult = new CompiledFileModelV3(parser, g, result, snapshot.getVersionedDocument().getFileObject(), tokens);
lastSnapshot = snapshot;
lastResult = currentResult;
lastException = null;
return new CompiledModelV3(snapshot, currentResult);
} catch (RecognitionException | RuntimeException | Error ex) {
lastSnapshot = snapshot;
lastResult = null;
lastException = ex;
throw new ExecutionException("An unexpected error occurred.", ex);
} finally {
ErrorManager.setErrorListener(null);
}
}
}
}