Tema 1.1. Un lenguaje mínimo y su procesador: Introducción

Procesadores de Lenguaje Tema 1.1. Un lenguaje mínimo y su procesador: Introducción Profesor Federico Peinado Elaboración del material José Luis Sier

6 downloads 22 Views 3MB Size

Recommend Stories


CONOCIENDO Y USANDO UN PROCESADOR DE TEXTO
2 CONOCIENDO Y USANDO UN PROCESADOR DE TEXTO Saber usar un procesador de texto como el Word, nos permite escribir o transcribir un texto. Al finaliza

Un microprocesador, El nacimiento de un procesador
Un microprocesador, también conocido como procesador, micro, chip o microchip, es un circuito lógico que responde y procesa las operaciones lógicas y

TEMA 11 ALIMENTACIÓN Y NUTRICIÓN
Apuntes 3ºESO Profesor: Rafa Raigón Departamento de Educación Física IES Castilblanco de los Arroyos TEMA 11 ALIMENTACIÓN Y NUTRICIÓN FICHA DE TRABA

TEMA: Configurando un documento para su publicación
25 Producción Multimedia I. GUÍA 5 Facultad: Escuela: Asignatura: ‫׀‬ Ciencias y Humanidades. Comunicación. Producción Multimedia I. TEMA: Configur

Story Transcript

Procesadores de Lenguaje

Tema 1.1. Un lenguaje mínimo y su procesador: Introducción Profesor Federico Peinado Elaboración del material José Luis Sierra Federico Peinado

Ingeniería en Informática Facultad de Informática – Universidad Complutense de Madrid Curso 2009-2010

¿Qué son los Procesadores de Lenguaje?  Programas informáticos que tienen como datos de entrada y de salida ficheros (documentos) escritos en uno o varios lenguajes  Lenguajes formales normalmente (no lenguajes naturales como el chino, el español, etc.)  Lenguajes de programación habitualmente (son programas que trabajan sobre otros programas  ¡tema complicado pero atractivo e imprescindible para los informáticos!)

 Existen muchos tipos de procesadores de lenguaje  Intérpretes  De máquina a pila (* Como el de la práctica anual) …

 Traductores  Ensambladores  Compiladores (* Como el de la práctica anual) …

… Procesadores de Lenguaje Ingeniería en Informática

1.1 - 1

Intérpretes  Intérprete de un lenguaje X: Programa que, tomando como entrada un programa en lenguaje X, emula su ejecución  La ejecución se produce al mismo tiempo que se procesa la entrada, de forma intercalada  El intérprete se comporta como una máquina (computadora), sólo que virtual

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 2

Un intérprete involucra a 2 lenguajes

Programa

Intérprete

EJECUCIÓN

Lenguaje interpretado (A) Lenguaje de implementación (B)

 A y B pueden ser distintos lenguajes… o ser el mismo  Ejemplo: A= Python y B= C++

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 3

Diagrama en bloque de un intérprete  Notación para representar a un intérprete (con sus 2 lenguajes involucrados):

A

B

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 4

Traductores  Traductor de A a B: Programa que, tomando como entrada un programa en el lenguaje A produce como salida un programa en el lenguaje B  La traducción normalmente se realiza frase a frase  La ejecución del programa B será posible una vez haya acabado por completo el proceso de traducción

 Como decíamos, existen varios tipos de traductores  Ensamblador: Traductor de un lenguaje ensamblador a un lenguaje máquina (binario)  Compilador: Traductor de un lenguaje de alto nivel (como C) a otro de bajo nivel (como un ensamblador) …

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 5

Un traductor involucra a 3 lenguajes

Programa

Traductor

Programa Lenguaje objeto (B)

Lenguaje fuente (A) Lenguaje de implementación (C)

 A, B y C pueden ser distintos lenguajes… o los mismos  Ejemplo: A= Java, B= Bytecode y C = C++

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 6

Diagrama en T de un traductor  Notación para representar a un traductor (con sus 3 lenguajes involucrados):

A

B C

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 7

