Java ANTLR 4 SQLite语法提供空令牌流

Java ANTLR 4 SQLite语法提供空令牌流,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,我使用ANTLR4语法来解析SQLite查询。然而,lexer返回的是一个空的令牌流,即使我使用的是一个简单的select查询 这会产生以下错误: 主线程java.lang.IllegalStateException中的异常:nextToken需要非空输入流。 位于org.antlr.v4.runtime.Lexer.nextTokenLexer.java:138 位于org.antlr.v4.runtime.BufferedTokenStream.fetchBufferedTokenStrea

我使用ANTLR4语法来解析SQLite查询。然而,lexer返回的是一个空的令牌流,即使我使用的是一个简单的select查询

这会产生以下错误:

主线程java.lang.IllegalStateException中的异常:nextToken需要非空输入流。 位于org.antlr.v4.runtime.Lexer.nextTokenLexer.java:138 位于org.antlr.v4.runtime.BufferedTokenStream.fetchBufferedTokenStream.java:186 位于org.antlr.v4.runtime.BufferedTokenStream.syncBufferedTokenStream.java:169 位于org.antlr.v4.runtime.BufferedTokenStream.setupBufferedTokenStream.java:271 位于org.antlr.v4.runtime.BufferedTokenStream.lazyInitBufferedTokenStream.java:266 位于org.antlr.v4.runtime.CommonTokenStream.LTCommonTokenStream.java:116 位于org.antlr.v4.runtime.Parser.enterRecursionRuleParser.java:677 位于antlr.antlr4.SQLIte.SQLiteParser.exprSQLiteParser.java:5109 位于antlr.antlr4.SQLIte.SQLiteParser.exprSQLiteParser.java:5100 位于antlr.antlr4.SQLIte.LexerParser.mainLexerParser.java:38

这是main.java类的代码:

import antlr.antlr4.SQLIte.*;
import antlr.antlr4.SQLIte.SQLiteParser.ExprContext;

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class LexerParser {

    public static void main(String[] args) throws Exception {

        // The list that will hold our function names.
        final List<String> functionNames = new ArrayList<String>();

        // The select-statement to be parsed.
        String sql = "SELECT * FROM table";

        // Create a lexer and parser for the input.
        InputStream stream = new ByteArrayInputStream(sql.getBytes(StandardCharsets.UTF_8), 0, 0);

        ANTLRInputStream antlrTemp = new ANTLRInputStream(stream);
        SQLiteLexer lexer = new SQLiteLexer(antlrTemp);
       // SQLiteLexer lexer = new SQLiteLexer(antlrTemp);
        CommonTokenStream cts = new CommonTokenStream(lexer);
        System.out.print(cts.getTokens());

        SQLiteParser parser = new SQLiteParser(cts);

            ExprContext theExpr = parser.expr();
            System.out.println("found expr " + theExpr.toString());
我哪里出了问题


如果这段代码是Maven项目的一部分,它就可以工作。我之前尝试将其作为Java项目运行


谢谢

为什么不直接使用新的AntlInputStreamSQL?@Lucastzesniewski-这会产生同样的错误。来自lexer的令牌流为空。使用CommonTokenStream cts=new CommonTokenStreamlexer时输出[];System.out.printcts.getTokens;好的,我看了一下语法-您应该经常使用parser.parse而不是parser.exprThanks!我只是试过了。空令牌列表问题仍然存在。@Lucastzesniewski-当我将其作为Maven项目而不是Java项目运行时,它会起作用: