SlideShare una empresa de Scribd logo
1 de 6
Descargar para leer sin conexión
18/03/13	
  




                                                                  2

                                                                                          Descripción
      Modelo Computacional Secuencial
               y Declarativo                                          •  Definiremos un lenguaje de programación
                                                                      •  Qué hace falta para definir un lenguaje de
                                                                      programación:
                                                                            Cómo se escribe con este lenguaje?
                                                                             
                Sintaxis del Lenguaje de Kernel
             Almacenamiento de simple asignación                            Qué significan las cosas que escribimos
                                                                          con este lenguaje?


                       Adapted from C. Varela, S.   1
                       Haridi and P. Van Roy




3                                                                 4

                        Descripción                                           Definición de un lenguaje


    •  Definiremos un lenguaje de programación                         •  Sintaxis: define las “oraciones” “permitidas”
                                                                          Secuencia de caracteres (‘letras’) = token (‘palabra’)
    •  Qué hace falta para definir un lenguaje de
                                                                          Secuencia de tokens (‘palabras’) = sentencias
    programación:                                                       (‘oración’)
          Cómo se escribe con este lenguaje?
                            Quién verifica que un programa sea sintácticamente
                                                                        correcto?
           
 
 
 
sintaxis
          Qué significan las cosas que escribimos                     •  Semántica: define qué significa un programa, y
        con este lenguaje?
                                           qué se se espera del programa.
          
 
 
 
semántica                                                print “hello world”
                                                                          Quién verifica que un programa sea semánticamente
                                                                        correcto?




5

    Definición de un lenguaje (sección 2.1 del libro)


    •  Sintaxis: define las “oraciones” “permitidas”
        Secuencia de caracteres (‘letras’) = token (‘palabra’)
        Secuencia de tokens (‘palabras’) = sentencias
      (‘oración’)
        Quién verifica que un programa sea sintácticamente
      correcto? el compilador                                                                Sintaxis
    •  Semántica: define qué significa un programa, y
    qué se se espera del programa.
        print “hello world”
        Quién verifica que un programa sea semánticamente
      correcto? en algunos casos, la derivación, el testing




                                                                                                                                             1	
  
18/03/13	
  




7                                                                                                8

                                      Sintaxis                                                                                       Sintaxis


           Secuencia de                                                                                  Secuencia de                     “fun {Max X Y}ntif X>Y then X else Y end
                                    Buenos#Aires#es#la#capital#y#la#ciudad#mas#grande                                                                      nend”
            Caracteres                                                                                    Caracteres
                        Tokenizer                                                                                     Tokenizer
                                                  [“Buenos Aires”,”es”, “la”,
        Secuencia de Tokens                      “capital”,”y”,”la”,”ciudad”,                         Secuencia de Tokens               ‘fun’ ‘{‘ ‘Max’ ‘X’ ‘Y’ ‘}’ ‘if’ ‘X’ ‘>’ ‘Y’ ‘then’
                                                       ”mas”,”grande”]                                                                              ‘X’ ‘else’ ‘Y’ ‘end’ ‘end’
                        Parser                                                                                        Parser
                                                                 es                                                                                          fun
          Árbol sintáctico                                                                              Árbol sintáctico
          representado al                           Bs As             y                                 representado al                             Max    [X Y] if
            programa.                                                                                     programa.

                                                    la capital            la ciudad mas grande                                                                  >       X   Y

                                                                                                                                                            X       Y




                                                                                                 10
                                                                                                          Ejemplo de derivación sintáctica 
              Sintaxis y derivación sintáctica                                                                top-down y bottom-up

                                                                                                                                                 <s>
       •  definimos la sintaxis de un lenguaje                                                                                             local X in <s> end
                                                                                                                                  local X in local Y in <s> end end
       mediante reglas (en el mejor caso, con una                                                                              local X in local Y in <s> <s> end end
                                                                                                                            local X in local Y in X=true <s> end end
       gramática)
                                                                                            local X in local Y in X=true if <x> then <s> else <s> end end end
                                                                                                               local X in local Y in X=true if X then Y=1 else Y=~1 end end end
       •  una oración pertenece a nuestro lenguaje
       (es válida) si hay una secuencia de reglas de
       la gramática que explican cómo se generó
       •  una secuencia de reglas se puede
       representar como un árbol de derivación