Conexión entre traductores  Gracias a la conexión entre el trabajo que realizan varios traductores es posible la Informática actual: Java

Bytecode C++

C++

Compilador de Java para Bytecode (javac.c)

¡No lo puedo ejecutar!

Java

Ensamblador

Ensamblador

Máquina virtual de

x86

Java

x86

EJECUCIÓN

Ensamblador

x86

Compilador de C++ para Ensamblador x86

Las máquinas pueden verse como los “intérpretes primarios” (aunque en la práctica suele haber otra traducción a lenguaje máquina) Procesadores de Lenguaje Ingeniería en Informática

Bytecode

Bytecode

Compilador de Java para Bytecode (javac.exe) Ensamblador

¡Ya lo puedo ejecutar!

x86 Máquina x86 EJECUCIÓN 1.1 - 8

Más utilidades de la conexión entre traductores  Traductor de A a A: Tiene sentido para mejorar la eficiencia de un programa, ofuscar el código, etc.  Bootstrapping: Conexión entre traductores que permite ir construyendo cada vez lenguajes de más alto nivel usando el lenguajes de bajo nivel disponible  Traductor de A a B (implementado en B): Tiene sentido cuando B es el lenguaje de bajo nivel disponible y necesitamos un compilador para un lenguaje A de alto nivel que ha sido creado  Traductor de A’ a B (implementado en A): Tiene sentido cuando B es el lenguaje de bajo nivel disponible y necesitamos un compilador para un lenguaje A’, siendo este una ampliación del más alto nivel que el lenguaje A para el que ya tenemos un compilador  Al repetir esta operación (para A’’, A’’’…), conseguimos tener disponible cada vez un lenguaje de más alto nivel

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 9

El caso particular de los compiladores  Cuando se está usando un compilador, también se suelen usar otros procesadores de lenguaje auxiliares  Antes de ejecutar un compilador:  Entornos Integrados de Desarrollo con editores “inteligentes” que procesan fragmentos del programa según los vamos escribiendo y nos avisan de posibles errores, nos ayudan a rellenar huecos en el código, etc.  Preprocesadores que procesan el programa justo antes de compilarlo para quitar los comentarios, expandir las macros, atender las directivas de compilación, etc.

 Después de ejecutar un compilador:  Ensambladores que, como dijimos, traducen el resultado del compilador (normalmente un programa en un lenguaje ensamblador) al lenguaje máquina que sea necesario  Enlazadores que, cuando el programa ha sido compilado en varios ficheros, los junta en uno solo; a veces incluso cargando ficheros dinámicamente = en ejecución (Cargador-enlazador) Procesadores de Lenguaje Ingeniería en Informática

1.1 - 10

El modelo de análisis-síntesis  Es el planteamiento típico que se suele tomar para diseñar la estructura de un procesador de lenguaje  Un módulo de análisis  Una o varias representaciones intermedias (estructuras de datos como árboles o tablas…)  Un módulo de síntesis

Procesador de lenguaje

Programa

Módulo de Análisis

Módulo de Síntesis Representaciones intermedias

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 11

El módulo de análisis 1. Recibe el programa a procesar 2. Analiza sus elementos, su forma y su significado 3. Genera representaciones intermedias que describen:    

Procesadores de Lenguaje Ingeniería en Informática

Los símbolos que se utilizan en el programa La estructura que tiene el programa Los errores detectados en el programa (si los hay) …

1.1 - 12

Descomposición del análisis en pasos 1. Análisis léxico  Recibe el programa a procesar  Comprueba su validez léxica  Genera la secuencia de componentes léxicos o tokens (= ocurrencias de categorías léxicas) que hay en el programa

2. Análisis sintáctico  Recibe la secuencia de componentes léxicos  Comprueba su validez estructural  Puede tener en cuenta restricciones contextuales, como el hecho de que para poder usar un identificador hay que haberlo declararlo previamente  Genera las representaciones intermedias correspondientes

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 13

Ejemplo de análisis (Simplificado)

