2014-04-15 2 views
2

ANTLR을 사용하여 PLSQL 파일에서 정보를 추출하려고합니다. porcelli PLSQL 문법을 사용하고 있는데, ANTLR을 사용하여 입력 된 plsql 파일에서 AST를 사용합니다. 반환 된 "CommonTree"클래스 (AST를 나타냄)를 읽고 테이블과 관련 열의 이름과 같은 다른 정보를 얻어야합니다. 방문자 패턴을 사용하여 특정 테이블의 테이블 및 관련 열에 대한 정보를 수집하는 것이 합리적이라면 생각했습니다. 예를 들어,이AST에서 정보 추출

SELECT s.name from students s, departments d WHERE d.did=10 and s.sid=d.did 

같은 질의 요소 중로부터 제 별명을 포착하고 열과 일치 포함 할 것이다 여기 테이블 이름과 관련된 열을 얻기

AST

로 AST에 도시한다 SELECT_LIST에 사용됩니다. 테이블과 열에 대한 정보는 "ANY_ELEMENT"와 같이 반복적으로 사용되는 요소 아래의 리프 노드 깊숙이 숨겨져 있습니다.

여기 방문자 패턴을 사용하는 방법을 알려주세요. 잠재적으로 많은 요소 유형이 있기 때문에 방문자가 너무 많아 질까요? 방문자 패턴이 여기에 관련됩니까?

편집

잠시 동안 그것을 통해 생각 후, 나는 Visitor 패턴이 시나리오에서 이해가되지 것입니다 결론에 근접하고있다. 방문해야 할 데이터 구조가 트리이고 잠재적으로 많은 노드 유형 (select, update, insert, delete, from, where, into ..)이 존재한다는 사실을 감안할 때 이러한 각각의 노드를 방문 할 때 일어날 일을 정의합니다 주어진 방문자에 대한 노드 유형은 방문자 클래스 당 수백 개의 메소드를 생성 할 수 있습니다!

+0

PLSQL 특정 구문을 파싱 할 예정입니까? ANTLR4에 대한 SQLite 문법이 있기 때문에 묻습니다. v4에는 방문객/수신기 지원이 훨씬 쉬워서이 작업을 크게 단순화했습니다. –

+0

예, 저는 일반 SQL뿐만 아니라 PLSQL 특정 구문을 파싱 할 것입니다. – Jay

답변

0

지난번 편집에서 업데이트 된 바와 같이, 방문자 패턴을 구현하지 않으면이 문제를 해결할 수 있습니다. 이러한 패턴을 사용하려면 모든 노드 유형을 작성해야하고 PL/SQL의 경우 너무 많을 것이기 때문입니다.