Compiladores - revisao_po2

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

oioio

Text of Compiladores - revisao_po2

  • 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: NA

Search related