print(33 + 4*5, “metros”)

Análisis Léxico print

(

33 +

4

*

5

,

“metros” print

Análisis Sintáctico

“metros”

+ *

33 4 Procesadores de Lenguaje Ingeniería en Informática

)

5 1.1 - 14

El módulo de síntesis 1. Recibe las representaciones intermedias 2. Cada porción de información que se encuentra en las representaciones intermedias se sintetiza en forma de:  Ejecución de una instrucción (en el caso de los intérpretes)  Generación de una frase del programa objeto (en el caso de los traductores)

3. Se repite el paso 2 hasta que se acaba la ejecución o se termina de generar el programa objeto

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 15

Descomposición de la síntesis en pasos  Traducción Dirigida por la Sintaxis es el modelo habitual para hacer la síntesis (se llama así, ya hablemos de traductores o de intérpretes) 1. Recibe las representaciones intermedias correspondientes 2. Se realiza uno o varios recorridos de la estructura de datos (árbol, normalmente) que representa la estructura del programa 3. Se calculan valores y/o realizan acciones en cada punto del recorrido (nodos del árbol, normalmente)

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 16

Ejemplo de síntesis en un intérprete (Simplificado)

Se escribe 53 metros por pantalla print “metros”

+

Valor = 53

*

33

Valor = 33

4 Valor = 4

Procesadores de Lenguaje Ingeniería en Informática

Valor =“metros”

Valor =20 5 Valor = 5

1.1 - 17

Ejemplo de síntesis en un traductor (Simplificado) apila 33 apila 4 apila 5 multiplica suma escribe apila “metros” escribe apila 33 apila 4 apila 5 multiplica suma

apila 33

print “metros”

+ *

33 4 apila 4

Procesadores de Lenguaje Ingeniería en Informática

apila “metros”

apila 4 apila 5 multiplica

5 apila 5

1.1 - 18

Definición de un lenguaje de programación  Definir formalmente un lenguaje fuente o interpretado es un requisito fundamental para poder construir procesadores robustos sobre dicho lenguaje  Especialmente para construir el módulo de análisis

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 19

Pasos para definir un lenguaje de programación 1. Descripción informal del lenguaje  Usando ejemplos para ilustrar sus características

2. Definición léxica 3. Definición sintáctica incontextual  Tratando sólo los aspectos incontextuales del lenguaje

4. Definición sintáctica contextual  Tratando también los aspectos contextuales del lenguaje  Se añaden restricciones contextuales a lo del paso 3

5. Definición semántica

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 20

Ejemplo de descripción informal: Expresiones aritméticas 1. Descripción informal del lenguaje  Los números reales son expresiones aritméticas  La suma +, la resta -, la multiplicación * y la división / de expresiones aritméticas son expresiones aritméticas  Los paréntesis () indican qué operandos se ven afectados por un determinado operador, y cuales no  Sin paréntesis, un operando que tenga operadores a ambos lados se verá afectado por el que tenga mayor prioridad. Multiplicación y división tienen la misma prioridad, que es mayor que la que tienen suma y resta.  Sin paréntesis, un operando que tenga operadores a ambos lados con la misma prioridad, se verá afectado por el que tenga a su izquierda (los operadores asocian a izquierdas)  Ejemplos de frases en este lenguaje son:  (456.87 + 78) * 20  456 - 5 / 67.6 Procesadores de Lenguaje Ingeniería en Informática

1.1 - 21

Definición léxica  Documento técnico que especifica los aspectos léxicos (a veces llamados morfología o microsintaxis) del lenguaje que se está definiendo 1. 2.

Identifica elementos básicos: las categorías léxicas Describe formalmente cada uno de dichos elementos

 Categorías léxicas 

Ej: Identificador, Número, CadenaDeCaracteres, ParéntesisAbierto, ParéntesisCerrado, etc.  Se pueden ver como pequeños lenguajes formales, de hecho asumimos que deben ser lenguajes regulares  Ej: La categoría léxica Número es simplemente el conjunto infinito de cadenas finitas formadas con los dígitos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9  REPASO: LENGUAJES FORMALES (Expresiones Regulares)

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 22