11                                                                                               12

         Ejemplos de gramáticas informales                                                             Ejemplos de gramáticas informales

    NAME
      ls -- list directory contents                                                                   Una dirección de correo es:
    SYNOPSIS                                                                                            un string, seguido de una @ seguido de varios strings
      ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...]                                           separados por puntos.
    NAME
       man - format and display the on-line manual pages
    SYNOPSIS                                                                                              Qué es un string?
       man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]                               Qué caracteres pueden aparecer en un string?
       [-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list]                             Cuántos strings pueden aparecer separados por
       [section] name                                                                                   puntos?
                                                                                                          Cuántas @ puede haber?
     Qué problemas presentan estas descripciones                                                          una larga lista de etc.
     informales? Qué ambigüedades? Qué efectos puede
     tener la ambigüedad?




                                                                                                                                                                                                   2	
  
18/03/13	
  




13                                                                                               14
      Gramáticas Independientes de Contexto y                                                         Gramáticas Independientes de Contexto y
               Sensibles al Contexto                                                                           Sensibles al Contexto

     •  Gramática independiente (o libre) de contexto (CFG)
                                       •  Gramática independiente (o libre) de contexto (CFG)
           Fácil de leer y entender
                                                                    Fácil de leer y entender
           No consigue capturar de forma elegante e intuitiva                                           No consigue capturar de forma elegante e intuitiva
         algunos fenómenos propios de los lenguajes de                                                 algunos fenómenos propios de los lenguajes de
         programación
                                                                                 programación
     •  Gramática sensible al contexto
                                                            •  Gramática sensible al contexto
           Expresa restricciones en el lenguaje (e.g. “una variable                                     Expresa restricciones en el lenguaje (e.g. “una variable
         debe estar declarada antes de usarse”)
                                                       debe estar declarada antes de usarse”)
                                                                                                   
                                                                                                   para definir lenguajes de programación:
                                                                                                  Gramáticas Libres de 
              Conjunto de restricciones
                                                                                                  Contexto (e.g. con BNF) 
       + (e.g. con predicados)




15                                                                                               16
         Definiendo gramáticas formales con la
              Forma Bachus-Naur (BNF):
                                                                                                                            BNF y su notación


           <digit> ::= 0 | 1 | 2 | 3 | 4| 5 | 6 | 7 | 8 | 9
           <int> ::= <digit> { <digit> }
           <list <int>> ::= nil | <int> ‘|’ <list <int>>    31 | 5 | nil                               ::=
           el elemento a la izquierda es definido
           <statement> ::= if <expression> then<statement>                                                            por las construcciones de la derecha
         
 
 
 
 {elseif <expression> then <statement>}                                                 *
             el elemento ocurre 0 o más veces
         
 
 
 
 [ else <statement> ] end
         
 
 
 
| …                                                                                     {…}
           agrupa los elementos entre llaves
                                                                                                        […]
           agrupa elementos opcionales
                                                                                                        |
            “o” exclusivo




17

     Definimos nuestro Lenguaje de Kernel                                                                                     Palabras clave

        sintaxis de una sentencia 〈s〉

       〈s〉 ::=   skip                                            sentencia vacía                        Tokenizador                   Tokens            Semántica
           |      〈var〉 = 〈var〉                                  unificación variable-variable
           |      〈var〉 = 〈value〉                                unificación variable-valor
           |      〈s〉 〈s〉                                        composición secuencial                      CFG
           |     local 〈var〉 in 〈s〉 end                          declaración                                                                      Lenguaje de
                                                                                                                                Secuencia de      Programación
           |     if 〈var〉 then 〈s〉 else 〈s〉 end                  condicional                                                     Caracteres
           |     '{' 〈var〉 〈var〉 … 〈var〉 '}'                     aplicación de procedimiento
           |     case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end   chequeo de patrones
                                                                                                      Análisis Sintáctico
       〈var〉::= ...                                              expresión de valor                                                                                 BNF
                                                                                                                                               EBNF
       〈pattern〉 ::= ...                                         patrón
                                                                                                                            Parser




                                                                                                                                                                                   3	
  
18/03/13	
  




