Análise de sintaxe: tipos de análise de cima para baixo e de baixo para cima do compilador
O que é análise de sintaxe?
Análise de sintaxe é uma segunda fase do processo de design do compilador na qual a string de entrada fornecida é verificada quanto à confirmação das regras e da estrutura da gramática formal. Analisa a estrutura sintática e verifica se a entrada fornecida está ou não na sintaxe correta da linguagem de programação.
O processo de análise de sintaxe no design do compilador vem após a fase de análise lexical. Também é conhecida como Árvore de Análise ou Árvore de Sintaxe. A Árvore de Análise é desenvolvida com a ajuda da gramática pré-definida da linguagem. O analisador de sintaxe também verifica se um determinado programa cumpre as regras implícitas em uma gramática livre de contexto. Se for satisfatório, o analisador cria a árvore de análise desse programa de origem. Caso contrário, exibirá mensagens de erro.
Por que você precisa do Analisador de Sintaxe?
- Verifique se o código é válido gramaticalmente
- O analisador sintático ajuda você a aplicar regras ao código
- Ajuda você a garantir que cada chave de abertura tenha um saldo de fechamento correspondente
- Cada declaração tem um tipo e esse tipo deve existir
Terminologia importante do analisador de sintaxe
Terminologias importantes utilizadas no processo de análise de sintaxe:
- Frase: Uma frase é um grupo de caracteres em algum alfabeto.
- Lexema: Um lexema é a unidade sintática de nível mais baixo de uma linguagem (por exemplo, total, início).
- Token: Um token é apenas uma categoria de lexemas.
- Palavras-chave e palavras reservadas – É um identificador usado como parte fixa da sintaxe de uma instrução. É uma palavra reservada que você não pode usar como nome de variável ou identificador.
- Palavras barulhentas – Palavras ruidosas são opcionais e são inseridas em uma declaração para melhorar a legibilidade da frase.
- Comentários – É uma parte muito importante da documentação. É exibido principalmente por /* */ ou //Em branco (espaços)
- Delimitadores – É um elemento sintático que marca o início ou o fim de alguma unidade sintática. Como uma instrução ou expressão, “begin”…”end” ou {}.
- Conjunto de caracteres -ASCII, Unicode
- Identificadores – É uma restrição de comprimento que ajuda a reduzir a legibilidade da frase.
- Operasímbolos tor – + e – executa duas operações aritméticas básicas.
- Elementos sintáticos da linguagem
Por que precisamos de análise?
Uma análise também verifica se a string de entrada está bem formada e, caso contrário, rejeite-a.
A seguir estão tarefas importantes executadas pelo analisador no design do compilador:
- Ajuda você a detectar todos os tipos de erros de sintaxe
- Encontre a posição em que ocorreu o erro
- Descrição clara e precisa do erro.
- Recuperação de um erro para continuar e encontrar mais erros no código.
- Não deve afetar a compilação de programas “corretos”.
- A análise deve rejeitar textos inválidos reportando erros de sintaxe
Técnicas de análise
As técnicas de análise são divididas em dois grupos diferentes:
- Análise de cima para baixo,
- Análise de baixo para cima
Análise de cima para baixo
Na análise de cima para baixo, a construção da árvore de análise começa na raiz e depois prossegue em direção às folhas.
Dois tipos de análise de cima para baixo são:
- Análise Preditiva:
A análise preditiva pode prever qual produção deve ser usada para substituir a sequência de entrada específica. O analisador preditivo usa o ponto de antecipação, que aponta para os próximos símbolos de entrada. O retrocesso não é um problema com esta técnica de análise. É conhecido como analisador LL(1)
- Análise de descida recursiva:
Esta técnica de análise analisa recursivamente a entrada para formar uma árvore de prase. Consiste em várias pequenas funções, uma para cada não-terminal da gramática.
Análise de baixo para cima
Na análise ascendente no design do compilador, a construção da árvore de análise começa com a folha e depois processa em direção à sua raiz. Também é chamado de análise de redução de deslocamento. Este tipo de análise no design do compilador é criado com a ajuda de alguns ferramentas de software.
Erro – Métodos de recuperação
Erros comuns que ocorrem na análise do software do sistema
- Lexical: Nome de um identificador digitado incorretamente
- Sintático: parênteses desequilibrados ou ponto e vírgula ausente
- Semântico: atribuição de valor incompatível
- lógico: Loop infinito e código inacessível
Um analisador deve ser capaz de detectar e relatar qualquer erro encontrado no programa. Portanto, sempre que ocorreu um erro, o analisador. Deve ser capaz de lidar com isso e continuar analisando a entrada restante. Um programa pode apresentar os seguintes tipos de erros em vários estágios do processo de compilação. Existem cinco métodos comuns de recuperação de erros que podem ser implementados no analisador
Recuperação em modo de instrução
- Caso o analisador encontre um erro, ele ajuda você a tomar medidas corretivas. Isso permite que o restante das entradas e estados sejam analisados adiante.
- Por exemplo, adicionar um ponto e vírgula ausente ocorre no método de recuperação do modo de instrução. No entanto, o designer de análise precisa ter cuidado ao fazer essas alterações, pois uma correção errada pode levar a um loop infinito.
Recuperação em modo de pânico
- No caso em que o analisador encontra um erro, este modo ignora o resto da instrução e não processa a entrada da entrada errada para o delimitador, como um ponto e vírgula. Este é um método simples de recuperação de erros.
- Neste tipo de método de recuperação, o analisador rejeita os símbolos de entrada um por um até que um único grupo designado de tokens de sincronização seja encontrado. Os tokens de sincronização geralmente usam delimitadores como ou.
Recuperação em nível de frase
- O compilador corrige o programa inserindo ou excluindo tokens. Isso permite que ele prossiga a análise de onde estava. Ele executa a correção na entrada restante. Ele pode substituir um prefixo da entrada restante por alguma string, o que ajuda o analisador a continuar o processo.
Erro Produções
- A recuperação de produção de erros expande a gramática da linguagem que gera as construções erradas. O analisador então realiza diagnósticos de erros sobre essa construção.
Correção Global
- O compilador deve fazer o menor número possível de alterações ao processar uma string de entrada incorreta. Dada a string de entrada a e a gramática c incorretas, os algoritmos procurarão uma árvore de análise para uma string relacionada b. Como algumas inserções, exclusões e modificações feitas em tokens, necessárias para transformar an em b é o mínimo possível.
Gramática
Uma gramática é um conjunto de regras estruturais que descrevem uma linguagem. As gramáticas atribuem estrutura a qualquer frase. Este termo também se refere ao estudo dessas regras, e este arquivo inclui morfologia, fonologia e sintaxe. É capaz de descrever muitos, da sintaxe de linguagens de programação.
Regras da gramática da forma
- O símbolo não terminal deve aparecer à esquerda de pelo menos um símbolo de produção
- O símbolo do gol nunca deve ser exibido à direita de ::= de qualquer produção
- Uma regra é recursiva se LHS aparecer em seu RHS
Convenções Notacionais
O símbolo das convenções notacionais pode ser indicado colocando o elemento entre colchetes. É uma sequência arbitrária de instâncias do elemento que pode ser indicada colocando o elemento entre colchetes seguido por um símbolo de asterisco, {…}*.
É uma escolha da alternativa que pode utilizar o símbolo dentro da regra única. Pode ser colocado entre parênteses ([,] ) quando necessário.
Dois tipos de convenções notacionais na área Terminal e Não-terminais
1. Terminais:
- Letras minúsculas do alfabeto, como a, b, c,
- Operasímbolos como +,-, *, etc.
- Símbolos de pontuação, como parênteses, hash, vírgula
- 0, 1,…, 9 dígitos
- Strings em negrito como id ou if, qualquer coisa que represente um único símbolo de terminal
2.Não terminais:
- Letras maiúsculas como A, B, C
- Nomes em itálico em minúsculas: a expressão ou alguns
Gramática livre de contexto
Uma CFG é uma gramática recursiva à esquerda que possui pelo menos uma produção desse tipo. As regras de uma gramática livre de contexto são principalmente recursivas. Um analisador de sintaxe verifica se um programa específico satisfaz ou não todas as regras da gramática livre de contexto. Se atender, os analisadores de sintaxe dessas regras podem criar uma árvore de análise para esse programa.
expression -> expression -+ term expression -> expression – term expression-> term term -> term * factor term -> expression/ factor term -> factor factor factor -> ( expression ) factor -> id
Derivação Gramática
A derivação gramatical é uma sequência de regras gramaticais que transforma o símbolo inicial na string. Uma derivação prova que a string pertence à linguagem da gramática.
Derivação mais à esquerda
Quando a forma sentencial de entrada é digitalizada e substituída na sequência da esquerda para a direita, isso é conhecido como derivação mais à esquerda. A forma sentencial derivada da derivação mais à esquerda é chamada de forma sentencial à esquerda.
Derivação mais à direita
A derivação mais à direita verifica e substitui a entrada pelas regras de produção, da direita para a esquerda, sequência. É conhecido como derivação mais à direita. A forma sentencial derivada da derivação mais à direita é conhecida como forma sentencial à direita.
Sintaxe vs. Analisador Lexical
Analisador de Sintaxe | Analisador Lexical |
---|---|
O analisador de sintaxe lida principalmente com construções recursivas da linguagem. | O analisador léxico facilita a tarefa do analisador de sintaxe. |
O analisador de sintaxe funciona em tokens em um programa fonte para reconhecer estruturas significativas na linguagem de programação. | O analisador léxico reconhece o token em um programa fonte. |
Recebe entradas, na forma de tokens, de analisadores lexicais. | É responsável pela validade de um token fornecido por
o analisador de sintaxe |
Desvantagens de usar analisadores de sintaxe
- Nunca determinará se um token é válido ou não
- Não ajuda você a determinar se uma operação executada em um tipo de token é válida ou não
- Você não pode decidir que o token é declarado e inicializado antes de ser usado
Resumo
- A análise de sintaxe é uma segunda fase do processo de design do compilador que vem após a análise lexical
- O analisador sintático ajuda você a aplicar regras ao código
- Frase, Lexeme, Token, Palavras-chave e palavras reservadas, Palavras de ruído, Comentários, Delimitadores, Conjunto de caracteres, Identificadores são alguns termos importantes usados na Análise de Sintaxe na construção do Compilador
- O Parse verifica se a string de entrada está bem formada e, caso contrário, rejeite-a
- As técnicas de análise são divididas em dois grupos diferentes: Análise Top-Down, Análise Bottom-Up
- Lexical, sintático, semântico e lógico são alguns erros comuns que ocorrem durante a análise do método
- Uma gramática é um conjunto de regras estruturais que descrevem uma linguagem
- O símbolo das convenções notacionais pode ser indicado colocando o elemento entre colchetes
- Uma GFC é uma gramática recursiva à esquerda que possui pelo menos uma produção do tipo
- A derivação gramatical é uma sequência de regras gramaticais que transforma o símbolo inicial na string
- O analisador de sintaxe lida principalmente com construções recursivas da linguagem, enquanto o analisador léxico facilita a tarefa do analisador de sintaxe em DBMS
- A desvantagem do método analisador de sintaxe é que ele nunca determinará se um token é válido ou não