Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 41. Visão geral da estrutura interna do PostgreSQL | Fim | Próxima |
O estágio de análise consiste de duas partes:
O analisador definido em gram.y e scan.l é construído utilizando as ferramentas do Unix lex e yacc.
O processo de transformação faz modificações e ampliações nas estruturas de dados retornadas pelo analisador.
O analisador (parser) precisa verificar a validade da cadeia de caracteres (que chega como texto ASCII puro) com relação à sintaxe. [1] Se a sintaxe estiver correta, é construída uma árvore de análise e enviada de volta; senão, é retornada uma condição de erro. O analisador e o analisador léxico [2] (lexer) são implementados utilizando as ferramentas bem conhecidas do Unix yacc e lex.
O analisador léxico é definido no arquivo scan.l, sendo responsável pelo reconhecimento dos identificadores, das palavras chave do SQL, etc. Para toda palavra chave ou identificador encontrado é gerado um símbolo (token [3] [4] [5] [6] ), e enviado para o analisador.
O analisador é definido no arquivo gram.y, e consiste de um conjunto de regras gramaticais [7] e ações executadas sempre que uma regra é disparada. O código das ações (que na verdade é um código C) é utilizado para construir a árvore de análise.
O arquivo scan.l é transformado no arquivo de código fonte C scan.c utilizando o programa lex, e gram.y é transformado em gram.c utilizando o yacc. Após estas transformações serem feitas, pode ser utilizado um compilador C normal para criar o analisador. Não devem ser feitas modificações nos arquivos C gerados, uma vez que estes são sobrescritos quando se executa o lex ou o yacc.
Nota: Normalmente as transformações e compilações mencionadas são realizadas automaticamente utilizado os arquivos Makefile presentes na distribuição do código fonte do PostgreSQL.
Uma descrição detalhada do yacc, ou das regras gramaticais contidas em gram.y, estão acima do escopo desta documentação. Existem vários livros e documentos que tratam do lex e do yacc. Deve-se estar familiarizado com o yacc antes de começar a estudar a gramática contida no arquivo gram.y, senão vai ser impossível entender o conteúdo deste arquivos.
O estágio de análise cria uma árvore de análise utilizando somente regras fixadas sobre a estrutura sintática do SQL. Não faz qualquer procura nos catálogos do sistema, portanto não tem possibilidade de compreender os detalhes da semântica [8] das operações requisitadas. Após o término da análise, o processo de transformação recebe a árvore retornada pelo analisador como entrada, e faz a interpretação semântica necessária para compreender quais tabelas, funções e operadores são referenciados pelo comando. A estrutura de dados construída para representar esta informação é chamada de árvore de comando.
O motivo para separar a análise intacta (raw) da análise semântica é que a procura nos catálogos do sistema só pode ser feita dentro de uma transação, e não se deseja iniciar uma transação imediatamente após receber a cadeia de caracteres do comando. O estágio de análise intacta é suficiente para identificar os comandos de controle de transação (BEGIN, ROLLBACK, etc.), e os que podem ser executados corretamente sem mais análise. Uma vez descoberto que está se lidando com um comando verdadeiro (como SELECT ou UPDATE), é correto iniciar a transação caso já não se esteja em uma. Somente então o processo de transformação pode ser chamado.
A árvore de comando criada pelo processo de transformação é estruturalmente semelhante à árvore de análise intacta na maioria dos lugares, mas possui muitas diferenças nos detalhes. Por exemplo, um nodo FuncCall na árvore de análise representa algo que se parece sintaticamente com uma chamada de função. Pode ser transformado em um nodo FuncExpr ou Aggref, dependendo do nome referenciado ser uma função comum ou uma função de agregação. Também são adicionadas à árvore de comando as informações sobre o verdadeiro tipo de dado das colunas e dos resultados das expressões.
[1] |
sintaxe — do Lat. syntaxe < Gr. sýntaxis, arranjo, disposição — parte da estrutura gramatical de uma língua que contém as regras relativas à combinação das palavras em unidades maiores (como as orações), e as relações existentes entre as palavras dentro dessas unidades. PRIBERAM - Língua Portuguesa On-Line. (N. do T.) |
[2] |
léxico — do Gr. léxicon, relativo às palavras — dicionário de línguas clássicas antigas; dicionário abreviado; conjunto dos vocábulos de uma língua; dicionário dos vocábulos usados num domínio especializado (ciência, técnica). PRIBERAM - Língua Portuguesa On-Line. (N. do T.) |
[3] |
token — gramática — Uma unidade básica da linguagem, gramaticalmente indivisível, como uma palavra chave, um operador ou um identificador. FOLDOC - Free On-Line Dictionary of Computing (N. do T.) |
[4] |
SQL Server — token — Na procura de texto integral (full-text search), uma palavra ou uma cadeia de caracteres identificada por um quebrador de palavra (word breaker). SQL Server 2005 Books Online — Glossary of Terms (N. do T.) |
[5] |
DB2 — Os tokens são as unidades sintáticas básicas do SQL. O token é uma seqüência de um ou mais caracteres. O token não pode conter caracteres branco, a menos que seja uma constante cadeia ou um identificador delimitado, que podem conter brancos. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |
[6] |
token — [processamento de dados] s. indicação, f.; marca, f.; símbolo, m.; sinal, m.; unidade distinguível em uma seqüência de caracteres. token | Portuguese | Dictionary & Translation by Babylon (N. do T.) |
[7] |
gramática — do Lat. grammatica < grammatike — estudo ou tratado dos fatos da linguagem falada e escrita e das leis que a regulam; livro que contém as regras e os princípios que regem o funcionamento de uma língua; PRIBERAM - Língua Portuguesa On-Line. (N. do T.) |
[8] |
semântica — do Gr. semantiké, da significação — estudo da linguagem humana do ponto de vista do significado das palavras e dos enunciados. PRIBERAM - Língua Portuguesa On-Line. (N. do T.) |