package org.simantics.graph.compiler.internal.ltk.antlr; import java.io.IOException; import org.antlr.runtime.ANTLRInputStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonToken; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.Lexer; import org.antlr.runtime.Parser; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTree; import org.antlr.runtime.tree.Tree; import org.simantics.graph.compiler.internal.ltk.ISource; import org.simantics.graph.compiler.internal.ltk.Location; import org.simantics.graph.compiler.internal.ltk.Problem; public class ANTLRUtils { public static void setUpParser(ISource source, Lexer lexer, Parser parser) throws IOException { CharStream stream = new ANTLRInputStream(source.open()); lexer.setCharStream(stream); parser.setTokenStream(new CommonTokenStream(lexer)); } public static Location location(ISource source, Tree tree) { return new Location(source, getStartLine(tree), getStartIndex(tree), getStopIndex(tree)+1 ); } public static int getStartLine(Tree tree) { Token payload = ((CommonTree)tree).token; int startLine = payload != null && payload.getTokenIndex() >= 0 ? ((CommonToken)payload).getLine() : Integer.MAX_VALUE; int count = tree.getChildCount(); for(int i=0;i= 0 ? ((CommonToken)payload).getStartIndex() : Integer.MAX_VALUE; int count = tree.getChildCount(); for(int i=0;i= 0 ? ((CommonToken)payload).getStopIndex() : 0; int count = tree.getChildCount(); for(int i=0;i stopIndex) stopIndex = temp; } return stopIndex; } public static Location location(ISource source, Token token) { return new Location(source, token.getLine(), ((CommonToken) token).getStartIndex(), ((CommonToken) token).getStopIndex()+1 ); } public static Problem error(ISource source, RecognitionException e, Parser parser) { return new Problem(location(source, e.token), parser.getErrorMessage(e, parser.getTokenNames())); } public static Problem error(ISource source, RecognitionException e, Lexer lexer) { return new Problem(new Location(source, e.line, e.index, e.index+1), lexer.getErrorMessage(e, lexer.getTokenNames())); } }