progra de sistemas 5.4 - 4.5

download progra de sistemas 5.4 - 4.5

of 28

Transcript of progra de sistemas 5.4 - 4.5

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    1/28

    5.4 Acciones agregadas en un

    analizador sintctico descendente

    (top-down)

    Muchas de las actividades que realiza un

    analizador semntico no son estndares,dependern del objetivo del lenguaje de

    programacin; por ejemplo, en algunas

    aplicaciones es interesante conocer que los

    datos estn en algn rango vlido o que

    ciertos valores se utilicen para uso reservado

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    2/28

    Acciones agregadas a un analizador

    semntico En algunas ocasiones nos interesa conocer el

    significado de las palabras de algn lenguaje

    dependiendo del contexto (gramticas de tipo 1)para diferenciar palabras polisemnticas.

    La Web es una base de datos en la mayora de

    los casos sin sentidos por lo que la tercerageneracin de la Web ser la llamada Web

    semntica

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    3/28

    En un parser recursivo-descendente, el cdigo de las acciones semnticas esmezclado dentro del flujo de control de las acciones del parser. En un parserespecificado en javaCC, las acciones semnticas son fragmentos de cdigo deprograma en java unido a las producciones gramticales.

    Cada smbolo terminal y noterminal puede asociarse con su propio tipo de valorsemntico.

    Por ejemplo en la siguiente gramtica para YACC de una calculadora simple, el tipoasociado con exp e INTpodra ser int:

    %token INT PLUS MINUS TIMES UMINUS

    %start exp

    %left PLUS MINUS

    %left TIMES

    %left UMINIS

    exp: INT | exp PLUS exp | exp MINUS exp | exp TIMES exp 1

    MINUS exp %prec UMINUS

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    4/28

    (cont.)

    Los otros tokens no necesitaran tener unvalor.

    Por otra parte el tipo asociado a un token

    debe por supuesto coincidir con el tipo detoken que el scanner retorne.

    Para una regla ABCD, la accin semnticadebe retornar un valor cuyo tipo es el

    asociado al noterminal A. Pero puedeconstrur este valor de los valores asociados alos terminales y noterminales B, C, D.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    5/28

    Recursivo-descendente

    En un parser recursivo-descendente, las accionessemnticas son los valores retornados por las funcionesde parsing, o los efectos laterales de esas funciones oambos.

    Por cada smbolo terminal y noterminal, asociamos untipo (desde el lenguaje de implementacin del LP delcompilador) de valor semntico representando frasesderivadas desde ese smbolo.

    El siguiente programa es un intrprete recursivo

    descendente para una parte de la gramtica en la cualeliminamos la recursin por la izquierda (porconveniencia la volvemos a mostrar):

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    6/28

    (cont.)

    S E$ ETE E + TEE- TE EP

    TFT T* FTT/FTTP

    F id Fnum F(E)

    Los tokens ID y NUM deben ahora acarrear valores de tipo string e int,

    respectivamente. Asumiremos que existe una tabla lookup que mapea

    identificadores a enteros. El tipo asociado con E, T, F, etc., es int, y la accin semntica

    es fcil de implementar.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    7/28

    Interprete

    class Token2 {

    int kind; Object val;

    Token2(int k, Object v)

    {

    kind=k;

    val=v;

    }

    }

    final int EOF=0, ID=1, NUM=2, PLUS=3,MINUS=4,LPAREN=5,RPAREN=6, TIMES=7;

    int lookup(String id) { . }

    int F_follow[] = {PLUS,TIMES,RPAREN,EOF};

    int F() {switch(tok.kind) {

    case ID: int i=lookup((String)(tok.val));advance()return i;

    case NUM: int i=((integer)(tok.val)).intVal();

    advance();return i;

    case LPAR

    EN: eat(LPAR

    EN);int i=E();

    eatOrSkipTo(RPAREN,F_follow);

    return i;

    case EOF:

    default: print("1 esperaba ID,NUM, o parent izq");

    //skipto(F_follow); return 0;

    }}

    int T_follow[]= {PLUS,RPAREN,EOF};

    int T() {switch(tok.kind) {

    case ID:

    case NUM:

    case LPAREN: return Tprime(F());

    default: print("2 esperaba ID, NUM o parent izq");

    //skipto(T_follow);

    return 0;

    }}

    int Tprime(int a) {switch (tok.kind) {

    case TIMES: eat(TIMES); return Tprime(a*F());

    case PLUS:

    case RPAREN:

    case EOF: return a;

    default: print("3 esperaba ID, NUM o parent izq");

    //skipto(T_follow);return 0;

    }}

    void eatOrSkipTo(int expected, int[] stop) {

    if (tok.kind==expected)

    eat(expected);

    else {print("4 esperaba ID, NUM o parent izq");

    //skipto(stop);}

    }

    Acciones semnticas

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    8/28

    Parser Automticamente generado

    Una especificacin del parser para javaCC consistira de un conjunto de reglas gramaticales,

    cada una anotada o agregada con una accin semntica el cual sera un estatuto java.

    Ejemplo:

    void Start():{ int i; }

    { i=Exp() {System.Out.println(i);}

    }

    Int Exp():

    { int a,i; }

    { a=Term()

    ( + i=Term() {a=a+i;}

    | - i=Term() {a=a-i;})*

    { return a; }

    }

    Int Term():{ int a,i; }

    { a=factor()

    ( * i=Factor() {a=a*i;}

    | / i=Factor() {a=a/i;}

    )*

    { return a; }

    }

    Int Factor():

    { Token t; int i; }

    { t= { return lookup(t.image); }

    | t=

    {return Integer.parseInt(t.image); }

    | ( i=Exp() ) {return i; }

    }

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    9/28

    rboles de Parsing Abstractos

    Para mejorar la modularidad del compilador, es recomendable separar detalles de la sintaxis

    con detalles de la semntica (chequeo de tipos y traduccin a cdigo mquina).

    Una forma de hacerlo es producir un rbol de sintaxis abstracta (una forma condensada de

    rbol de parsing til para representar construcciones del LP).

    Por ejemplo la produccin S ifB then S1 else S2 pudiera aparecer en un arbol sintctico

    como:

    If-then-else

    B S1 S2

    En un rbol sintctico, los operadores y las palabras claves (reservadas) no

    aparecen como hojas, sino que estn asociadas con el nodo interior que sera el

    padre de esas hojas en el arbol de parsing.

    Est-if

    If Exp ( Exp ) Est

    rbol

    De

    parsing

    rbol

    sintctico

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    10/28

    (cont.)

    Otro ejemplo es en el rbol de parsing:

    L

    E + T

    T * F F

    F 4 8

    2

    Cuyo rbol sintctico abstracto sera:

    +

    * 8

    2 4

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    11/28

    Ejemplo:

    La gramtica siguiente nos muestra una sintaxis abstractade un lenguaje para expresiones:

    EE+E EE-E EE*E

    EE/E Eid Enum Esta gramtica es imprctica para un parser ya que es

    ambigua pues no tiene precedencia de operadores.

    Sin embargo, esta gramtica no es para el parser. Elanalizador semntico podra usarla el cual no se molestapor la ambiguedad puesto que ya tiene su arbol.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    12/28

    rboles de Sintaxis en Java

    En Java las estructuras de datos para el rbol

    de sintaxis contienen una clase abstracta para

    cada noterminal y una subclase para cada

    produccin. As, las clases de el programa

    siguiente son las clases de la sintaxis abstracta

    para la gramtica de la diapositiva anterior.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    13/28

    public abstract class ExpCh4 {

    public abstract int eval();

    }

    class PlusExp extends ExpCh4 {

    private ExpCh4 e1,e2;

    public PlusExp(ExpCh4 a1, ExpCh4 a2)

    {e1=a1; e2=a2;}

    public int eval() {

    return e1.eval()+e2.eval();

    }

    }

    class MinusExp extends ExpCh4 {

    private ExpCh4 e1,e2;

    public MinusExp(ExpCh4 a1, ExpCh4 a2)

    {e1=a1; e2=a2;}

    public int eval() {

    return e1.eval()-e2.eval();

    }

    }

    class TimesExp extends ExpCh4 {

    private ExpCh4 e1,e2;

    public TimesExp(ExpCh4 a1, ExpCh4 a2)

    {e1=a1; e2=a2;}

    public int eval() {

    return e1.eval()*e2.eval();

    }

    }

    class DivideExp extends ExpCh4 {

    private ExpCh4 e1,e2;

    public DivideExp(ExpCh4 a1, ExpCh4 a2)

    {e1=a1; e2=a2;}

    public int eval() {

    return e1.eval()/e2.eval();

    }

    }

    class Identifier extends ExpCh4 {

    private String f0;

    public Identifier(String n0) {f0=n0;}

    public int eval() {

    return (7); //return lookup(f0);

    }

    }class IntegerLiteral extends ExpCh4 {

    private String f0;

    public IntegerLiteral(String n0) {f0=n0;}

    public int eval() {

    return (4);

    //return Integer.parseInt(f0);

    }

    }

    Programa de clases para Exp

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    14/28

    (cont.)

    Ahora veamos un intrprete para el lenguaje de expresiones de lagramtica de seccin 4.1.1. Por conveniencia la mostramos de nuevo.

    S E$

    ETE E + TEE- TE EPTFT T* FTT/FTTP

    F id Fnum F(E)

    Nuestro intrprete primero construye rbolessintcticos y despus los interpreta. El siguiente cdigo

    es el de la gramtica JavaCC con acciones semnticas parainterpretar (evaluar) y producir (construir) rbolessintcticos. Cada clase de nodos de rbol sintcticocontiene una funcin eval que cuando es llamada retornael valor de la expresin representada.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    15/28

    Gramtica con acciones semnticas para rboles

    sintcticos

    PARSER_BEGIN(InterSinTree)

    class InterSinTree {}

    PARSER_END(InterSinTree)

    TOKEN: {

    |

    |

    }

    SKIP: {

    |" "

    |"\t"

    |"\n"

    |"\r"

    }

    ExpCh4 Start():

    { ExpCh4 e; }

    { e=Exp()

    {System.out.println(e.eval()); return e; }

    }

    ExpCh4 Exp():

    { ExpCh4 e1,e2; }

    { e1=Term()

    ("+" e2=Term() { e1=new PlusExp(e1,e2);}

    |"-" e2=Term() { e1=new MinusExp(e1,e2);})*

    { return e1;}

    }

    ExpCh4 Term():

    { ExpCh4 e1,e2; }

    { e1=Factor()

    ("*" e2=Factor() { e1=new TimesExp(e1,e2);}

    |"/" e2=Factor() { e1=new DivideExp(e1,e2);}

    )*

    { return e1;}

    }

    ExpCh4 Factor() :

    { Token t; ExpCh4 e; }

    { (t=

    {return new Identifier(t.image); } |

    t=

    {return new IntegerLiteral(t.image); } |

    "(" e=Exp() ")" {return e; })

    }

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    16/28

    VISITADORES

    Es una tcnica de patrones (opuesta a la orientada aobjetos) que se puede usar para implementar el rbolsintctico del compilador o intrprete. Un visitador es unobjeto que contiene un mtodo visit por cada clase de

    rbol sintctico. Cada clase de rbol sintctico debecontener un mtodo accept. Cada mtodo accept sirvecomo enganche para cada diferente tipo de operacinsobre el rbol y es llamado por un visitador donde tiene

    una tarea: pasar el control de ida y venida (back andforth) entre el visitador y las clases del rbol sintctico.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    17/28

    (cont.)

    A continuacin veremos un ejemplo del

    intrprete de expresiones anterior pero ahora

    implementado con visitadores. Cada visitador

    implementa la interfase Visitor. Cada mtodo

    accept toma un visitador como argumento y

    cada mtodo visit toma un objeto de un nodo

    del rbol sintctico como argumento.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    18/28

    Sintxis Abstracta para MiniJava

    En la siguiente figura (siguiente diapositiva) mostramos las clases de lasintaxis abstracta para minijava. Solo los constructores son mostrados enla figura. Cada una de las clases de listas se implementa en la mismaforma. Por ejemplo:

    publicclass ExpList {

    private Vector list;publicExpList() {

    list=newvector();

    }

    PublicvoidaddElement (Exp n) {

    list.addElement(n);

    }

    publicExp elementAt(inti) {

    return (exp)list.elementAt(i);

    }

    publicint size() {

    return list.size();

    }

    }

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    19/28

    Package syntaxtree;

    Program(MainClass m, ClassDeclList cl)

    MainClass(Identifier i1, Identifier i2, Statement s)

    Abstractclass ClassDecl

    ClassDeclSimple(Identifier i, VarDeclList vl, MethodDeclList ml)

    ClassDeclExtends(Identifier i, identifier j, VarDeclList vl, MethodDeclList ml)

    VarDecl(Type t, Identifier i)

    MethodDecl(Type t, Identifier i, FormalList fl, VarDeclList vl, StatementList,Exp e)

    Formal(Type t, Identifier i)

    Abstractclass Type

    IntArrayType() BooleanType() IntegerType() IdentifierType(String s)

    Abstractclass StatementBlock(StatementList sl)

    If(Exp e, Statement s1, Statement s2)

    While(Exp e, Statement s)

    Print(Exp e)

    Assign(Identifier i, Exp e)

    ArrayAssign(Identifier i, Exp e1, Exp e2)

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    20/28

    (cont. figura)

    Abstractclass Exp

    And(Exp e1, Exp e2)

    LessThan(Exp e1, Exp e2)

    Plus(Exp e1, Exp e2) Minus(Exp e1, Exp e2) Times(Exp e1, Exp e2)

    ArrayLoockup(Exp e1, Exp e2)

    ArrayLength(Exp e)

    Call(Exp e, Identifier i, ExpList el)

    IntegerLiteral(int i)True()

    False()

    IdentifierExp(String s)

    This()

    NewArray(Exp e)

    NewObject(Identifier i)

    Not(Exp e)

    Identifier(String s)

    Listclasses

    ClassDeclList() ExpList() FormalList() MethodDeclList()

    StatementList() VarDeclList()

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    21/28

    Arbol Sintctico

    Cada una de las clases que no son listas tiene

    un mtodo acceptpara usarse con el patrn

    visitador. La interface Visitador se muestra en

    la siguiente diapositiva.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    22/28

    public interface Visitor {

    public void visit(Program n);

    public void visit(MainClass n);

    public void visit(ClassDeclSimple n);

    public void visit(ClassDeclextends n);

    public void visit(VarDecln);

    public void visit(MethodDecln);

    public void visit(Formal n);public void visit(IntArrayType n);

    public void visit(BooleanType n);

    public void visit(IntegerType n);

    public void visit(IdentifierType n);

    public void visit(Block n);

    publicvoid visit(If n);

    public void visit(While n);

    public void visit(Print n);

    public void visit(Assign n);

    public void visit(ArrayAssign n);

    public void visit(And n);public void visit(LessThan n);

    public void visit(Pluss n);

    public void visit(Minus n);

    public void visit(Timesn);

    public void visit(ArrayLoockup n);

    public void visit(ArrayLength n);

    public void visit(Call n);

    public void visit(IntegerLiteral n);

    public void visit(True n);

    public void visit(False n);

    public void visit(IdentifierExp n);public void visit(This n);

    public void visit(NewArray n);

    public void visit(NewObject n);

    publicvoid visit(Not n);

    public void visit(Identifier n);

    }

    Visitador

    MiniJava

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    23/28

    (cont. Arbol Sintctico)

    Podemos construir un rbol sintctico usando expresiones newanidadas.Por ejemplo el rbol sintctico para el estatuto MiniJava:

    x= y.m(1,4+5);

    usara el siguiente cdigo:

    ExpList el= newExpList();

    el.addElement(new IntegerLiteral(1));

    el.addelement(new Plus(new IntegerLiteral(4),

    new IntegerLiteral(5)));

    Statement s = newAssign(new Identifierx),

    new Call(newidentifierExp(y),

    new Identifier(m),

    el));

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    24/28

    5.5 Pila semntica en un

    analizador sintctico ascendente

    (bottom-up). El diseo ascendente se refiere a la

    identificacin de aquellos procesos que

    necesitan computarizarse con forme vayanapareciendo, su anlisis como sistema y su

    codificacin, o bien, la adquisicin de

    paquetes de software para satisfacer elproblema inmediato.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    25/28

    Pila semntica

    Los problemas de integracin entre los

    subsistemas son sumamente costosos y

    muchos de ellos no se solucionan hasta que

    la programacin alcanza la fecha limite para

    la integracin total del sistema.

    Se necesita una memoria auxiliar que nos

    permita guardar los datos intermedios para

    poder hacer la comparacin.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    26/28

    5.6 Administracin de la tabla de

    smbolos

    La tabla de smbolos tambin recibe el

    nombre de ambiente. Un ambiente contiene

    un conjunto de parmetros que slo sonvisibles en ese ambiente.

    La tabla de smbolos se mantiene durante

    todo el proceso de traduccin agregandoelementos especficos en cada paso.

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    27/28

    Operaciones sobre la tabla de

    smbolos

    Inserta(smbolo)

    Existe(nombre)

    Tipo(nombre)

    Declaracin TIPO {tipo=obtengo(yytext());} listavar PYC

    Listavar var {inserta(smbolo);} | var

    {inserta(simbolo);}

    Var ID {simbolo=yytext; smbolo.tipo=tipo;

    simbolo.amb=ambito;}

  • 8/7/2019 progra de sistemas 5.4 - 4.5

    28/28

    Operaciones sobre la tabla de

    smbolos

    ExprlogPI exprlog {A=A;} PD

    |NOT exprlog {A=A;}

    |exprlog {A1=A;} OPLOG exprlog

    {A2=A

    If(A1==INT && A2==INT)

    A=INT;

    Else

    A=ERROR_TIPO;}