19                                                                                 27
                                                                                           Sentencias de nuestro lenguaje de
                           Para saber más…
                                                                                                     núcleo (tabla 2.1)

                                                                                          sintaxis de una sentencia 〈s〉
       •  sobre qué es una gramática:
       http://en.wikipedia.org/wiki/Formal_grammar
                                      〈s〉 ::=   skip                                            sentencia vacía
       •  y de ahí:                                                                          |      〈var〉 = 〈var〉                                  unificación variable-variable
            •  BNF:                                                                          |      〈var〉 = 〈value〉                                unificación variable-valor
                                                                                             |      〈s〉 〈s〉                                        composición secuencial
            http://en.wikipedia.org/wiki/Backus                                              |     local 〈var〉 in 〈s〉 end                          declaración
            %E2%80%93Naur_Form
                                                              |     if 〈var〉 then 〈s〉 else 〈s〉 end                  condicional
            •  EBNF:                                                                         |     '{' 〈var〉 〈var〉 … 〈var〉 '}'                     aplicación de procedimiento
            http://en.wikipedia.org/wiki/Extended_Backus                                     |     case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end   chequeo de patrones
            %E2%80%93Naur_form
                                                                                         〈var〉::= ...                                              expresión de valor

                                                                                         〈pattern〉 ::= ...                                         patrón




28                                                                                 29

          Indentificadores de Variables                               (2.3.1)                                  Valores y tipos                       (2.3.1)



      •  〈variables〉 Define un conjunto de variables.
                                   •  Un tipo de datos es un conjunto de valores y un conjunto
      •  Las variables empiezan con letra mayúscula seguida de                          de operaciones asociadas.
      una secuencia (posiblemtente vacía) de caracteres                                 •  ejemplo: Int es el tipo de datos ”Entero”, i.e el conjunto
      alfanuméricos o underscore.
                                                      de todos los valores enteros.
      •  Cualquier secuencia de caracteres imprimibles
      encerrados entre comillas cruzadas (back-quote).
                                     
1 is of type Int
      •  ejemplos:
                                                                     •  Int tiene un conjunto de operaciones asociadas,
            X                                                                           incluyendo +,-,*,div, etc.
            Y1                                                                          •  Crearemos nuestro lenguaje de manera que se puedan
            Hello_World                                                                 describir elementos de distinto tipo. El modelo viene con
           `hello this is a $5 bill`                                                    un conjunto de tipos básicos.

        ejercicio: Escribir la gramática que describe el lenguaje
      de variables
      (la solución está en las tablas C.9 y C.10 del apéndice C del libro)




30                                                                                 33

     Descripción de Tipos de Valores                                 (tabla 2.2)                                      Números                  (2.3.3)



     〈value〉
::= 
〈procedure〉 | 〈record〉 | 〈number〉
                                    •  Enteros
       
     〈procedure〉 
::= proc '{' '$' 〈var〉 … 〈var〉 '}' 〈s〉 end
                                                                                             314, 0
     
                                                                                       ~10 (minus 10)
     〈record〉, 〈pattern〉
::= 
〈literal〉 
                                               •  Flotantes
         
 
 
| 〈literal〉 (〈feature〉 : 〈var〉 … 〈feature〉 : 〈var〉)
                           1.0, 3.4, 2.0e2, 2.0E2 (2×102)
     
     〈literal〉
::= 
〈atom〉 | 〈bool〉 
     〈feature〉 
::= 
 〈int〉 | 〈atom〉 | 〈bool〉 
     〈bool〉 
::= true | false
     〈number〉 ::= 〈int〉 | 〈float〉
     〈atom〉 ::= 〈lowercasechar〉 {<alphanumerchar>} …
     




                                                                                                                                                                                        4	
  
18/03/13	
  




34                                                                        35

               Átomos y Booleanos                   (2.3.3)                                       Registros       (2.3.3)




     •  Una secuencia que empieza con un caracter en                           •  Representación Compuesta (lo usaremos para estructura
     minúscula, seguido de caracters o dígitos, …
                             de datos)
          person, peter                                                             〈l〉(〈f1〉 : 〈x1〉 … 〈fn〉 : 〈xn〉)
          ‘Seif Haridi’                                                             〈l〉 is a literal
     •  Booleanos:
                                                            •  ejemplos
          true                                                                      person(age:X1 name:X2)
          false                                                                     person(1:X1 2:X2)
     •  Esta definición es ambigua, cómo la arreglamos?
                             ‘|’(1:H 2:T)
                                                                                    nil
                                                                                    person
                                                                               
                                                                               




