Prof. Adriano Maranhão COMPILADORES · sendo executado, como em JavaScript, Python ou Perl, num...
-
Upload
truongtuyen -
Category
Documents
-
view
226 -
download
0
Transcript of Prof. Adriano Maranhão COMPILADORES · sendo executado, como em JavaScript, Python ou Perl, num...
LINGUAGENS: INTERPRETADAS X COMPILADAS
Resumo:
Linguagem compilada:
Se o método utilizado traduz todo o texto do programa,para só depois executar o programa, então diz-se que oprograma foi compilado e que o mecanismo utilizadopara a tradução é um compilador. A versão compiladado programa é armazenada, de forma que o programapode ser executado um número indefinido de vezes semque seja necessária nova compilação, o que compensao tempo gasto na compilação. Isso acontece comlinguagens como Pascal e C.
LINGUAGENS: INTERPRETADAS X COMPILADAS
Linguagem Interpretada:
Se o texto do programa é traduzido à medida que vaisendo executado, como em JavaScript, Python ou Perl,num processo de tradução de trechos seguidos de suaexecução imediata, então diz-se que o programa foiinterpretado e que o mecanismo utilizado para atradução é um interpretador. Programas interpretadossão geralmente mais lentos do que os compilados, massão também geralmente mais flexíveis, já que podeminteragir com o ambiente mais facilmente.
VANTAGENS DA DIVISÃO EM ANÁLISE LÉXICA E
SINTÁTICA:
Projeto mais simples. Diminui acomplexidade do analisador sintático quenão precisa mais lidar com estruturas forasde seu escopo como tratamento decaracteres vazios.
Melhorar a eficiência do compilador.Técnicas de otimização específicas para oanalisador léxico.
Melhor portabilidade. Particularidades dalinguagem fonte podem ser tratadasdiretamente pelo analisador léxico.
Analisador léxicoAnalisador
sintático
Programa
fonte
Envia token
Solicita novo token
Tabela de
símbolos
CENÁRIO
ANÁLISE LÉXICA
Análise léxica é o processo de analisar a
entrada de linhas de caracteres e produzir
uma seqüência de símbolos chamado
"símbolos léxicos", ou somente "símbolos"
(tokens), que podem ser manipulados mais
facilmente por um leitor de saída.
TOKENS
Os tokens constituem classes de símbolos taiscomo palavras reservadas, delimitadores,identificadores, etc, e podem ser representados,internamente, através do próprio símbolo (comono caso dos delimitadores e das palavrasreservadas) ou por um par ordenado, no qual oprimeiro elemento indica a classe do símbolo, e osegundo, um índice para uma área onde o própriosímbolo foi armazenado (por exemplo, umidentificador e sua entrada numa tabela deidentifidadores).
TABELA DE SÍMBOLOS
É uma estrutura de dados gerada pelo compiladorcom o objetivo de armazenar informações sobreos nomes (identificadores de variáveis, deparâmetros, de funções, de procedimentos, etc)definidos no programa fonte. Essa tabela associaatributos (tipo, escopo, limites no caso de vetorese número de parâmetros no caso de funções) aosnomes que foram definidos pelo programador. Aconstrução dessa tabela, em geral, se dá durantea análise léxica, quando os identificadores sãoreconhecidos.
ACESSO A TABELA DE SÍMBOLOS
Listas lineares - é o mecanismo mais simples, mas seu desempenho é pobre quando o número de consultas é elevado.
Árvores binárias
Tabelas hash - têm melhor desempenho, mas exigem mais memória e esforço de programação.
OBSERVAÇÃO
Para desempenhar a análise léxica, o
compilador deve ter conhecimento de quais
são os tokens válidos da linguagem, assim
como suas palavras chaves e regras para
formação de identificadores. Por exemplo, a
declaração
Exemplo: int 1var;
CADEIAS E LINGUAGENS
Alfabeto ou classe de caracteres: qualquer conjunto finito de símbolos. Alfabeto binário {0,1}
EBCDIC e ASCII
Cadeia, sentença ou palavra: nome dada a uma seqüência finita de símbolos retiradas de uma alfabeto Ex: banana, 010101000001
O comprimento de um palavra, denotado por |s|, corresponde ao número de símbolos requeridos para sua construção
Linguagem: denota qualquer conjunto de cadeias sobre algum alfabeto fixo Ǿ, {€}, conjunto de todos os programas Pascal e sentenças
sintaticamente corretas do português
OPERAÇÕES EM LINGUAGENS
Prefixo: cadeia obtida pela remoção de zero ou mais símbolos no fim da cadeia. Ex: ban é um prefixo de banana.
Sufixo: cadeia obtida pela remoção de zero ou mais símbolos no inicio da cadeia. Ex: nana é um sufixo de banana.
Subcadeia: cadeia obtida pela remoção de um prefixo e de um sufixo. Ex: nan.
Subseqüência: cadeia formada pela remoção de símbolos, não necessariamente contíguos. Ex: baaa é uma subseqüência de banana.
União: qualquer cadeia pertencente a um dos dois conjuntos. L U M = { s|s está em L ou s está em M} sendo L e M linguagens duas qualquer.
OPERAÇÕES EM LINGUAGENS
Concatenação: LM = {st|s está em L e t está
em M}
Fechamento Kleene (L*): zero ou mais
concatenações de L.
Fechamento positivo (L+): uma ou mais
concatenações de L.
OPERAÇÕES EM LINGUAGENS - EXEMPLOS
L U D
LD
L4
L*
L (L U D)*
D+
Conjunto de letras e dígitos.
Conjunto de cadeias formadas por uma letra seguida por um dígito. Ex: a1
Conjunto de cadeias formadas por 4 letras. Ex: abcd
Conjunto de cadeias formadas por zero ou mais letras. Ex: a, ab, bb, bbc, ...
Conjunto de todas as cadeias de letras e dígitos que comecem com uma letra
Conjunto de todas as cadeias de um ou mais dígitos
EXPRESSÕES REGULARES
Notação especial para definição de cadeias de uma linguagem
Identificador Pascall
letra (letra|dígito)*
Caractere | é igual a ou
* significa zero ou mais instâncias
A justaposição de letras significa concatenação destas
Ex: a|b {a,b}
(a|b)(a|b) {aa, ab, ba, bb}
a* {ε, a, aa, aaa, ...}
(a|b)*
Se duas expressões regulares denotam a mesma linguagem, dizemos que são equivalentes e representamos r=s. Ex: (a|b) = (b|a)
EXPRESSÕES REGULARES
Definições regulares
Expressões regulares podem ser nomeadas e estes
nomes podem ser utilizados para definição de
novas expressões
Ex:
letra : A|B|...|Z|a|b|...|z
digito : 0|1|...|9
id : letra(letra|digito)*