Análise de sintaxe: Compiler Top Down & Tipos de análise ascendente

Índice:

Anonim

O que é análise de sintaxe?

A análise de sintaxe é uma segunda fase do processo de design do compilador em que a string de entrada fornecida é verificada para a confirmação das regras e da estrutura da gramática formal. Ele analisa a estrutura sintática e verifica se a entrada fornecida está na sintaxe correta da linguagem de programação ou não.

A análise de sintaxe no processo de design do compilador vem após a fase de análise lexical. Também é conhecido como Parse Tree ou Syntax Tree. A Parse Tree é desenvolvida com a ajuda da gramática pré-definida do idioma. 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, ele exibirá mensagens de erro.

Processo do Analisador de Sintaxe

Neste tutorial, você aprenderá

  • Por que você precisa do Syntax Analyzer?
  • Terminologia importante do analisador de sintaxe
  • Por que precisamos de análise?
  • Técnicas de análise
  • Erro - Métodos de Recuperação
  • Gramática:
  • Convenções Notacionais
  • Gramática Livre de Contexto
  • Derivação de gramática
  • Syntax vs. Lexical Analyzer
  • Desvantagens de usar analisadores de sintaxe

Por que você precisa do Syntax Analyzer?

  • Verifique se o código é válido gramaticalmente
  • O analisador sintático ajuda você a aplicar regras ao código
  • Ajuda você a se certificar de que cada chave de abertura tem um saldo final correspondente
  • Cada declaração tem um tipo e esse tipo deve existir

Terminologia importante do analisador de sintaxe

Terminologias importantes usadas no processo de análise de sintaxe:

  • Frase: uma frase é um grupo de caracteres sobre um alfabeto.
  • Lexeme: 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 que é usado como uma 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 de ruído - as palavras de ruído 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 declaração ou expressão, "começo"… '' fim "ou {}.
  • Conjunto de caracteres - ASCII, Unicode
  • Identificadores - É uma restrição de comprimento que ajuda a diminuir a legibilidade da frase.
  • Os símbolos do operador - + e - executam 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, se não, rejeita-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.
  • Recupere de um erro para continuar e encontrar outros erros no código.
  • Não deve afetar a compilação de programas "corretos".
  • A análise deve rejeitar textos inválidos relatando 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 Bottom-Up

Análise de cima para baixo:

Na análise sintática de cima para baixo, a construção da árvore de análise começa na raiz e prossegue em direção às folhas.

Dois tipos de análise de cima para baixo:

  1. Análise preditiva:

A análise preditiva pode prever qual produção deve ser usada para substituir a string 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 essa técnica de análise. É conhecido como Analisador LL (1)

  1. Análise de descida recursiva:

Esta técnica de análise analisa recursivamente a entrada para fazer uma árvore prase. Consiste em várias pequenas funções, uma para cada não terminal da gramática.

Análise ascendente:

Na análise de baixo para cima no design do compilador, a construção da árvore de análise começa com a licença e, em seguida, é processada em direção à sua raiz. Também é chamado de análise de redução de deslocamento. Este tipo de análise no projeto do compilador é criado com a ajuda do uso de algumas 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êntese não balanceado ou ponto-e-vírgula ausente
  • Semântica : 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 ocorrer um erro, o analisador. Ele deve ser capaz de lidar com isso e continuar analisando a entrada restante. Um programa pode ter 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 de modo de declaração

  • No caso de o analisador encontrar um erro, ele o ajudará a executar as etapas corretivas. Isso permite que o restante das entradas e estados analisem antecipadamente.
  • Por exemplo, adicionar um ponto-e-vírgula ausente vem no método de recuperação do modo de instrução. No entanto, o designer da 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 errada para o delimitador, como um ponto e vírgula. Este é um método simples de recuperação de erros.
  • Nesse 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 para analisar 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.

Produções de erro

  • A recuperação da produção de erros expande a gramática da linguagem que gera as construções erradas. O analisador então executa o diagnóstico de erro sobre essa construção.

Correção Global:

  • O compilador deve fazer o menor número de alterações possível ao processar uma string de entrada incorreta. Dados a string de entrada incorreta e a gramática c, os algoritmos procurarão uma árvore de análise para uma string relacionada b. Como algumas inserções, exclusões e modificações feitas de tokens necessários para transformar um em b são o mínimo possível.

Gramática:

Uma gramática é um conjunto de regras estruturais que descrevem uma linguagem. 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 muitas, da sintaxe das linguagens de programação.

Regras da gramática da forma

  • O símbolo não terminal deve aparecer à esquerda de pelo menos uma produção
  • O símbolo do objetivo nunca deve ser exibido à direita do :: = de qualquer produção
  • Uma regra é recursiva se LHS aparecer em seu RHS

Convenções Notacionais

O símbolo das convenções de notação 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 usar o símbolo dentro da regra única. Pode ser colocado entre parênteses ([,]) quando necessário.

Dois tipos de convenções notacionais de área terminal e não terminal

1. Terminais:

  • Letras minúsculas no alfabeto, como a, b, c,
  • Símbolos do operador, 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 caixa baixa: a expressão ou algum

Gramática Livre de Contexto

Um CFG é uma gramática recursiva à esquerda que tem pelo menos uma produção do tipo. As regras em uma gramática livre de contexto são principalmente recursivas. Um analisador de sintaxe verifica se o programa específico satisfaz ou não todas as regras da gramática livre de contexto. Se isso acontecer, os analisadores de sintaxe dessas regras podem criar uma árvore de análise para esse programa.

expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id

Derivação de gramática

A derivação gramatical é uma sequência de regras gramaticais que transforma o símbolo inicial em uma string. Uma derivação prova que a string pertence ao idioma 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, ela é conhecida como derivação mais à esquerda. A forma sentencial derivada da derivação mais à esquerda é chamada de forma sentencial à esquerda.

Derivação mais à direita

Varra a derivação mais à direita e substitua 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.

Syntax vs. Lexical Analyzer

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 de origem para reconhecer estruturas significativas na linguagem de programação.

O analisador léxico reconhece o token em um programa de origem.

Ele 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

  • Ele nunca vai determinar se um token é válido ou não
  • Não ajuda a determinar se uma operação realizada 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
  • Analisar verifica se a string de entrada está bem formada e, se não, rejeita-a
  • 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
  • Léxico, sintático, semântico e lógico são alguns erros comuns que ocorrem durante o método de análise
  • Uma gramática é um conjunto de regras estruturais que descrevem uma linguagem
  • O símbolo das convenções de notação pode ser indicado colocando o elemento entre colchetes
  • Um CFG é uma gramática recursiva à esquerda que tem pelo menos uma produção do tipo
  • A derivação gramatical é uma sequência de regras gramaticais que transforma o símbolo inicial em uma 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 SGBD
  • A desvantagem do método do analisador de sintaxe é que ele nunca determinará se um token é válido ou não