37                                                                        38
                                                                                       Registros Especiales: listas 
          Registros Especiales: tuplas                         (2.3.3)
                                                                                         (subtipo de tupla) (2.3.3)

     Tuplas
                                                                   Listas
         

                                                                    
         
   〈l〉(〈x1〉 … 〈xn〉)                                                         〈x1〉 | 〈x2〉
     Equivalente al registro: 

                                               (también podemos escribirlas con un operador infijo ‘|’)
             〈l〉(1: 〈x1〉 … n: 〈xn〉)                                            Equivalente a la tupla: 
     
                                                                             
 
‘|’(〈x1〉 〈x2〉)       
     •  ejemplo:
                                                              •  ejemplo:
         
 
 
person(X Y)                                                          
 
H | T
     corresponde al registro
                                                  corresponde a la tupla 

         
 
    person(1:X 2:Y)                                                    
 
‘|’(H T)
     
                                                                         que corresponde al registro 
                                                                                   
 
‘|’(1:H 2:T)
                                                                               




39                                                                        42

                              listas                                               Variaciones sintácticas en listas


         
〈x1〉 | 〈x2〉 | 〈x3〉                                                   Podemos escribir
     ‘|’ asocia a la derecha
                                                     
X1=5|6|7|nil
         
〈x1〉 | (〈x2〉 | 〈x3〉) 
          ‘|’                                  que es lo mismo que
         
 

                                                                      X1=5|(6|(7|nil))
                                      1         ‘|’                            que es lo mismo que
      ejemplo:
                                                                   
X1=‘|’(5 ‘|’(6 ‘|’(7 nil)))
         
1 | 2 | 3 | nil                                                      Y todavia mas corto:
      es
                                 2                   ‘|’
                                                                                  
X1=[5 6 7]
         
1 |( 2 | (3 | nil ))
      
                                         3                   nil
      




                                                                                                                                                   5	
  
18/03/13	
  




46                                                                             47
             Registros Especiales: strings
                                                                                       Definición de Procedimientos                       (2.3.3)
                (subtipo de lista) (2.3.3)

     •  Un string es una lista de códigos de caracteres                                   〈x〉 = proc {$ 〈y1〉 … 〈yn〉} 〈s〉 end
     encerrados con comillas. 
                                                       Crea un valor, “resultado” del procedimiento
     •  ejemplo: 
                                                                    Liga la variable 〈x〉 a ese valor
          ”E=mc^2”                                                                  
     significa lo mismo que: 
                                                       Una variación sintáctica del procedimiento:
         
[69 61 109 99 94 50]                                                          
proc {〈x〉 〈y1〉 … 〈yn〉} 〈s〉 end
                                                                                    
                                                                                    Pero no olvidemos que un procedimiento es siempre una
                                                                                    asignación, se ve cuando lo traducimos a kernel




49                                                                             50

                                                                                         Asignación de Tipo a Variables


                                                                                    •  Los valores claramente tiene un tipo, e.g., enteros,
                                                                                    strings. Qué pasa con las variables?




               Reflexiones sobre Sintaxis




51

           Asignación de Tipo a Variables


     •  Los valores claramente tiene un tipo, e.g., enteros,
     strings. Qué pasa con las variables?
     Los lenguajes de programación tienen diferentes
     comportamientos respecto al tipo de las variables:
     •  Fuertemente Tipado: La variables pueden tener asociado
     un tipo, que restringe el tipo de valor que pueden
     acomodar. Cómo se determina ese tipo?
           Estático: todos los tipos de las variables se saben en tiempo de
         compilación. Puede ser declarado por el usuario.
           Dinámico: una variable adquiere un tipo en cuando se le asocia
         un valor. En cualquier caso, ese tipo no cambia a lo largo de la
         ejecución. El tipo es único y fijo.
     •  Débilmente Tipado: Las variables no tienen tipos asociados. Eg.
     Los argumentos de una función pueden variar de tipo.




                                                                                                                                                            6	
  

Más contenido relacionado

Similar a Part0 slides-sections2-2.2-2.3 0

