2012-12-20 1 views
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"을 선택하는 것처럼 보이지만 아직 또한 오류가 발생합니다. 내가 뭘 놓치고 있니?

감사

앤드류

답변

10

같은 일치하는 두 렉서 규칙 (적어도이 아닌 동일한 모드/상태 ...) 할 수 없습니다 :

... 
COLNAME: [a-z]+ ; 
TABLENAME : [a-z]+; 
... 

대신이 작업을 수행을 :

grammar Query; 
query  : select; 
select : 'select' colname (',' colname)* 'from' tablename; 
colname : ID; 
tablename : ID; 
ID  : [a-z]+; 
WS  : [ \t\n\r]+ -> skip; 
+1

고마워요. 고쳐졌습니다. 미래에 그것을 피하는 방법을 알고 있습니다. –