그파서 단계두 개로 구성됨 부품:
그파서다음에 정의됨gram.y그리고스캔.lUnix 도구를 사용하여 빌드됨yacc그리고렉스.
그변환 프로세스그렇습니다 데이터 구조 수정 및 확대 파서가 반환했습니다.
파서는 쿼리 문자열(다음과 같이 도착함)을 확인해야 합니다. 일반 ASCII 텍스트)를 사용하여 유효한 구문을 확인하세요. 구문이 올바른 경우 a파싱 트리이 만들어지고 전달됩니다 뒤로; 그렇지 않으면 오류가 반환됩니다. 파서와 어휘 분석기는 다음과 같습니다. 잘 알려진 Unix 도구를 사용하여 구현됨yacc그리고렉스.
그렉서파일에 정의되어 있습니다.스캔.l다음을 담당하고 있습니다. 인식식별자, 그SQL 키워드등. 모든 키워드 또는 발견된 식별자, a토큰이다 생성되어 파서에 전달됩니다.
파서는 파일에 정의되어 있습니다.gram.y다음 세트로 구성됨문법 규칙그리고작업규칙이 실행될 때마다 실행됩니다. 해고되었습니다. 작업 코드(실제로는 C 코드)는 다음과 같습니다. 구문 분석 트리를 구축하는 데 사용됩니다.
파일스캔.l다음으로 변환됩니다. C 소스 파일scan.c사용 중 프로그램렉스그리고gram.y다음으로 변환됨gram.c사용 중yacc. 이러한 변환을 거친 후에는 일반적인 C 컴파일러를 사용하여 다음을 생성할 수 있습니다. 파서. 생성된 C 파일을 변경하지 마십시오. 다음번에는 덮어쓰게 됩니다렉스또는yacc호출됩니다.
참고:언급된 변환과 컴파일은 일반적으로 다음을 사용하여 자동으로 수행됩니다.메이크파일다음과 함께 배송됨포스트그레SQL출처 배포.
다음에 대한 자세한 설명yacc또는 다음에 제공된 문법 규칙gram.y범위를 벗어나는 것입니다. 이 논문. 관련된 책과 문서가 많이 있습니다.렉스그리고yacc. 당신은 다음 사항에 대해 잘 알고 있어야 합니다.yacc공부를 시작하기 전에 주어진 문법gram.y그렇지 않으면 당신은 거기서 무슨 일이 일어나는지 이해하지 못할 것입니다.
파서 단계는 고정된 규칙만을 사용하여 구문 분석 트리를 생성합니다. SQL의 구문 구조에 대해 설명합니다. 그것은 아무것도 만들지 않습니다 시스템 카탈로그를 조회하므로 다음과 같은 가능성은 없습니다. 요청된 작업의 자세한 의미를 이해합니다. 파서가 완료된 후,변환 과정나무를 건네받는다 파서에 의해 입력으로 반환되고 의미 체계를 수행합니다. 어떤 테이블, 함수, 연산자는 쿼리에서 참조됩니다. 데이터 구조 이 정보를 나타내기 위해 만들어진 것을쿼리 트리.
원시 구문 분석과 의미 분석을 분리하는 이유 시스템 카탈로그 조회는 거래를 시작하고 싶지 않습니다. 쿼리 문자열을 받자마자 즉시. 원시 구문 분석 단계는 거래 통제를 식별하기에 충분합니다. 명령(시작, 롤백등), 그러면 이러한 내용이 올바르게 표시될 수 있습니다. 더 이상의 분석 없이 실행되었습니다. 일단 우리가 우리라는 것을 알게 되면 실제 쿼리 처리(예:선택또는업데이트), 그렇죠 아직 거래 중이 아닌 경우 거래를 시작해도 괜찮습니다. 그래야만 변환 프로세스가 호출될 수 있습니다.
변환 프로세스에 의해 생성된 쿼리 트리는 다음과 같습니다. 대부분의 경우 원시 구문 분석 트리와 구조적으로 유사하지만 세부적으로는 많은 차이점이 있습니다. 예를 들어,FuncCall분석 트리의 노드는 다음을 나타냅니다. 구문론적으로 함수 호출처럼 보이는 것입니다. 이 다음 중 하나로 변환될 수 있습니다.FuncExpr또는Aggref노드 여부에 따라 다름 참조된 이름은 일반 함수이거나 집계 함수. 또한, 실제 데이터에 대한 정보 열 유형 및 표현식 결과가 쿼리에 추가됩니다. 나무.