Análise sintática (computação): diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
alterei a parte sobre o analisador sintático
Etiquetas: Remoção considerável de conteúdo Editor Visual
Alterei a ordem dos conteúdos, para que fizesse mais sentido falar do mais geral primeiro para depois falar dos assuntos mais específicos.
Linha 7:
 
A vasta maioria dos analisadores sintáticos implementados em compiladores aceitam alguma [[gramática livre de contexto|linguagem livre de contexto]] para fazer a análise. Estes analisadores podem ser de vários tipos, como o [[Analisador sintático LL|LL]], [[Analisador sintático LR|LR]] e [[Analisador sintático SLR|SLR]].
 
== Analisador sintático ==
 
O analisador se trata de um software que realiza a função de carregar os dados de entrada e constrói com uma estrutura de dados com eles. Essa estrutura de dados pode se tratar de uma árvore de análise, árvore abstrata de sintaxe ou outras estruturas que dão ideia de hierarquia, par que resulte em uma representação estrutural da entrada que foi feita a análise. A análise pode proceder vários outros passos que são executados antes da própria análise, ou estes passos podem ser executados em um único passo, onde eles estarão combinados. Muitas vezes o processo realizado pelo analisador sintático é procedido pelo processo de análise léxica, já que esta análise gera como resultado uma tabela dos tokens dos dados de entrada analisados.  Os analisadores podem ser programados manualmente, ou podem ser gerados automaticamente por um gerador de analisador.   
 
                A entrada de dados que é analisada pelo analisador é normalmente um código de uma linguagem de programação, mas podem ser também textos em linguagem natural, e nesse caso não é construída uma árvore de análise, mas só são extraídas algumas partes do texto. As funções dos analisadores variam desde analisar comandos simples de um código a programas muito complexos. Uma forma importante de realizar a análise é usando expressões regulares, onde uma expressão regular define uma linguagem regular e um mecanismo de expressão regular gerando automaticamente um analisador para a linguagem. Em alguns casos as expressões regulares são usadas antes da própria análise sintática, como etapa da análise léxica cuja saída será utilizada pelo analisador sintático.
 
                O dos analisadores sintáticos varia de acordo com a entrada que ele recebe, ou seja, da linguagem de programação que ele irá analisar. Para linguagens de dados o analisador é utilizado para facilitar a leitura de um programa, já para linguagens de programação o analisador faz parte de um compilador, que analisa o código para criar uma forma de representação interna. As linguagens de programação possuem uma gramática determinística, ou seja, que não possui ambiguidade, com isso é implementado o analisador sintático referente a está gramática. A análise para o compilador pode ser feita em uma ou múltiplas passagens pelo código.
 
                Existem desvantagem em relação ao compilador de uma passagem, mas estas podem ser dribladas com a utilização de fix-ups, onde durante a passagem o fix-up realiza a função de voltar no código quando a análise de um segmento está incompleta, ao invés de continuar a passagem pelo código. Um exemplo de fix-up é o uso do comando GOTO, onde o destino desse comando é desconhecido até que seu segmento no programa seja concluído.  
 
                Gramáticas livres do contexto são limitadas, já que podem expressar todos os requisitos de um idioma e sua memória é limitada. Então essa gramática não consegue lembrar a presença de uma construção longa da entrada. E gramáticas mais poderosas que suprem essa limitação, não podem ser analisadas de forma eficiente. Logo é uma boa estratégia que a gramática livre do contexto aceite um conjunto de construções maiores da linguagem, aceitando construções inválidas, e posteriormente as construções indesejadas serão filtradas na análise semântica. Tudo isso para se obter um analisador mais descontraído para uma gramática livre do contexto.
 
Por exemplo, em Python o seguinte código é uma sintaxe válida:
y = 15 print y
O código a seguir, no entanto, é uma sintaxe válida em termos da gramática livre de contexto, produzindo uma árvore de sintaxe com a mesma estrutura que o anterior, mas é sintaticamente inválido em termos da gramática sensível ao contexto, o que requer que as variáveis ​​sejam inicializadas antes uso:
x = 20 print y
Ao invés de ser analisada na fase de análise, esta construção é capturada, verificando os valores na árvore de sintaxe, portanto, como parte da análise semântica: sintaxe sensível ao contexto é, na prática, muitas vezes mais facilmente analisada como semântica.
 
