# SyntaxCheckerErrorListener.java

    package org.thewonderlemming.c4plantuml.syntaxchecker;

    import java.nio.file.Path;

    import org.antlr.v4.runtime.BaseErrorListener;
    import org.antlr.v4.runtime.RecognitionException;
    import org.antlr.v4.runtime.Recognizer;
    import org.thewonderlemming.c4plantuml.commons.Reporter;

    /**
     * An ANTLR4 {@link BaseErrorListener} implementation to check files for syntax errors and to report them to a given
     * {@link Reporter}.
     *
     * @author thewonderlemming
     *
     */
    public class SyntaxCheckerErrorListener extends BaseErrorListener {

        private static final String SYNTAX_ERROR_FORMAT = "Syntax error in file \"%s\", "
            + "line %d, "
            + "position %d, "
            + "offending symbol: %s.\n\tError message: %s";

        private final Path filepath;

        private final Reporter reporter;

        /**
         * Default constructor.
         *
         * @param reporter the {@link Reporter} to report errors to.
         * @param filepath the source file to parse.
         */
        public SyntaxCheckerErrorListener(final Reporter reporter, final Path filepath) {

            this.reporter = reporter;
            this.filepath = filepath;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public void syntaxError(final Recognizer<?, ?> recognizer, final Object offendingSymbol, final int line,
            final int charPositionInLine, final String msg, final RecognitionException exception) {

            String errorDescription = String
                .format(SYNTAX_ERROR_FORMAT,
                    this.filepath.toFile().getName(),
                    line,
                    charPositionInLine,
                    offendingSymbol,
                    SyntaxErrorMessageMapper.getMappingForParserMessageOrGetDefault(msg));

            if (null != exception) {
                errorDescription += "\n\t" + exception;
            }

            this.reporter.report(errorDescription);
        }
    }