Diferenças entre edições de "Análise sintática (computação)"

474 bytes removidos ,  22h29min de 2 de dezembro de 2015
alterei a parte sobre o analisador sintático
m (Desfeita(s) uma ou mais edições de 200.20.228.15, com Reversão e avisos.)
(alterei a parte sobre o analisador sintático)
Etiquetas: Editor Visual Remoção considerável de conteúdo
 
== 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.   
O analisador sintático utiliza diversos conceitos da ciência da computação como por exemplo a estrutura de dados: árvore é um exemplo. Ao receber os dados do analisador léxico no caso do compilador ele verifica se a sintaxe está correta.
 
                A entrada parade umdados analisadorque deé textoanalisada pelo analisador é muitasnormalmente vezesum código de algumauma linguagem de computadorprogramação, mas pode tambémpodem ser umtambém textotextos em linguagem natural, oue dados textuais menos estruturado,nesse caso emnão queé geralmente apenas certas partes do texto são extraídos, em vez deconstruída uma árvore de análise, amas ser construída.são Oextraídas analisadoralgumas sintáticopartes variamdo detexto. As funções muitodos simples,analisadores comovariam scanf,desde aanalisar programascomandos complexos, tais como a interfacesimples de um compiladorcódigo Delphia ouprogramas omuito analisador de XML de um webservicecomplexos. Uma classeforma importante de realizar a análise simples é feito usando expressões regulares, em queonde uma expressão regular define uma linguagem regular e um mecanismo de expressão regular gerando automaticamente um analisador para que a linguagem, permitindo correspondência de padrão e extração de texto. Em outro contextoalguns casos as expressões regulares são usadas antes da própria análise sintática, como a etapa doda léxicoanálise léxica cuja saída éserá então utilizadoutilizada pelo analisador sintático.
Um analisador sintático é um componente de software que leva os dados de entrada (freqüência de texto) e constrói uma estrutura de dados - muitas vezes uma espécie de árvore de análise, árvore abstrata de sintaxe ou outra estrutura hierárquica - dando uma representação estrutural da entrada, verificação de sintaxe correta no processo . A análise pode ser precedido ou seguido por outros passos, ou estes podem ser combinados num único passo. O analisador é muitas vezes precedida por um analisador lexical separada, o que cria tokens de a seqüência de caracteres de entrada; Alternativamente, estes podem ser combinados em scanners. Analisadores podem ser programados manualmente ou pode ser automática ou semi-automática gerada por um gerador de analisador. O analisador sintático modelado completamente para produzir uma saída formatada. Estas podem ser aplicadas a diferentes domínios, mas aparecem frequentemente em conjunto, tal como o par scanf / printf, ou as fases de um compilador de entrada e de saída.
 
                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.
A entrada para um analisador de texto é muitas vezes de alguma linguagem de computador, mas pode também ser um texto em linguagem natural ou dados textuais menos estruturado, caso em que geralmente apenas certas partes do texto são extraídos, em vez de uma árvore de análise a ser construída. O analisador sintático variam de funções muito simples, como scanf, a programas complexos, tais como a interface de um compilador Delphi ou o analisador de XML de um webservice. Uma classe importante de análise simples é feito usando expressões regulares, em que uma expressão regular define uma linguagem regular e um mecanismo de expressão regular gerando automaticamente um analisador para que a linguagem, permitindo correspondência de padrão e extração de texto. Em outro contexto as expressões regulares são usadas antes da análise, como a etapa do léxico cuja saída é então utilizado pelo analisador.
 
                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.  
O uso de analisadores varia de acordo com a entrada. No caso de linguagens de dados, um analisador é frequentemente encontrada como a facilidade de leitura do ficheiro de um programa, tal como a leitura de texto HTML ou XML; estes exemplos são linguagens de marcação. No caso de linguagens de programação, um analisador é um componente de um compilador ou intérprete, que analisa o código-fonte de uma linguagem de programação de computador para criar alguma forma de representação interna; o analisador é um passo fundamental no frontend compilador. As linguagens de programação tendem a ser especificado em termos de uma gramática livre de contexto determinista porque analisadores rápidos e eficientes podem ser escritos para eles. Para compiladores, a própria análise pode ser feito em uma passagem ou passagens múltiplas - ver compilador de uma passagem e compilador multi-pass.
 
                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.
As desvantagens implícitas de um compilador de uma passagem pode ser largamente superados adicionando fix-ups, em que está prevista para fix-ups durante a passagem para a frente, e os fix-ups são aplicados para trás quando o segmento actual programa tem sido reconhecido como tendo sido completada. Um exemplo em que um tal mecanismo fix-up seria útil seria uma declaração GOTO para a frente, onde o destino da GOTO é desconhecido até o segmento de programa seja concluído. Neste caso, a aplicação da correcção-se-ia ser atrasada até que o alvo da GOTO foi reconhecido. Obviamente, um GOTO para trás não exige uma correção-up.
 
Gramáticas livres de contexto são limitados na medida em que pode expressar todos os requisitos de um idioma. Informalmente, a razão é que a memória de um tal linguagem é limitada. A gramática não consegue lembrar a presença de uma construção mais de uma arbitrariamente longo de entrada; isto é necessário para um idioma em que, por exemplo, um nome deve ser declarado antes que pode ser referenciada. Gramáticas mais poderosas que podem expressar esta limitação, no entanto, não pode ser analisado de forma eficiente. Assim, é uma estratégia comum para criar um analisador descontraído para uma gramática livre de contexto que aceita um superconjunto das construções de linguagem desejados (isto é, ele aceita algumas construções inválidas); mais tarde, as construções indesejados podem ser filtrados na etapa de análise semântica (análise contextual).
 
Por exemplo, em Python o seguinte código é uma sintaxe válida:
y = 1015 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 ==
Utilizador anónimo