Prof. Adriano Maranhão COMPILADORES · sendo executado, como em JavaScript, Python ou Perl, num...

22
COMPILADORES Prof. Adriano Maranhão

Transcript of Prof. Adriano Maranhão COMPILADORES · sendo executado, como em JavaScript, Python ou Perl, num...

COMPILADORES

Prof. Adriano Maranhão

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.

Linguagem Interpretada

Linguagem Compilada

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.

EXEMPLO

X := Y + 10

ID Cod_Atrib ID Cod_Sum Num

X := Y + 10

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;

ESPECIFICAÇÃO DOS TOKENS

Cadeias e Linguagens

Operações em Linguagens

Expressões Regulares

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)*

RECONHECIMENTO DE TOKENS

if → if

then → then

else → else

relop → <|<=|=|<>|>|>=|

id → letra (letra|dígito)*

num → dígito+ (.dígito + )?(E(+|-)?dígito +)?

delim → branco|tabulação|avanço de linha

ws → delim +