apuntes programacion de sistemas

58
Temario. Unidad 1. Repaso de sintaxis. 1.1 Gramática de un lenguaje. 1.2 Descenso recursivo. Unidad 2. Semántico. 2.1 Forma interna del programa fuente. Notación polaca. Cuádruplos. 2.2 Rutinas semánticas. Expresiones aritméticas. Estatutos condicionales. Unidad 3. Generación de código. 3.1 Cuádruplos. 3.2 Notación polaca. Expresiones aritméticas. Expresiones condicionales. 3.3 Optimización de código. Unidad 4. Administración de la memoria principal. 4.1 Paginación. 4.2 Segmentación. 4.3 Paginación-Segmentación.

Upload: blackinvader

Post on 17-Dec-2015

42 views

Category:

Documents


3 download

DESCRIPTION

Guia

TRANSCRIPT

  • Temario.Unidad 1. Repaso de sintaxis.1.1 Gramtica de un lenguaje.1.2 Descenso recursivo.

    Unidad 2. Semntico.2.1 Forma interna del programa fuente. Notacin polaca. Cudruplos.2.2 Rutinas semnticas. Expresiones aritmticas. Estatutos condicionales.

    Unidad 3. Generacin de cdigo.3.1 Cudruplos.3.2 Notacin polaca. Expresiones aritmticas. Expresiones condicionales.3.3 Optimizacin de cdigo.

    Unidad 4. Administracin de la memoria principal.4.1 Paginacin.4.2 Segmentacin.4.3 Paginacin-Segmentacin.

  • Gramtica.Conjunto de reglas que determinan un un lenguaje.

    Sintxis.Verifica que la secuencia de tokens sea vlida para un lenguaje.

    Tipos de gramtica.1. Irrestricta. x y en donde x tiene por lo menos un elemento no terminal.

    2. Contexto sensitivo o sensitiva al contexto. x y x 0 (no permite producciones con el elemento vacio)

    3. Libre de contexto. x y x = 1 y es un elemento no terminal. y >= 0

    Tipos de gramtica libre de contexto.Lineal izquierdo.Lineal derechoRecursiva izquierdoRecursiva derechoRecursiva central

  • Lineal izquierdo.Es la derivacin en donde tan solo el no terminal de ms a la izquierda de cualquier forma de frase se sustituye a cada paso. x y z wwzyxLineal derecha.Es la derivacin en donde tan solo el no terminal de ms a la derecha de cualquier forma de frase se sustituye a cada paso. x y z wxyzwRecursiva izquierda.Es la derivacin en donde tan solo el no terminal de ms a la izquierda se sustituye a cada paso recursivamente es decir a si misma. a | d b c cbaa

  • Recursivo derecho.Es la derivacin en donde tan solo el no terminal de ms a la derecha se sustituye a cada paso recursivamente es decir a si misma. a | d b c

    aabcRecursiva central.Es la derivacin en donde tan solo el no terminal del centro se sustituye a cada paso recursivamente es decir a si misma. a b c d e

    acedb

    Ejemplos:Libre de contexto. if then x y a b | x | = 1 > | < | Y | >= 0 x y Puede tener vacio =

  • Contexto sensitivo. x y a y no permite vacioa b d c

    Irrestricta. Sin restricciones. a bDerivacin.Consiste en sustituir los elementos no terminales por sus producciones.Ejemplo: IF then Se sustituye de izquierda a derecha IF a b then IF a

  • De el ejemplo anterior........

    P={S, X, Y, op, opA}S={S}V={a, if, b, then, x, y, =, >, >}V={S, X, Y, op, opA}

    Cmo se representa una gramtica grficamente?

    Diagrama de sintxis. Direccin

    Terminales

    No terminales

    Patrones ms comunes.

    a) Secuencia de smbolos.

    a b

  • b) Alternativa de smbolos.

    real | char | int

    c) Repeticin de smbolos.

    a a

    Ejemplos:

    realcharint

  • fun id ; | prac id

    (id;):TIPOXY ( : ) var | id ; id char | int | real

    Validar la siguientes cadenas:(var id;id:real) ( : ) (var : ) (var id : ) (var id ; id : ) (var id ; id : ) (var id ; id : real)

    var

  • fun id (id : char); real

    fun id ; fun id ; fun id ( : ) ; fun id ( : ) ; fun id ( id : ) ; fun id ( id : ) ; fun id ( id : char ) ; real

  • Anlisis Sintctico Descendente.Anlisis Sintctico por descenso recursivo.Anlisis Sintctico recursivo. (predictivo).

    Anlisis Sintctico Ascendente.Anlisis sintctico LR-Simple.Anlisis sintctico LR-Cannico.Anlisis sintctico LALR (lookahead-LR)

    Anlisis sintcticoPrograma SintcticoTabla de anlisis sintctico predictivo

    (Matriz predictiva)PILABuffer de entradaSalida de producciones --> + --> b --> a

    a+b$

    Y+ZX$

  • Un analizador sintctico esta guiado por tablas, tiene un buffer de entrada, una pila, y una tabla de anlisis sintctico y tambin una salida.

    El buffer de entrada contiene la cadena que se va a analizar seguida de un smbolo de pesos ($), un smbolo utilizado como delimitador derecho para indicar el fin de la cadena.

    La pila contiene una secuencia de smbolos gramaticales con un smbolo de pesos en la parte inferior que indica la base de la pila, al principio la pila contiene el smbolo inicial de la gramtica encima del signo de pesos. La tabla de anlisis sintctico es una matriz bidimensional de la forma M [A,a] en donde A es un no terminal y donde a es el smbolo terminal o bien el signo de $, se controla el analizador sintctico mediante un programa que se comporta como sigue:

    Sea X el smbolo superior de la pila y a el smbolo en curso de la entrada: estos dos smbolos determinan la accin del analizador y tienen las siguientes acciones:

    1)Si x = a = $ El string es vlido.2)Si x = a $ Se saca x de la pila Se mueve el apuntador al siguiente smbolo o analizador en curso.

    3)Si x es un no terminal el programa consulta la entrada de M [X,a] de la tabla de la matriz de anlisis sintctico.

    Esta entrada ser o una produccin de x de la gramtica o una entrada de error. Si, por ejemplo, M [X,a] es igual a x que produce uvw osea M [X,a] = {X+} el analizador sintctico sustituye la x de la cima de la pila por + quedando en la parte de encima de la como salida, se sabe que el analizador sintctico solo imprime la produccin utilizada; ah se podra utilizar cualquier otro cdigo. Si M [X,a] = error ; el analizador sintctico llama a una rutina de recuperacin de error e indica el tipo de error que a ocurrido.

  • Ventajas:Programacin medianamente corta.Medianamente fcil de programar.

    Desventajas.Un mantenimiento no sencillo.

    Restricciones.Solo para gramticas libres de contexto.Se tiene que eliminar la recursividad izquierda y factorizar si es necesario. (No debe haber 2 elementos en una sola de las casillas de la matriz predictiva)

    Ejemplo:1) 2) + 3) 4) 5) * 6) 7) id8) ()

    Validar la siguiente cadena: Id + id

    A continuacin se dar una corrida a la gramtica para saber si la cadena es vlida

  • PILAENTRADASALIDA$ Id+id$1) $Id+id$4) $Id+id$7) id$ idId + id $6) $2) + $++ id $4) $Id $7) id$idId $$$6) $$3) $$Cadena vlida

  • Primeros y siguientes.Se facilita la construccin de una analizador sintctico predictivo con 2 funciones asociadas a una gramtica (G). Estas funciones P y S permiten rellenar siempre que sea posible las entradas de una tabla de anlisis sintctico predictivo para una gramtica.Tambin se puede utilizar los conjuntos de componentes lxicos devueltos por la funcin S como componentes lxicos de sincronizacin durante la recuperacin de errores.Si es una cadena de smbolos gramaticales se considera primeros de como el conjunto de terminales que inician las cadenas derivadas de .Si entonces el vaco tambin est en primeros de .Se define siguientes de A para el no terminal de A, como el conjunto de terminales de A que pueden aparecer inmediatamente a la derecha de A en alguna forma de frase, es decir, el conjunto de terminales de A tal que halla una derivacin de la forma S Aa para algn y .Primeros. Primero () es el conjunto de smbolos terminales que inician cualquier derivacin de .Clculo:a) Si X es un smbolo terminal, entonces primeros () = X b) Si X es un smbolo no terminal, entonces para cada produccin del tipo x 1, 2........ n1) Incluir primeros de (i) el primeros de (X)2) De i=1 hasta n-1Si est incluido en primeros de (i) incluir en primeros de (i+1).3) Tomando como base el punto anterior, si vaco est incluido en primeros de (i) hasta primeros de (n) incluir vacio en primeros de (X).

  • Ejemplo: a op P = {P} = {op, }P = {op, }

    Siguientes.X YZ1) Si X es la primera produccin de la gramtica se incluye $ en siguientes de X.2) Los siguientes de Y son:a) Si Z es un terminal se incluyen los primeros (Z) en siguientes (Y) a excepcin del vaco.b) Si Z es un no terminal se incluyen los primeros (Z) en siguientes de Y a excepcin del vaco.3) Los siguientes de Z son, si Z es el ltimo trmino de la produccin, se incluyen los siguientes de esa produccin en siguientes de Z.No se incluye el vaco en vez de esto se incluyen los siguientes de la produccin que genera el vaco.Ejemplo: 1) 2) + 3) 4) 5) * 6) 7) id8) ()

  • Primeros.P() = {P()} = {id, ( } P() = {+, }P() = {P()} = {id, ( }P() = { *, }P() = {id, ( }

    Siguientes.

    S(< E>) = { $, )}S() = {S(), S() } = { $, ) }S() = {P()} = { +, S()} = { +, $, ) }S() = {S(), S()} = { +, $, ) }S() = {P()} = { *, S() } = { *, +, $, ) }

    Construccin de la matriz predictiva.Para cada produccin A realizar lo siguiente:a) Para cada smbolo terminal en primero de () agregar A en M[A, ]b) Si esta contenido en primero (), entonces para cada smbolo terminalen sig (A), agregar M en [A,$] 2. Cada espacio de la matriz indefinido hace error.

    A continuacin se muestra un ejemplo de cmo construir la matriz predictiva, se utiliz la gramtica anterior para obtener los first y los follows.

  • VV$id()+*error11errorerrorerror

    3errorerror32error

    error44errorerrorerror

    6errorerror665error78errorerrorerror

    PILAENTRADASALIDA(producciones)$Id*id+id$1$Id*id+id$4$Id*id+id$7$idId *id+id$5$**id+id$7$idid+id$6$2$++id$4$Id$7$idId$6$$3$$Cadena vlida

  • Ejercicio:Realizar primeros, siguientes, matriz predictiva y validar las siguientes cadenas:bmdm, fd, fdm 1) d 2) m3) 4) b 5) 6) f checar gramatica7) g

    Primeros.P() = {P(), m, } = {b, m, }P() = {P()} = {b, }P() = {b, }P() = {f, g}Siguientes.S() = {S(), S()} = {f, g, $}S() = {d}S() = {P()} = {f, g}S() = {S()} = {d}

    T NbmdfG$12error 1 1error3errorerror33error4errorerror55errorerrorerrorerror67error

  • bmdmfd

    PILAENTRADASALIDA$bmdm$1$dbmdm$3$dbmdm$4$dbbmdm$2$dmmdm$error

    PILAENTRADASALIDA$fd$1$dfd$3$dfd$5$dfd$6$dffd$$ $Cadena no vlida

  • fdm1) if then else end2) id id3) >4) , < }P() = { id }P() = { +, -, * }P() = { id }P() = { := }Siguientes.S() = { $ }S() = { then }S() = { id }S() = { else }S() = { id }S() = { end }S() = { id }

    Ifthenelseendid>B then A:=B*CElse A:=C*DendifPila operandosPila operadoresPila de saltos

    ABR1ABCR2ACDR2

    >:=*:=*

    25

    #operop1op2Res1>ABR12SFR163*BCR24:=A-R25SI86*CDR37:=A-R3

  • Estatuto REPEAT

    RepeatSUntilE56OP1

    /*3Acciones.1, 2, 3, 4. Son igual a las anteriores del if.5. PUSH pila_saltos (la direccin del siguiente cudruplo a analizar) = cont6Generar cudruplo y SF de la sig forma:Op2 = Tope pila_operandosOp1 = Tope pila_operandosOper = Tope pila_operadoresRn = Rn + 1 e insertar en pila_op

  • Generar un SF con lo que est en el tope pila_operandos y rellenar la direccin de este salto con tope pila_saltos y sacar.Ejemplo:X=1Y=2Z=3Repeat X:=Y + Z Z:=Y + 1Until Z 10Y=010ZR21YZR1ZYXPila de operandosPila de operadoresPila de saltosR34

    :=+>=

    #operop1op2Rn1:=X-12:=Y-23:=Z-34+YZR15:=X-R16+Y1R27:=Z-R28>=Z10R39SFR3410:=Y0

  • Estatuto FOR.

    FORid:=EXPTOdoSendforEXP29684573Acciones.

    1Insertar en la pila de operandos el siguiente id.2Insertar el id en pila_operandos3Insertar el := en la pila de operadores.4Insertar EXP y generar cudruplo(s) de la sig forma:Res = Top_pila de operandos sacar de la pila Op1 = Top_pila de operandos sacar de la pila Op2 = Nulo Oper = Top_pila de operadores sacar de la pila5Insertar en la pila de saltos (el siguiente cudruplo a analizar ) . Cont + 16Insertar la EXP (id) p_oper y generar cudruplo de la siguiente forma:Op2 = tope pila_operandos. (POP)Op1 = tope pila_operandos. (POP)Oper = >Res = Rn + 1 e insertar Rn + 1 en la pila de operandos.7Hacer un salto verdadero con tope pila_operandos i dejar la direccin pendiente por rellenar, e insertar pila de saltos su direccin.8Generar cudruplos.9Hacer un SI con TOP 1 (pila_saltos) y rellenar.Rellenar (top_pila_saltos, cont + 1)

  • Pila de operandosPila de operadoresPila de saltos> SV< SFEjemplo:For i:= 0 to 10 do A:=A+1 i:=i+1endfor

    #operop1op2Res1=i02>i10R13SVR194+A1R25:=R2A6+I1R37=R3i8SI29

    ii010R1A1AR2i1

    :=++

    23

  • Acciones.

    1Insertar EXP en la pila de operandos.2Insertar OPC en la pila de operandos y hacer un cuadruplo de la siguiente forma:Op2 = Top_pila de operandos sacar de pilaOp1 = Top_pila operandos utilizar y no sacar de la pilaOper = =Res = Rn + 1 e insertar en pila_operandos.Hacer un SF con Top_pila_operandos y dejar direccin pendiente por rellenar e insertar la direccin del SF en la pila de saltos.3Generar cudruplos de resultantes.Hacer un salto incondicional y dejar la direccin pendiente por rellenar e insertar la direccin del SI en la pila_saltos.Rellenar(top 1 pila_saltos, cont + 1) y Rellenar (top 1 ,cont).4Generar cudruplos.6.Rellenar (top_pila_saltos, cont + 1)5Sacar lo que est en la pila de operandos.

    caseEXPofOPC:ESTelseESTendcaseEstatuto CASE123546

  • Pila operandosPila operadoresPila saltosEjemplo:

    Case A of1: read(B);2: A:=A+BElsewrite(A);A

    #operop1op2Res1=A1R12SFR153ReadX4SI95=A2R26SFR2107+ABR38:=ANULOR39SI1110WriteA

    R3BAAR22XR11A

    Write+:=read

    9642

  • whileEdoSenddo8675Estatuto WHILEAcciones.

    1, 2, 3, 4. IgualPUSH pila_saltos(el siguiente cudruplo a analizar) = cont + 1Generar cudruplo e insertar Rn en la pila.Generar un salto en falso con tope de pila de operandos dejar la direccin pendiente por rellenar e insertar la direccin en la pila de saltos.Generar un salto incondicional con lo que est en el (top-1 pila_saltos) yrellenar (pila_saltos, cont+1)

    3

  • Pila de saltosPila de operandosPila de operadoresEjemplo:

    While X

  • Para incluir los tipos de las variables en la tabla de smbolos podemos efectuar las siguientes acciones.

    id:TIPO;12Acciones.

    1PUSH pila_operandos (direccin de la variable).2Poner el tipo a todas las variables que se metieron en la pila de operandosy sacarlas de la pila.Id1 = 1, 1Id2 = 1, 2 Id3 = 1, 312341Reglas semnticas.Utilizaremos como referencia las reglas semnticas de las expresiones en Pascal, para esto construiremos una tabla donde:

    E = enteroR = realC = caracterS = stringB = booleanox = error semntico

    1,3Real1,2Real1,1entero

    enterorealreal

  • En esta tabla se omitieron un conjunto de combinaciones que con cualquier operacin produce error, como por ejemplo ENTERO con STRING.

    Ya que un traductor es un autmata (con funcionamiento automtico), es conveniente que el anlisis semntico tambin se automatice. Las claves para automatizar el anlisis semntico son:Utilizar acciones para verificacin semntica.Escoger una estructura de datos que permita accesarla directamente, encontrar el resultado de una operacin y descubrir si sta es o no vlida.

    De hecho estas claves estn vigentes para todo el proceso de traduccin, en cuantoa utilizar acciones y estructuras de datos automticas.

    Para el anlisis semntico no se recomienda usar la tabla mostrada anteriormente,debido a que su acceso no es automtico y le faltan muchas combinaciones.

    Op1Op2*, +, - /div modrelacand orEEEREBXERRRXBXRERRXBXRRRRXBXCCXXXBXCSXXXBXSCXXXBXSSXXXBXBBXXXBB

  • Acciones para verificacin semntica.

    Para mostrar un ejemplo de cmo disear las acciones de verificacin semntica, utilizaremos un subconjunto de expresiones aritmticas. Estas acciones se debern de aadir a las acciones de generacin de cdigo, y no modificar nada de lo ya vistoen generacin de cdigo.

    Para realizar la verificacin semntica se requerir de una pila de tipos.Acciones.PUSH pila_tipos (tipo de la variable).2,3.No llevan accin semntica.

  • Si tipos del TOP y TOP 1 de la pila de tipos son permitidos en la operacin a generar ENTONCES:POP pila_tipos; POP pila_tiposPUSH pila_tipos (resultado de la operacin)SI NOMarcar error semntico, y aplicar accin correctiva que podra ser:POP pila_tipos; POP pila_tiposPUSH pila_tipos (posible resultado de la operacin)Igual a 4No llevan accin semntica.

    Instituto Tecnologico de Durango Programacion de Sistemas II I.S.C Elda Rivera SaucedoInstituto Tecnologico de Durango Programacion de Sistemas II I.S.C Elda Rivera Saucedo