Taller de Compiladores flx y bsn
Taller de Compiladores flx y bsnTaller de Compiladores flx y bsn
Taller de Compiladores flx y bsnDanielRosero23
 
Entornos de lenguaje c
Entornos de lenguaje cEntornos de lenguaje c
Entornos de lenguaje calejanlaura
 
Lenguajes de programación.
Lenguajes de programación.Lenguajes de programación.
Lenguajes de programación.Gabriela Ureña
 
7 lenguajes y traductores
7 lenguajes y traductores7 lenguajes y traductores
7 lenguajes y traductoresbeyoxtli
 
Clase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexicoClase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexicoInfomania pro
 
Introducción A Compiladores
Introducción A Compiladores Introducción A Compiladores
Introducción A Compiladores Nestor Traña
 
Conceptos basicos de lenguajes de programacion
Conceptos basicos de lenguajes de programacionConceptos basicos de lenguajes de programacion
Conceptos basicos de lenguajes de programacionAshley Stronghold Witwicky
 
Analizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador SintácticoAnalizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador SintácticoRaul Gomez
 
Materia unidad compiladores
Materia unidad compiladoresMateria unidad compiladores
Materia unidad compiladoresbachispasaca
 
T1. Introducción a la Teoría de Lenguajes Formales.pptx
T1. Introducción a la Teoría de Lenguajes Formales.pptxT1. Introducción a la Teoría de Lenguajes Formales.pptx
T1. Introducción a la Teoría de Lenguajes Formales.pptxRaulCasillas9
 
Análisis Semántico con Cup
Análisis Semántico con CupAnálisis Semántico con Cup
Análisis Semántico con CupLAUNASA NOVENO B
 
Analisis sintactico
Analisis sintacticoAnalisis sintactico
Analisis sintacticoAndresDvila
 

Similar a Part0 slides-sections2-2.2-2.3 0 (18)

Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Curso prog sist
Curso prog sistCurso prog sist
Curso prog sist
 
Taller de Compiladores flx y bsn
Taller de Compiladores flx y bsnTaller de Compiladores flx y bsn
Taller de Compiladores flx y bsn
 
Entornos de lenguaje c
Entornos de lenguaje cEntornos de lenguaje c
Entornos de lenguaje c
 
Lenguajes de programación.
Lenguajes de programación.Lenguajes de programación.
Lenguajes de programación.
 
7 lenguajes y traductores
7 lenguajes y traductores7 lenguajes y traductores
7 lenguajes y traductores
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Clase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexicoClase6 conceptos del analisis lexico
Clase6 conceptos del analisis lexico
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 
Introducción A Compiladores
Introducción A Compiladores Introducción A Compiladores
Introducción A Compiladores
 
Conceptos basicos de lenguajes de programacion
Conceptos basicos de lenguajes de programacionConceptos basicos de lenguajes de programacion
Conceptos basicos de lenguajes de programacion
 
Analizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador SintácticoAnalizador Léxico, Analizador Sintáctico
Analizador Léxico, Analizador Sintáctico
 
Tr asem-ver
Tr asem-verTr asem-ver
Tr asem-ver
 
Materia unidad compiladores
Materia unidad compiladoresMateria unidad compiladores
Materia unidad compiladores
 
T1. Introducción a la Teoría de Lenguajes Formales.pptx
T1. Introducción a la Teoría de Lenguajes Formales.pptxT1. Introducción a la Teoría de Lenguajes Formales.pptx
T1. Introducción a la Teoría de Lenguajes Formales.pptx
 
Análisis Semántico con Cup
Análisis Semántico con CupAnálisis Semántico con Cup
Análisis Semántico con Cup
 
investigacion.pdf
investigacion.pdfinvestigacion.pdf
investigacion.pdf
 
Analisis sintactico
Analisis sintacticoAnalisis sintactico
Analisis sintactico
 

