3
antlr4를 사용하여 SQL의 간단한 하위 집합을 구문 분석하려고합니다.간단한 antlr4 문법의 입력 오류가 일치하지 않습니다.
내 문법은 다음과 같습니다
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
다음과 같이 나는 간단한 자바 응용 프로그램이 테스트입니다 :
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)))
필자가 이해할 수없는 것은 파서가 파서 트리의 tablename으로 "table"을 선택하는 것처럼 보이지만 아직 또한 오류가 발생합니다. 내가 뭘 놓치고 있니?
감사
앤드류
고마워요. 고쳐졌습니다. 미래에 그것을 피하는 방법을 알고 있습니다. –