Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用Antlr4解析PlSQL时提取语法错误的行_Java_Parsing_Plsql_Antlr4 - Fatal编程技术网

Java 如何在使用Antlr4解析PlSQL时提取语法错误的行

Java 如何在使用Antlr4解析PlSQL时提取语法错误的行,java,parsing,plsql,antlr4,Java,Parsing,Plsql,Antlr4,我使用的是这个版本中PlSql的语法文件。如果plsql文件中有语法错误,我想在它下面划线。我有以下代码段可以这样做: public static class UnderlineListener extends BaseErrorListener { public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol,

我使用的是这个版本中PlSql的语法文件。如果plsql文件中有语法错误,我想在它下面划线。我有以下代码段可以这样做:

public static class UnderlineListener extends BaseErrorListener {

    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);
    }

    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();
    }
}
现在,当我尝试使用
String input=tokens.getTokenSource().getInputStream().toString()获取我的
UnderlineListener
中的输入文本时,我没有得到我的
test.sql
的实际文本。这是因为
getInputStream()
正在返回
CaseChangingCharStream
对象,该对象没有给出我的
test.sql
所需的实际文本


在我的案例中,如何获取实际的文件文本?一种方法可能是将文件内容传递给
UnderlineListener
的构造函数,但我更喜欢使用上述方法获取实际文件文本,因为它可以用于未使用
CaseChangingCharStream
的情况。

我找到了一种解决方法。的当前实现没有getter方法(如
getCharStream()
)来访问
最终CharStream属性。只需为它添加一个getter方法,我们就可以访问底层的
CharStream
对象,如下所示:

CharStream s = CharStreams.fromPath(Paths.get('test.sql'));
CaseChangingCharStream upper = new CaseChangingCharStream(s, true);
Lexer lexer = new SomeSQLLexer(upper);
CaseChangingCharStream modifiedCharStream = (CaseChangingCharStream) tokens.getTokenSource().getInputStream();
String input = modifiedCharStream.getCharStream().toString();