Compiladores - revisao_po2

Embed Size (px)

DESCRIPTION

oioio

Citation preview

  • Compiladores II

    Prof. Dr. Leandro B. S. Marques

    email: [email protected]

  • Sumrio

    Anlise Sinttica Ascendente

    Definio de handles

    Algoritmo Shift-Reduce

    Conflitos

    MEPA

    Arquitetura

    Expresses

    Armazenamento

    Desvios

    Entrada e Sada (E/S)

    Programa e Alocao de Memria

    Procedimentos

    Parmetros por valor

    Funes

    Tabela de Smbolos

    Anlise Semntica

    Procedimentos para anlise semntica

    Exerccios

  • Introduo

    A anlise sinttica ascendente (Bottom-Up), tambm denominada de anlise redutiva (ou

    ainda Shift-Reduce), analisa uma sentena de

    entrada e tenta construir uma rvore de

    derivao, comeando pelas folhas e

    prosseguindo para a raiz, produzindo uma

    derivao mais direita, na ordem inversa.

    Podemos pensar na anlise ascendente como o processo de reduzir uma sentena de entrada a

    para o smbolo inicial S da gramtica.

  • Exemplo

    Podemos pensar na anlise ascendente como o processo de reduzir uma sentena de entrada a

    para o smbolo inicial S da gramtica.

    Seja a sentena abbcde e a gramtica a seguir:

    S aABe

    A Abc | b

    B d

  • Handles

    Handles so sequncias de smbolos que so lados direitos de produo, tais que suas

    redues levam, no final, reduo para o

    smbolo inicial da gramtica, atravs do reverso

    de uma derivao mais direita.

    Se uma gramtica G no-ambgua, ento toda forma sentencial gerada por G tem um handle.

  • Analisador Sinttico Shift-

    Reduce A anlise Bottom-Up vai necessitar:

    De uma pilha para guardar os smbolos

    De um buffer de entrada para a sentena w a ser reconhecida.

    Operaes:

    empilha (shift):

    coloca no topo da pilha o smbolo que est sendo lido e avana o cabeote de leitura na string

    reduz (reduce):

    substitui o handle no topo da pilha pelo no terminal correspondente

    aceita:

    reconhece que a sentena foi gerada pela gramtica

    erro:

    ocorrendo erro de sintaxe, chama uma subrotina de recuperao de erros

  • Exemplo

    Dada gramtica

    E E+E | E*E | (E) | id

    E a entrada id1+id2* id3, tem-se a sequncia de redues apresentada na Tabela:

  • Exerccios

    Exerccio1: Para a gramtica S SS+| SS* | a, simule o funcionamento do analisador sinttico

    ascendente para as entradas:

    SSS+a*+

  • Conflitos

    Existem gramtica livres de contexto onde o analisador sinttico shift-reduce

    conhecendo todo o contedo da pilha e o

    prximo smbolo da entrada, no capaz

    de decidir se empilha e avana ou reduz

    (conflito shift-reduce).

    Ou, no consegue decidir qual das vrias redues possveis dever ser aplicada

    (conflito reduce/reduce).

  • Algoritmos Shift-Reduce

    Algoritmos que implementam o shift-reduce:

    LR(0)

    SLR(1)

    LR(1)

    LALR(1)

  • Fases de um Compilador

    Anlise

    Sntese

  • Esqueleto do Programa Fonte

    Pr-Processador

    Programa Fonte

    Compilador

    Programa objeto em linguagem objeto

    Montador

    Cdigo de Mquina Realocvel

    Carregador

    Cdigo de mquina absoluto

    Contexto de um Compilador

  • Introduo

    Cada construo do Pascal Simplificado traduzida em uma ou mais instrues de

    linguagem assembly.

    Ao invs de traduzirmos os programas em Pascal Simplificado para linguagem de

    uma mquina real, definiremos uma

    MQUINA HIPOTTICA e geraremos

    cdigo na linguagem de montagem desta

    mquina.

  • MEPA

    MEPA Mquina de Execuo Para Pascal/C

    uma mquina virtual para execuo dos programas escritos em Pascal Simplificado

    (ou C).

    Esta mesma sigla ser utilizada para denotar a linguagem de montagem desta mquina.

  • Arquitetura

    OBS: A pilha M ser acessada em qualquer ponto e no apenas no topo.

  • Instrues MEPA p/ Operaes

  • Exemplo

    Traduzir para MEPA a seguinte expresso:

    (A+3)*(C-10)

    Notao ps-fixa:

    A 3 + C 10 - *

    Instrues MEPA:

    CRVL 38

    CRCT 3

    SOMA

    CRVL 52

    CRCT 10

    SUBT

    MULT ID Endereo Valor

    A 38 10

    B 16 2

    C 52 20

  • Comando de Atribuio

    O prximo passo atribuir o valor resultante de um expresso (no topo da

    pilha) para alguma varivel do programa.

    Atribuio em Pascal :=

    Instruo MEPA para atribuio:

  • Exemplo

    Exemplo: a = a + b * c Instrues MEPA:

    CRVL a

    CRVL b

    CRVL c

    MULT

    SOMA

    ARMZ a

  • Desvios

    Comandos Condicionais/Iterativos

    Utilizaremos rtulos simblicos em lugar de endereos de programa (interpretador da

    MEPA aceita rtulos)

  • Desvios

    if E then C1 else C2:

    . . . (E)

    DSVF L1

    . . . (C1)

    DSVS L2

    L1: NADA

    . . . (C2)

    L2: NADA

    while E do C:

    L1: NADA

    . . . (E)

    DSVF L2

    . . . (C)

    DSVS L1

    L2: NADA

  • Exerccios

    Exerccio2: traduzir para MEPA as seguintes expresses

    1) if c < 5 then a := 1 else a := 2;

    2) for b := 1 to 10 do c := c+1;

  • Comandos de Entrada e de Sada

    Exemplos:

    READ(a, b, ..., n)

    LEIT

    ARMZ a

    LEIT

    ARMZ b

    ...

    LEIT

    ARMZ n

    Exemplos:

    WRITE(a,b,c)

    CRVL 38

    IMPR

    CRVL 16

    IMPR

    CRVL 52

    IMPR

  • Exemplo

    Considere o seguinte comando em Pascal:

    write(A+B,A*3,C)

    Instrues MEPA

    CRVL 38

    CRVL 16

    SOMA

    IMPR

    CRVL 38

    CRCT 3

    MULT

    IMPR

    CRVL 52

    IMPR

  • Programas

    Faltam ainda algumas informaes para que possamos traduzir um programa simples: alocar

    e liberar variveis, iniciar mquina virtual e

    terminar mquina virtual. Estas instrues esto

    listadas abaixo:

  • Programas

    program

    ...

    var x, y: integer;

    ...

    end.

    INPP

    ...

    AMEM 2

    ...

    DMEM 2

    PARA

    Traduo para

    instrues MEPA

  • Exerccio

    Exerccio3: traduzir para MEPA o programa abaixo.

    program ex02; var a, b : integer;

    c : integer;

    begin

    read (a, b);

    if a > b then

    c := a

    else

    c := b;

    write (c);

    end.

  • Procedimentos sem Parmetros

    Ao trmino de execuo de um procedimento necessrio retornar e executar o comando que

    segue a chamada ao procedimento. Para tanto

    deve-se armazenar o endereo de tal instruo.

    Este endereo armazenado no topo da pilha

    M e recuperado quando terminar a execuo do

    procedimento.

  • Procedimentos sem Parmetros

    program

    ...

    procedure p;

    ...

    end;

    begin

    ...

    p;

    ...

    end.

    INPP

    ...

    DSVS incio

    P: NADA

    ...

    RTPR

    incio NADA

    ...

    CHPR p

    ...

    PARA

    Traduo para

    instrues MEPA

  • Exerccios

    Exerccio4: traduzir para MEPA o

    programa ao lado.

    program ex04;

    var

    numero, percentual: integer;

    procedure calcula_percentual();

    begin

    percentual := numero*0.2;

    end;

    begin

    writeln('Digite o nmero');

    readln(numero);

    calcula_percentual();

    writeln(percentual);

    end.

    ID Endereo Valor

    numero 10 10

    percentual 20 2

  • Parmetros por Valor

    Parmetros formais passados por valor comportam-se como variveis locais cujos

    valores so inicializados com valores dos

    parmetros efetivos.

  • Parmetros por Valor

    Observe como a execuo do modelo acima:

    1. Dentro do programa principal, empilha-se o parmetro (CRCT 2).

    2. Chama-se o procedimento

    3. Na sada, a instruo RTPR deve desalojar os N parmetros.

  • Exerccios

    Exerccio5: traduzir para MEPA o

    programa ao lado.

    program ex05;

    var

    a: integer;

    procedure dobro(num: integer);

    begin

    num := num*2;

    writeln(num);

    end;

    begin

    writeln('Digite o nmero');

    readln(a);

    dobro(a);

    end.

    ID Endereo Valor

    a 38 10

    num 20 2

  • Funes (retorno de valores)

    A traduo de funes semelhante chamada de procedimentos. O nome da

    funo tratado como uma varivel local

    cujo valor final deve estar no topo da

    pilha, como no caso de expresses.

  • Funes (retorno de valores)

  • Exemplo

    program funcao;

    var

    a,b : integer;

    function Soma(x1,x2:integer): integer;

    begin

    Soma := x1+x2;

    end;

    begin

    write(Entre com dois numeros: );

    readln(a,b);

    write(Soma(a,b));

    end.

    Instrues MEPA:

    INPP

    AMEM 2

    DSVS L1

    Soma: NADA

    ENPR 2

    AMEM 2

    CRVL 10

    CRVL 20

    SOMA

    ARMZ 1000

    IMPR

    DMEM 2

    RTPR Soma,2

    L1: NADA

    IMPC

    LEIT

    ARMZ 38

    LEIT

    ARMZ 16

    AMEM 1

    CHPR Soma, 2

    CRVL 1000

    IMPR

    DMEM 2

    PARA

  • Tabela de Smbolos

    Uma vez extrados do texto-fonte pelo analisador lxico, os identificadores so

    armazenados em uma tabela.

    A cada ocorrncia de um identificador no texto do programa fonte, a tabela de smbolos

    consultada ou alterada.

    Quando um objeto da linguagem est sendo declarado, o identificador a ele associado

    inserido na tabela de smbolos, caso este ainda

    no tenha sido. (se ele j existir mostre o

    ERRO: duplicao de identificador).

  • Tabela de Smbolos

    Encontrados em outros contextos, os identificadores so interpretados como

    referncias aos objetos previamente

    definidos.

    feita uma consulta a seus atributos.

    H linguagens que no necessitam de pr-declarao de objetos.

  • Tabela de Smbolos

    As tabelas de smbolos so, em geral, organizadas de um modo tal que reflitam a

    estrutura do programa fonte, guardando

    informaes sobre o escopo em que os

    identificadores so definidos.

  • Atributos

    Para cada referncia a um identificador, o compilador ter que conhecer seus

    atributos. Estas informaes so

    normalmente associadas com o

    identificador quando processada a

    declarao.

  • Atributos Varivel

    Varivel simples:

    Varivel

    Simples

    Identificador Categoria Nvel Tipo Deslocamento

  • Atributos Parmetros

    Parmetros:

    Parmetro

    Formal

    Identificador Categoria Nvel Tipo Deslocamento Passagem

  • Atributos Procedimentos

    Procedimentos

    Procedimentos N T1,P1 ... Tn,Pn

    Identificador Categoria Nvel Rtulo Parmetros Tipo/Mecan ... Tipo/Mecan

  • Organizao

    A cada referncia a um identificador, os atributos correspondentes podero ser

    obtidos na tabela, iniciando-se a busca

    deste identificador pelo topo da pilha.

    Desta maneira, fica resolvido

    automaticamente o problema da

    declarao mltipla de um mesmo

    identificador.

  • Procedimentos para Anlise

    Semntica GERA(rtulo, cdigo, par1, par2[, par3]):

    gera a instruo da MEPA que

    corresponde ao cdigo passado como

    parmetro, armazenando-a num arquivo.

    BUSCA(tomo, var k): busca o identificador na tabela de smbolos.

    Retorna em k a sua posio caso encontre,

    caso contrrio k=0.

  • Procedimentos para Anlise

    Semntica INSERE(tomo, atributos): insere na

    tabela de smbolos o identificador

    armazenado em tomo. Os atributos

    correspondentes a cada identificador

    tambm so armazenados.

    ELIMINA(n): elimina n identificadores da tabela de smbolos.

  • Procedimentos para Anlise

    Semntica PROXIMO_ROTULO(var L): calcula um

    novo rtulo e o armazena em

    L.procedimento.

  • Comando Condicional

    IF

    THEN

    ELSE

    ...

    DSVF L1

    ...

    DSVS L2

    L1 NADA

    ...

    L2 NADA

    IF

    THEN

    ...

    DSVF L1

    ...

    L1 NADA

  • Comando Condicional

    procedimento COMANDO_CONDICIONAL;

    declare L1, L2;

    incio

    ANALEX; // j foi verificada a presena do IF

    PROXIMO_ROTULO(L1);

    EXPRESSAO(t); // se t booleano ento ERRO;

    GERA(,DSVF,L1,,);

    se smbolo cdigo_then ento ERRO;

    ANALEX;

    COMANDO_SEM_ROTULO;

    ...

  • Comando Condicional

    ...

    caso smbolo

    cdigo_else:

    {PROXIMO_ROTULO(L2);

    GERA(,DSVS,L2,,);

    GERA(L1,NADA,,,);

    ANALEX;

    COMANDO_SEM_ROTULO;

    GERA(L2,NADA,,,);}

    outros: GERA(L1,NADA,,,);

    fim do caso

    fim do procedimento