== Objetivo ==
Linha 42 ⟶ 60:
* COCO/R
* AntLR
 
== Analisador sintático ==
O analisador se trata de um software que realiza a função de carregar os dados de entrada e constrói com uma estrutura de dados com eles. Essa estrutura de dados pode se tratar de uma árvore de análise, árvore abstrata de sintaxe ou outras estruturas que dão ideia de hierarquia, par que resulte em uma representação estrutural da entrada que foi feita a análise. A análise pode proceder vários outros passos que são executados antes da própria análise, ou estes passos podem ser executados em um único passo, onde eles estarão combinados. Muitas vezes o processo realizado pelo analisador sintático é procedido pelo processo de análise léxica, já que esta análise gera como resultado uma tabela dos tokens dos dados de entrada analisados.  Os analisadores podem ser programados manualmente, ou podem ser gerados automaticamente por um gerador de analisador.   
 
                A entrada de dados que é analisada pelo analisador é normalmente um código de uma linguagem de programação, mas podem ser também textos em linguagem natural, e nesse caso não é construída uma árvore de análise, mas só são extraídas algumas partes do texto. As funções dos analisadores variam desde analisar comandos simples de um código a programas muito complexos. Uma forma importante de realizar a análise é usando expressões regulares, onde uma expressão regular define uma linguagem regular e um mecanismo de expressão regular gerando automaticamente um analisador para a linguagem. Em alguns casos as expressões regulares são usadas antes da própria análise sintática, como etapa da análise léxica cuja saída será utilizada pelo analisador sintático.
 
                O dos analisadores sintáticos varia de acordo com a entrada que ele recebe, ou seja, da linguagem de programação que ele irá analisar. Para linguagens de dados o analisador é utilizado para facilitar a leitura de um programa, já para linguagens de programação o analisador faz parte de um compilador, que analisa o código para criar uma forma de representação interna. As linguagens de programação possuem uma gramática determinística, ou seja, que não possui ambiguidade, com isso é implementado o analisador sintático referente a está gramática. A análise para o compilador pode ser feita em uma ou múltiplas passagens pelo código.
 
                Existem desvantagem em relação ao compilador de uma passagem, mas estas podem ser dribladas com a utilização de fix-ups, onde durante a passagem o fix-up realiza a função de voltar no código quando a análise de um segmento está incompleta, ao invés de continuar a passagem pelo código. Um exemplo de fix-up é o uso do comando GOTO, onde o destino desse comando é desconhecido até que seu segmento no programa seja concluído.  
 
                Gramáticas livres do contexto são limitadas, já que podem expressar todos os requisitos de um idioma e sua memória é limitada. Então essa gramática não consegue lembrar a presença de uma construção longa da entrada. E gramáticas mais poderosas que suprem essa limitação, não podem ser analisadas de forma eficiente. Logo é uma boa estratégia que a gramática livre do contexto aceite um conjunto de construções maiores da linguagem, aceitando construções inválidas, e posteriormente as construções indesejadas serão filtradas na análise semântica. Tudo isso para se obter um analisador mais descontraído para uma gramática livre do contexto.
 
Por exemplo, em Python o seguinte código é uma sintaxe válida:
y = 15 print y
O código a seguir, no entanto, é uma sintaxe válida em termos da gramática livre de contexto, produzindo uma árvore de sintaxe com a mesma estrutura que o anterior, mas é sintaticamente inválido em termos da gramática sensível ao contexto, o que requer que as variáveis ​​sejam inicializadas antes uso:
x = 20 print y
Ao invés de ser analisada na fase de análise, esta construção é capturada, verificando os valores na árvore de sintaxe, portanto, como parte da análise semântica: sintaxe sensível ao contexto é, na prática, muitas vezes mais facilmente analisada como semântica.
 
== Lookahead ==