Definición léxica mediante expresiones regulares  Está formada por una serie de categorías léxicas definidas cada una mediante una expresión regular   

nombre-categoría1 ≡ expresión regular nombre-categoría2 ≡ expresión regular …

 En las expresiones regulares pueden salir mencionadas las categorías léxicas previamente definidas 

Su nombre debe escribirse entre llaves: {nombre-categoría}

 También puede ser necesario hacer algunas definiciones léxicas auxiliares, que no son categorías léxicas propiamente dichas (no interesan para el análisis sintáctico), pero sirven de apoyo para definirlas

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 23

Definición léxica mediante gramáticas regulares  REPASO: LENGUAJES FORMALES (Gramáticas regulares)  Las expresiones regulares son en realidad una alternativa a la forma más habitual de definir un lenguaje, que es usando gramáticas (en este caso regulares)

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 24

Definición léxica mediante autómatas finitos  REPASO: LENGUAJES FORMALES (Autómatas finitos)  En la implementación de analizadores léxicos, se usan AFDs para reconocer las categorías léxicas 

Tendremos un estado final como mínimo por cada categoría léxica que queramos reconocer

 Existen incluso programas que son generadores automáticos de analizadores léxicos (por ejemplo Lex) 

Traductores que pasan de ERs a AFDs optimizados

Para especificar lenguajes regulares, siempre es más cómodo usar ERs (o gramáticas regulares) que AFs

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 25

Ejemplo de definición léxica: Expresiones aritméticas 2. Definición léxica (usando expresiones regulares)               

Procesadores de Lenguaje Ingeniería en Informática

parte-entera ≡ 0|[1-9][0-9]* parte-decimal ≡ .[0-9]+ número ≡ {parte-entera}{parte-decimal}? suma ≡ \+ resta ≡ \multiplicación ≡ \* división ≡ / paréntesis-apertura ≡ \( paréntesis-cierre ≡ \) + ≡ \+ - ≡ \* ≡ \* /≡/ ( ≡ \( ) ≡ \)

1.1 - 26

Definición sintáctica  Documento técnico que especifica los aspectos sintácticos del lenguaje que se está definiendo (cómo es la estructura sintáctica de todas las posibles secuencias de componentes léxicos a procesar)

1.

Identifica elementos básicos: las categorías sintácticas

2.

Describe formalmente cada uno de dichos elementos

 Es un requisito imprescindible para poder implementar analizadores sintácticos robustos de un lenguaje

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 27

Definición sintáctica incontextual  Aquella primera parte de la definición sintáctica en la que se trabaja, para simplificar, con esta hipótesis:  Hipótesis de Incontextualidad: Considerando que no hay restricciones contextuales en el lenguaje de todas las secuencias posibles de componentes léxicos que pueden formarse  La sintaxis de cualquier lenguaje de programación la vamos a poder expresar con un lenguaje incontextual

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 28

Definición sintáctica incontext. mediante gramáticas incontext.  REPASO: LENGUAJES FORMALES (Gramáticas incontextuales)  Los terminales serán las categorías léxicas (ya no usamos el alfabeto de símbolos alfanuméricos) (Para distinguirlos se pondrán entre < > como en BNF)

 Los no terminales serán las categorías sintáticas (a su vez también se pueden ver como sublenguajes formales)  Ej: Programa, SecciónDeclaraciónVariables, DeclaraciónVariable, etc.

 Las producciones de un mismo no terminal se pueden agrupar en una sola producción (usando | como en BNF para separar alternativas en la parte derecha)

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 29

Definición sintáctica incontext. mediante gramáticas incontext.  Los árboles de derivación, en el contexto de la definición sintáctica, se llamarán árboles de análisis sintáctico y serán de mucha ayuda para hacer explícita la estructura de las sentencias de un lenguaje

 También existen programas que generan automáticamente analizadores sintácticos (y hasta traductores enteros) como JavaCC o YACC

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 30

