我使用ANTLR4语法来解析SQLite查询。但是,即使我使用简单的选择查询,词法分析器也会返回一个空令牌流。
这会产生以下错误:
线程“main”中的异常java.lang.IllegalStateException:nextToken需要非空输入流。
在org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:138)
在org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:186)
在org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:169)
在org.antlr.v4.runtime.BufferedTokenStream.setup(BufferedTokenStream.java:271)
at org.antlr.v4.runtime.BufferedTokenStream.lazyInit(BufferedTokenStream.java:266)
at org.antlr.v4.runtime.CommonTokenStream.LT(CommonTokenStream.java:116)
at org.antlr.v4.runtime.Parser.enterRecursionRule(Parser.java:677)
在antlr.antlr4.SQLIte.SQLiteParser.expr(SQLiteParser.java:5109)
在antlr.antlr4.SQLIte.SQLiteParser.expr(SQLiteParser.java:5100)
在antlr.antlr4.SQLIte.LexerParser.main(LexerParser.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());
我在哪里错了?
答案 0 :(得分:0)
如果它是Maven项目的一部分,则此代码有效。我之前曾尝试将其作为Java项目运行。
由于