InputMismatchException 在哪里抛出?

Where is the InputMismatchException thrown?

当我在错误的位置使用某个标记执行我的程序时,它会抛出 InputMismatchException,说的是

line 21:0 mismatched input '#' expecting {'in', '||', '&&', '==', '!=', '>=', '<=', '^', '>', '<', '+', '-', '*', '/', '%', '[', ';', '?'}

对于我正在开发的语言来说,这是一个可怕的错误信息,所以我想改变它,但我找不到它的来源,我知道为什么会抛出错误,但我找不到抛出 InputMismatchException 的 java 代码的实际行,我认为它不在 my 项目中的任何地方,所以我假设它在某个地方antlr4 运行时,有没有办法禁用这些错误消息,或者至少更改它们?

编辑:

我的语法(相关部分)如下:

grammar Q;

parse
 : header? ( allImport ';' )*? block EOF
 ;

block
 : ( statement | functionDecl )* ( Return expression ';' )?
 ;

statement
 : functionCall ';'
 | ifStatement
 | forStatement | forInStatement
 | whileStatement
 | tryCatchStatement
 | mainFunctionStatement
 | addWebServerTextStatement ';'
 | reAssignment ';'
 | classStatement
 | constructorStatement ';'
 | windowAddCompStatement ';'
 | windowRenderStatement ';'
 | fileWriteStatement ';'
 | verifyFileStatement ';'
 | objFunctionCall (';')?
 | objCreateStatement ';'
 | osExecStatement ';'
 | anonymousFunction
 | hereStatement ';'
 ;

importStatement访问方法的一个例子是:

    @Override
    public QValue visitImportStatement(ImportStatementContext ctx) {

        StringBuilder path = new StringBuilder();
        StringBuilder text = new StringBuilder();

        for (TerminalNode o : ctx.Identifier()) {
            path.append("/").append(o.getText());
        }

        for (TerminalNode o : ctx.Identifier()) {
            text.append(".").append(o.getText());
        }

        if (lang.allLibs.contains(text.toString().replace(".q.", "").toLowerCase(Locale.ROOT))) {
            lang.parse(text.toString());
            return QValue.VOID;
        }

        for (File f : lang.parsed) {
            Path currentRelativePath = Paths.get("");
            String currentPath = currentRelativePath.toAbsolutePath().toString();

            File file = new File(currentPath + "/" + path + ".l");
            if (f.getPath().equals(file.getPath())) {
                return null;
            }
        }

        QLexer lexer = null;
        Path currentRelativePath = Paths.get("");
        String currentPath = currentRelativePath.toAbsolutePath().toString();

        File file = new File(currentPath + "/" + path + ".l");
        lang.parsed.add(file);

        try {

            lexer = new QLexer(CharStreams.fromFileName(currentPath + "/" + path + ".l"));
        } catch (IOException e) {
            throw new Problem("Library or File not found: " + path, ctx);
        }
        QParser parser = new QParser(new CommonTokenStream(lexer));
        parser.setBuildParseTree(true);
        ParseTree tree = parser.parse();

        Scope s = new Scope(lang.scope, false);
        Visitor v = new Visitor(s, new HashMap<>());

        v.visit(tree);

        return QValue.VOID;
    }

由于我的 g4 文件中的 parse 规则,import 语句必须位于任何其他内容之前(除了 header 语句),所以这样做会抛出一个错误

class Main

    #import src.main.QFiles.aLib;

    fn main()

        try
            std::ln("orih");
        onflaw

        end

        new Object as o();
        o::set("val");
        std::ln(o::get());

        std::ln("itj");

    end

end

而且,正如预期的那样,它会抛出一个 InputMismatchException,但这不在我的任何代码中

您可以删除默认错误策略并实施您自己的错误策略:

...
QParser parser = new QParser(new CommonTokenStream(lexer));

parser.removeErrorListeners();

parser.addErrorListener(new BaseErrorListener() {
  @Override
  public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
    throw new RuntimeException("Your own message here", e);
  }
});

ParseTree tree = parser.parse();
...