El problema de la ambigüedad  En la documentación destinada al usuario de un lenguaje de programación a veces hay ambigüedades, que se resuelven con explicaciones en lenguaje natural  Sin embargo, nosotros siempre evitaremos usar gramáticas ambiguas (aquellas donde una sentencia tiene varios análisis posibles) para definir la sintaxis de un lenguaje de programación  Por una cuestión pragmática, en realidad: queremos que nuestro procesador de lenguaje tenga sólo una forma válida de “entender” cada programa  Además ¡si tenemos una gramática ambigua es porque nos falta algo por especificar en el lenguaje!  Hay que averiguar qué es y proponer otra gramática equivalente pero que no sea ambigua y que especifique completamente el lenguaje Procesadores de Lenguaje Ingeniería en Informática

1.1 - 31

Ejemplos sobre cómo evitar las gramáticas ambiguas  La clave está en que al definir lenguajes de programación importa la estructura sintática de sus sentencias y no sólamente sus sentencias

Gfbf-no-ambigua

Gfbf Terminales: p, No terminales: Axioma: fbf Producciones: fbf → p fbf → ¬ fbf fbf → fbf ∧ fbf → fbf ∨

Procesadores de Lenguaje Ingeniería en Informática

∧, ∨, ¬ fbf

fbf fbf

Terminales: p, ∧, ∨, ¬ No terminales: fbf, fbf-y, fbf-no Axioma: fbf Producciones: fbf → fbf ∨ fbf-y fbf → fbf-y fbf-y → fbf-y ∧ fbf-no fbf-y → fbf-no fbf-no → ¬ fbf-no fbf-no → p 1.1 - 32

Ejemplos sobre cómo evitar las gramáticas ambiguas  Con las nuevas producciones de Gfbf-no-ambigua hacemos explícita la prioridad y la asociatividad de los operadores, que es lo que faltaba en Gfbf  Ahora sólo hay una estructura posible por sentencia

p ∨ p ∧ p

fbf fbf



fbf-y

fbf-y fbf-y fbf-no fbf-no p p Procesadores de Lenguaje Ingeniería en Informática



fbf-no p

1.1 - 33

Prioridades y asociatividad  El orden de prioridad es ¬, ∧ y luego ∨ , justo el inverso al de las producciones y los operadores asocian a izquierdas igual que la recursión de las producciones

p ∨ p ∧ p

Gfbf-no-ambigua

fbf

Terminales: p, ∧, ∨, ¬ No terminales: fbf, fbf-y, fbf-no fbf ∨ fbf-y Axioma: fbf Producciones: fbf-y fbf → fbf ∨ fbf-y ∧ fbf-y fbf-no fbf → fbf-y fbf-no fbf-y → fbf-y ∧ fbf-no fbf-no p fbf-y → fbf-no p fbf-no → ¬ fbf-no p fbf-no → p Procesadores de Lenguaje Ingeniería en Informática

1.1 - 34

Prioridades y asociatividad  La prioridad de los operadores se “codifica” en la sintaxis organizando las categorías sintácticas por niveles  Una categoría sintáctica se define en términos de aquellas otras que tienen mayor nivel de prioridad  La asociatividad de un operador binario ⊗ se “codifica” en la sintaxis según se use la recursión  Asociatividad a izquierdas: recursión a izquierdas exp-a::= exp-a ⊗ exp-b  Asociatividad a derechas: recursión a derechas exp-a ::= exp-b ⊗ exp-a  No asociatividad: no recursión exp-a ::= exp-b ⊗ exp-b

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 35

Utilidad de los delimitadores 



Procesadores de Lenguaje Ingeniería en Informática

Los delimitadores son un mecanismo sintáctico que permite hacer sentencias con terminales similares pero muy diversas estructuras, a pesar de las reglas de prioridad y asociatividad 

Ej: Los paréntesis () de una expresión aritmética



Ej: El punto y coma ; del final de una instrucción