Part0 slides-sections2-2.2-2.3 0

  • 1. 18/03/13   2 Descripción Modelo Computacional Secuencial y Declarativo •  Definiremos un lenguaje de programación •  Qué hace falta para definir un lenguaje de programación:   Cómo se escribe con este lenguaje? Sintaxis del Lenguaje de Kernel Almacenamiento de simple asignación   Qué significan las cosas que escribimos con este lenguaje? Adapted from C. Varela, S. 1 Haridi and P. Van Roy 3 4 Descripción Definición de un lenguaje •  Definiremos un lenguaje de programación •  Sintaxis: define las “oraciones” “permitidas”   Secuencia de caracteres (‘letras’) = token (‘palabra’) •  Qué hace falta para definir un lenguaje de   Secuencia de tokens (‘palabras’) = sentencias programación: (‘oración’)   Cómo se escribe con este lenguaje?   Quién verifica que un programa sea sintácticamente correcto? sintaxis   Qué significan las cosas que escribimos •  Semántica: define qué significa un programa, y con este lenguaje? qué se se espera del programa. semántica   print “hello world”   Quién verifica que un programa sea semánticamente correcto? 5 Definición de un lenguaje (sección 2.1 del libro) •  Sintaxis: define las “oraciones” “permitidas”   Secuencia de caracteres (‘letras’) = token (‘palabra’)   Secuencia de tokens (‘palabras’) = sentencias (‘oración’)   Quién verifica que un programa sea sintácticamente correcto? el compilador Sintaxis •  Semántica: define qué significa un programa, y qué se se espera del programa.   print “hello world”   Quién verifica que un programa sea semánticamente correcto? en algunos casos, la derivación, el testing 1  
  • 2. 18/03/13   7 8 Sintaxis Sintaxis Secuencia de Secuencia de “fun {Max X Y}ntif X>Y then X else Y end Buenos#Aires#es#la#capital#y#la#ciudad#mas#grande nend” Caracteres Caracteres Tokenizer Tokenizer [“Buenos Aires”,”es”, “la”, Secuencia de Tokens “capital”,”y”,”la”,”ciudad”, Secuencia de Tokens ‘fun’ ‘{‘ ‘Max’ ‘X’ ‘Y’ ‘}’ ‘if’ ‘X’ ‘>’ ‘Y’ ‘then’ ”mas”,”grande”] ‘X’ ‘else’ ‘Y’ ‘end’ ‘end’ Parser Parser es fun Árbol sintáctico Árbol sintáctico representado al Bs As y representado al Max [X Y] if programa. programa. la capital la ciudad mas grande > X Y X Y 10 Ejemplo de derivación sintáctica Sintaxis y derivación sintáctica top-down y bottom-up <s> •  definimos la sintaxis de un lenguaje local X in <s> end local X in local Y in <s> end end mediante reglas (en el mejor caso, con una local X in local Y in <s> <s> end end local X in local Y in X=true <s> end end gramática) local X in local Y in X=true if <x> then <s> else <s> end end end local X in local Y in X=true if X then Y=1 else Y=~1 end end end •  una oración pertenece a nuestro lenguaje (es válida) si hay una secuencia de reglas de la gramática que explican cómo se generó •  una secuencia de reglas se puede representar como un árbol de derivación 11 12 Ejemplos de gramáticas informales Ejemplos de gramáticas informales NAME ls -- list directory contents Una dirección de correo es: SYNOPSIS un string, seguido de una @ seguido de varios strings ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1] [file ...] separados por puntos. NAME man - format and display the on-line manual pages SYNOPSIS   Qué es un string? man [-acdfFhkKtwW] [--path] [-m system] [-p string] [-C config_file]   Qué caracteres pueden aparecer en un string? [-M pathlist] [-P pager] [-B browser] [-H htmlpager] [-S section_list]   Cuántos strings pueden aparecer separados por [section] name puntos?   Cuántas @ puede haber? Qué problemas presentan estas descripciones   una larga lista de etc. informales? Qué ambigüedades? Qué efectos puede tener la ambigüedad? 2  
  • 3. 18/03/13   13 14 Gramáticas Independientes de Contexto y Gramáticas Independientes de Contexto y Sensibles al Contexto Sensibles al Contexto •  Gramática independiente (o libre) de contexto (CFG) •  Gramática independiente (o libre) de contexto (CFG)   Fácil de leer y entender   Fácil de leer y entender   No consigue capturar de forma elegante e intuitiva   No consigue capturar de forma elegante e intuitiva algunos fenómenos propios de los lenguajes de algunos fenómenos propios de los lenguajes de programación programación •  Gramática sensible al contexto •  Gramática sensible al contexto   Expresa restricciones en el lenguaje (e.g. “una variable   Expresa restricciones en el lenguaje (e.g. “una variable debe estar declarada antes de usarse”) debe estar declarada antes de usarse”) para definir lenguajes de programación: Gramáticas Libres de Conjunto de restricciones Contexto (e.g. con BNF) + (e.g. con predicados) 15 16 Definiendo gramáticas formales con la Forma Bachus-Naur (BNF): BNF y su notación  <digit> ::= 0 | 1 | 2 | 3 | 4| 5 | 6 | 7 | 8 | 9  <int> ::= <digit> { <digit> }  <list <int>> ::= nil | <int> ‘|’ <list <int>> 31 | 5 | nil ::= el elemento a la izquierda es definido  <statement> ::= if <expression> then<statement> por las construcciones de la derecha {elseif <expression> then <statement>} * el elemento ocurre 0 o más veces [ else <statement> ] end | … {…} agrupa los elementos entre llaves […] agrupa elementos opcionales | “o” exclusivo 17 Definimos nuestro Lenguaje de Kernel Palabras clave sintaxis de una sentencia 〈s〉 〈s〉 ::= skip sentencia vacía Tokenizador Tokens Semántica | 〈var〉 = 〈var〉 unificación variable-variable | 〈var〉 = 〈value〉 unificación variable-valor | 〈s〉 〈s〉 composición secuencial CFG | local 〈var〉 in 〈s〉 end declaración Lenguaje de Secuencia de Programación | if 〈var〉 then 〈s〉 else 〈s〉 end condicional Caracteres | '{' 〈var〉 〈var〉 … 〈var〉 '}' aplicación de procedimiento | case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end chequeo de patrones Análisis Sintáctico 〈var〉::= ... expresión de valor BNF EBNF 〈pattern〉 ::= ... patrón Parser 3  
  • 4. 18/03/13   19 27 Sentencias de nuestro lenguaje de Para saber más… núcleo (tabla 2.1) sintaxis de una sentencia 〈s〉 •  sobre qué es una gramática: http://en.wikipedia.org/wiki/Formal_grammar 〈s〉 ::= skip sentencia vacía •  y de ahí: | 〈var〉 = 〈var〉 unificación variable-variable •  BNF: | 〈var〉 = 〈value〉 unificación variable-valor | 〈s〉 〈s〉 composición secuencial http://en.wikipedia.org/wiki/Backus | local 〈var〉 in 〈s〉 end declaración %E2%80%93Naur_Form | if 〈var〉 then 〈s〉 else 〈s〉 end condicional •  EBNF: | '{' 〈var〉 〈var〉 … 〈var〉 '}' aplicación de procedimiento http://en.wikipedia.org/wiki/Extended_Backus | case 〈var〉 of 〈pattern〉 then 〈s〉 else 〈s〉 end chequeo de patrones %E2%80%93Naur_form 〈var〉::= ... expresión de valor 〈pattern〉 ::= ... patrón 28 29 Indentificadores de Variables (2.3.1) Valores y tipos (2.3.1) •  〈variables〉 Define un conjunto de variables. •  Un tipo de datos es un conjunto de valores y un conjunto •  Las variables empiezan con letra mayúscula seguida de de operaciones asociadas. una secuencia (posiblemtente vacía) de caracteres •  ejemplo: Int es el tipo de datos ”Entero”, i.e el conjunto alfanuméricos o underscore. de todos los valores enteros. •  Cualquier secuencia de caracteres imprimibles encerrados entre comillas cruzadas (back-quote). 1 is of type Int •  ejemplos: •  Int tiene un conjunto de operaciones asociadas, X incluyendo +,-,*,div, etc. Y1 •  Crearemos nuestro lenguaje de manera que se puedan Hello_World describir elementos de distinto tipo. El modelo viene con `hello this is a $5 bill` un conjunto de tipos básicos.   ejercicio: Escribir la gramática que describe el lenguaje de variables (la solución está en las tablas C.9 y C.10 del apéndice C del libro) 30 33 Descripción de Tipos de Valores (tabla 2.2) Números (2.3.3) 〈value〉 ::= 〈procedure〉 | 〈record〉 | 〈number〉 •  Enteros 〈procedure〉 ::= proc '{' '$' 〈var〉 … 〈var〉 '}' 〈s〉 end 314, 0 ~10 (minus 10) 〈record〉, 〈pattern〉 ::= 〈literal〉 •  Flotantes | 〈literal〉 (〈feature〉 : 〈var〉 … 〈feature〉 : 〈var〉) 1.0, 3.4, 2.0e2, 2.0E2 (2×102) 〈literal〉 ::= 〈atom〉 | 〈bool〉 〈feature〉 ::= 〈int〉 | 〈atom〉 | 〈bool〉 〈bool〉 ::= true | false 〈number〉 ::= 〈int〉 | 〈float〉 〈atom〉 ::= 〈lowercasechar〉 {<alphanumerchar>} … 4  
  • 5. 18/03/13   34 35 Átomos y Booleanos (2.3.3) Registros (2.3.3) •  Una secuencia que empieza con un caracter en •  Representación Compuesta (lo usaremos para estructura minúscula, seguido de caracters o dígitos, … de datos) person, peter 〈l〉(〈f1〉 : 〈x1〉 … 〈fn〉 : 〈xn〉) ‘Seif Haridi’ 〈l〉 is a literal •  Booleanos: •  ejemplos true person(age:X1 name:X2) false person(1:X1 2:X2) •  Esta definición es ambigua, cómo la arreglamos? ‘|’(1:H 2:T) nil person 37 38 Registros Especiales: listas Registros Especiales: tuplas (2.3.3) (subtipo de tupla) (2.3.3) Tuplas Listas 〈l〉(〈x1〉 … 〈xn〉) 〈x1〉 | 〈x2〉 Equivalente al registro: (también podemos escribirlas con un operador infijo ‘|’) 〈l〉(1: 〈x1〉 … n: 〈xn〉) Equivalente a la tupla: ‘|’(〈x1〉 〈x2〉) •  ejemplo: •  ejemplo: person(X Y) H | T corresponde al registro corresponde a la tupla person(1:X 2:Y) ‘|’(H T) que corresponde al registro ‘|’(1:H 2:T) 39 42 listas Variaciones sintácticas en listas 〈x1〉 | 〈x2〉 | 〈x3〉 Podemos escribir ‘|’ asocia a la derecha X1=5|6|7|nil 〈x1〉 | (〈x2〉 | 〈x3〉) ‘|’ que es lo mismo que X1=5|(6|(7|nil)) 1 ‘|’ que es lo mismo que ejemplo: X1=‘|’(5 ‘|’(6 ‘|’(7 nil))) 1 | 2 | 3 | nil Y todavia mas corto: es 2 ‘|’ X1=[5 6 7] 1 |( 2 | (3 | nil )) 3 nil 5  
  • 6. 18/03/13   46 47 Registros Especiales: strings Definición de Procedimientos (2.3.3) (subtipo de lista) (2.3.3) •  Un string es una lista de códigos de caracteres 〈x〉 = proc {$ 〈y1〉 … 〈yn〉} 〈s〉 end encerrados con comillas.   Crea un valor, “resultado” del procedimiento •  ejemplo:   Liga la variable 〈x〉 a ese valor ”E=mc^2” significa lo mismo que: Una variación sintáctica del procedimiento: [69 61 109 99 94 50] proc {〈x〉 〈y1〉 … 〈yn〉} 〈s〉 end Pero no olvidemos que un procedimiento es siempre una asignación, se ve cuando lo traducimos a kernel 49 50 Asignación de Tipo a Variables •  Los valores claramente tiene un tipo, e.g., enteros, strings. Qué pasa con las variables? Reflexiones sobre Sintaxis 51 Asignación de Tipo a Variables •  Los valores claramente tiene un tipo, e.g., enteros, strings. Qué pasa con las variables? Los lenguajes de programación tienen diferentes comportamientos respecto al tipo de las variables: •  Fuertemente Tipado: La variables pueden tener asociado un tipo, que restringe el tipo de valor que pueden acomodar. Cómo se determina ese tipo?   Estático: todos los tipos de las variables se saben en tiempo de compilación. Puede ser declarado por el usuario.   Dinámico: una variable adquiere un tipo en cuando se le asocia un valor. En cualquier caso, ese tipo no cambia a lo largo de la ejecución. El tipo es único y fijo. •  Débilmente Tipado: Las variables no tienen tipos asociados. Eg. Los argumentos de una función pueden variar de tipo. 6