Java tutorial
/* * ------------------------------------------------------------------- * Contact: a language and interactive shell for Riak * * Copyright (c) 2013 Dave Parfitt * * This file is provided to you under the Apache License, * Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ------------------------------------------------------------------- */ package com.basho.contact; import org.antlr.v4.runtime.*; public class ContactErrorListener extends BaseErrorListener { RuntimeContext runtimeCtx; public ContactErrorListener(RuntimeContext runtimeCtx) { this.runtimeCtx = runtimeCtx; } @Override public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { //System.err.println("line " + line + ":" + charPositionInLine + " " + msg); underlineError(recognizer, (Token) offendingSymbol, line, charPositionInLine); runtimeCtx.setParseError(true); throw new RuntimeException("Syntax error at line " + line + " character " + charPositionInLine); } protected void underlineError(Recognizer recognizer, Token offendingToken, int line, int charPositionInLine) { CommonTokenStream tokens = (CommonTokenStream) recognizer.getInputStream(); String input = tokens.getTokenSource().getInputStream().toString(); String lines[] = input.split("\n"); String errorLine = lines[line - 1]; System.err.println(errorLine); for (int i = 0; i < charPositionInLine; i++) System.err.print(" "); int start = offendingToken.getStartIndex(); int stop = offendingToken.getStopIndex(); if (start >= 0 && stop >= 0) { for (int i = start; i <= stop; i++) System.err.print("^"); } System.err.println(); } }