Las gramáticas con pocos delimitadores y mucho azúcar sintáctico (varias maneras de expresar una misma cosa) generan lenguajes más cómodos de usar, pero tienen más riesgo de ser ambigüas 

"Syntactic sugar causes cancer of the semicolom" (Alan Perlis)



Ejemplo de paréntesis incómodos: LISP



¡Encontrar el equilibrio es uno de los puntos clave en el diseño de la sintaxis de un lenguaje de programación!

1.1 - 36

Ejemplo: Los paréntesis  Usamos ciertos terminales (ej. paréntesis) para tener varias estructuras anidadas posibles y sin ambigüedad

Gfbf-no-ambigua

Gfbf-final

Terminales: p, ∧, ∨, ¬ No terminales: fbf, fbf-y, fbf-no Axioma: fbf Producciones: fbf → fbf ∨ fbf-y fbf → fbf-y fbf-y → fbf-y ∧ fbf-no fbf-y → fbf-no fbf-no → ¬ fbf-no fbf-no → p

Terminales: p, ∧, ∨, ¬, (, ) No terminales: fbf, fbf-y, fbf-no Axioma: fbf Producciones: fbf → fbf ∨ fbf-y fbf → fbf-y fbf-y → fbf-y ∧ fbf-no fbf-y → fbf-no fbf-no → ¬ fbf-no fbf-no → p fbf-no → (fbf)

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 37

Ejemplo: Los paréntesis p ∧ (p ∨ p)

p ∧ p ∨ p

fbf

fbf fbf-y

fbf



fbf-y

fbf-y ∧

fbf-no

(

fbf-y p fbf-y fbf-no p Procesadores de Lenguaje Ingeniería en Informática



fbf-no

fbf

fbf-no fbf

fbf-no p

)

p



fbf-y

fbf-y fbf-no p

fbf-no p 1.1 - 38

Definición sintáctica incontextual mediante autómatas a pila  REPASO: LENGUAJES FORMALES (Autómatas a pila)  Los autómatas a pila son capaces de reconocer cualquier lenguaje incontextual, igual que las gramáticas incontextuales son capaces de generarlo 

Toda gramática incontextual tiene asociado un autómata a pila equivalente



¡Sólo las gramáticas incontextuales deterministas tienen asociado un autómata a pila determinista equivalente! 

Esto hace que siempre busquemos definir la sintaxis de un lenguaje de programación con una gramática incontextual determinista

 Para especificar un lenguaje incontextual siempre es más cómodo usar una gramática incontextual que un autómata a pila Procesadores de Lenguaje Ingeniería en Informática

1.1 - 39

Ejemplo de definición sintáctica incontextual: Expresiones aritméticas 3. Definición sintáctica incontextual (usando una gramática incontextual)

Exp ::= num Exp + Exp – Exp * Exp / ( Exp

| Exp Exp Exp Exp )

| | | |

Exp ::= Exp OpAd Term Exp ::= Term Term ::= Term OpMul Fact Term ::= Fact Fact ::= num | ( Exp ) OpAd ::= + | OpMul ::= * | /

¡Ambigüedad!

Procesadores de Lenguaje Ingeniería en Informática

1.1 - 40

Definición sintáctica contextual y definición semántica

Los siguientes pasos son más complejos y se estudian a lo largo de todo el tema… (usando el ejemplo de las expresiones aritméticas) 4. Definición sintáctica contextual 

Añadiendo restricciones contextuales sobre el paso 3



Detallando la estructura y el proceso de construcción de la tabla de símbolos: estructura de datos auxiliar (tabla) que se construye dinámicamente durante el análisis y se usa en todas las etapas de análisis y síntesis, dando soporte a las restricciones contextuales al procesar un programa

5. Definición semántica 

Procesadores de Lenguaje Ingeniería en Informática

Etiquetando las estructuras sintácticas con información adicional sobre el significado de cada categoría sintáctica

1.1 - 41

Críticas, dudas, sugerencias…

Federico Peinado www.federicopeinado.es

Procesadores de Lenguaje Ingeniería en Informática

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.