【问题标题】:ANTLR4: Error message with complete offending source code lineANTLR4:带有完整的违规源代码行的错误消息
【发布时间】:2016-05-03 09:05:47
【问题描述】:

如果出现错误,我想在我的编译器中生成一条错误消息,例如clang,其中包含完整的违规源代码行。

例子:

1.c:3:7: error: use of undeclared identifier 'x'
    if ( x== y) { 
         ^

我已经扩展了 ANTLR BaseErrorListener,但我不知道 如何将有问题的源代码行(除行号之外)作为字符串获取。

【问题讨论】:

    标签: antlr4 error-reporting


    【解决方案1】:

    我在 BaseErrorListener 的扩展中创建了 2 个方法。一个获取源代码行,另一个获取'^'符号:

    private String getSourceLine(String src, int line) {
        String currentLine = "";
        try (Scanner fileScanner = new Scanner(new File(src))) {
            int currentLineNumber = 1;
            while (fileScanner.hasNextLine()) {
    
                currentLine = fileScanner.nextLine();
                if (currentLineNumber == line) {
                    return currentLine + "\n";
                }
                currentLineNumber++;
            }        
        } catch (Exception e) {
            currentLine = "\n";
        }
    
        return currentLine;
    }
    
    private String getPointer(int charPosition) {
        return StringUtils.repeat(' ', charPosition) + '^';
    }
    

    打电话给他们:

        String source = recognizer.getInputStream().getSourceName();
    
        errorMessage += this.getSourceLine(source, line);
        errorMessage += this.getPointer(charPositionInLine);
    

    【讨论】:

      【解决方案2】:

      这很简单。您会在错误信息中获得行号和字符位置。使用它来定位输入中的位置。然后前后扫描换行。这些换行符之间的文本是您的源代码行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多