2015-04-06 70 views
0

我正在使用ANTLR4语法来解析SQLite查询。但是,词法分析器正在返回一个空的标记流,即使我正在使用简单的选择查询。ANTLR 4提供空令牌流的SQLite语法

我们得到以下错误:

Exception in thread "main" java.lang.IllegalStateException: nextToken requires a non-null input stream.
at org.antlr.v4.runtime.Lexer.nextToken(Lexer.java:138)
at org.antlr.v4.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:186)
at org.antlr.v4.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:169)
at 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)
at antlr.antlr4.SQLIte.SQLiteParser.expr(SQLiteParser.java:5109)
at antlr.antlr4.SQLIte.SQLiteParser.expr(SQLiteParser.java:5100)
at 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()); 

我要去哪里错了吗?

Grammar link

+0

为什么不直接使用'new ANTLRInputStream(sql)'? – 2015-04-06 11:47:06

+0

@LucasTrzesniewski - 这给出了同样的错误。词法分析器中的我的令牌流为空。输出[]当我使用 CommonTokenStream cts = new CommonTokenStream(lexer); System.out.print(cts.getTokens()); – user3898179 2015-04-06 11:50:22

+0

好的,我看了一下语法 - 你应该使用'parser.parse()'而不是'parser.expr()' – 2015-04-06 11:52:53

回答

0

此代码的工作,如果它是一个Maven项目的一部分。我之前尝试将它作为Java项目运行。

谢谢