theParser Stage두 부분으로 구성됩니다.
the파서정의gram.y
andscan.l
UNIX 도구를 사용하여 구축되었습니다BisonandFlex.
the변환 과정파서가 반환 한 데이터 구조를 수정 및 확대합니다.
파서는 유효한 구문에 대해 쿼리 문자열 (일반 텍스트로 도착)을 확인해야합니다. 구문이 올바른 경우 aParse Tree가 세워져 나눠졌습니다. 그렇지 않으면 오류가 반환됩니다. Parser와 Lexer는 잘 알려진 UNIX 도구를 사용하여 구현됩니다.BisonandFlex.
theLexer파일에 정의되어 있습니다scan.l
인식의 책임식별자, TheSQL 키워드등. 발견 된 모든 키워드 또는 식별자에 대해 A토큰가 생성되어 파서에게 건네집니다.
파서는 파일에 정의되어 있습니다gram.y
| 세트로 구성문법 규칙및행동규칙이 해고 될 때마다 실행됩니다. 동작 코드 (실제로 C 코드)는 구문 분석 트리를 구축하는 데 사용됩니다.
파일scan.l
C 소스 파일로 변환scan.c
프로그램 사용Flexandgram.y
로 변환gram.c
사용Bison. 이러한 변환이 발생한 후 정상적인 C 컴파일러를 사용하여 파서를 생성 할 수 있습니다. 다음에 덮어 쓰기 때문에 생성 된 C 파일을 변경하지 마십시오Flex또는Bison호출.
언급 된 변환 및 컴파일은 일반적으로를 사용하여 자동으로 수행됩니다.MakeFiles토토 커뮤니티소스 배포.
자세한 설명Bison또는 문법 규칙에 주어진 문법 규칙gram.y
이 매뉴얼의 범위를 벗어납니다. 다루는 많은 책과 문서가 있습니다FlexandBison. 당신은 익숙해야합니다Bison당신이 주어진 문법을 공부하기 전에gram.y
그렇지 않으면 어떤 일이 일어나는지 이해하지 못할 것입니다.
파서 스테이지는 SQL의 구문 구조에 대한 고정 규칙 만 사용하여 구문 분석 트리를 만듭니다. 시스템 카탈로그에서 조회하지 않으므로 요청 된 작업의 상세한 의미를 이해할 가능성이 없습니다. 파서가 완료되면변환 과정파서가 입력으로 트리를 전달하고 쿼리에서 참조되는 테이블, 기능 및 연산자를 이해하는 데 필요한 의미 적 해석을 수행합니다. 이 정보를 표현하기 위해 구축 된 데이터 구조를라고합니다.쿼리 트리.
시맨틱 분석에서 원시 파싱을 분리하는 이유는 시스템 카탈로그 조회가 트랜잭션 내에서만 수행 될 수 있으며 쿼리 문자열을 수신하면 즉시 트랜잭션을 시작하지 않기 때문입니다. 원시 구문 분석 단계는 트랜잭션 제어 명령을 식별하기에 충분합니다 (시작
, 롤백
등), 그리고 더 이상의 분석없이 올바르게 실행할 수 있습니다. 우리가 실제 쿼리를 다루고 있다는 것을 알게되면 (예 :select
또는업데이트
), 우리가 아직 하나가 아닌 경우 거래를 시작해도 괜찮습니다. 그래야만 변환 프로세스를 호출 할 수 있습니다.
변환 프로세스에 의해 생성 된 쿼리 트리는 대부분의 장소에서 원시 구문 분석 트리와 구조적으로 유사하지만 자세한 차이가 있습니다. 예를 들어, AFUNCCALL
구문 분석 트리의 노드는 함수 호출처럼 구문으로 보이는 것을 나타냅니다. 이것은 둘 중 하나로 변형 될 수 있습니다funcexpr
또는aggref
참조 이름이 일반 함수인지 집계 함수로 판명되는지에 따라 노드. 또한 쿼리 트리에 실제 데이터 유형 및 표현식 결과에 대한 정보가 추가됩니다.
문서에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면