antlr4を使用してSQLの単純なサブセットを解析しようとしています。
私の文法は次のようになります。
grammar Query;
query : select;
select : 'select' colname (',' colname)* 'from' tablename;
colname : COLNAME;
tablename : TABLENAME;
COLNAME: [a-z]+ ;
TABLENAME : [a-z]+;
WS : [ \t\n\r]+ -> skip ; // skip spaces, tabs, newlines
私はこれを次のような単純なJavaアプリケーションでテストしています。
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
public class Test {
public static void main(String[] args) throws Exception {
// create a CharStream that reads from standard input
InputStream is = new ByteArrayInputStream("select one,two ,three from table".getBytes());
ANTLRInputStream input = new ANTLRInputStream(is);
// create a lexer that feeds off of input CharStream
QueryLexer lexer = new QueryLexer(input);
// create a buffer of tokens pulled from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);
// create a parser that feeds off the tokens buffer
QueryParser parser = new QueryParser(tokens);
ParseTree tree = parser.query(); // begin parsing at init rule
System.out.println(tree.toStringTree(parser)); // print LISP-style tree
}
}
私が得る出力は次のとおりです。
line 1:27 mismatched input 'table' expecting TABLENAME
(query (select select (colname one) , (colname two) , (colname three) from (tablename table)))
私が理解していないのは、パーサーがパーサーツリーのテーブル名として「テーブル」を選択しているように見える理由ですが、それでもエラーがスローされます。私は何が欠けていますか?
ありがとう
アンドリュー