GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN

Tamaño: px
Comenzar la demostración a partir de la página:

Download "GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN"

Transcripción

1 UNIVERSIDAD SIMÓN BOLÍVAR Ingeniería de la Computación GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN Por: CARLOS ALBERTO PÉREZ DÍAZ Tutor: PROF. ASCÁNDER SUÁREZ Proyecto de Grado Presentado ante la Ilustre Universidad Simón Bolívar como Requisito Parcial para Optar el Título de Ingeniero en Computación Sartenejas, 23 de octubre de 2007.

2 UNIVERSIDAD SIMÓN BOLÍVAR Ingeniería de la Computación GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN Por: CARLOS ALBERTO PÉREZ DÍAZ Proyecto de Grado Presentado ante la Ilustre Universidad Simón Bolívar como Requisito Parcial para Optar el Título de Ingeniero en Computación Sartenejas, 23 de octubre de 2007.

3 UNIVERSIDAD SIMÓN BOLÍVAR DECANATO DE ESTUDIOS PROFESIONALES COORDINACIÓN DE INGENIERÍA DE LA COMPUTACIÓN ACTA FINAL DEL PROYECTO DE GRADO GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN Presentado por: CARLOS ALBERTO PÉREZ DÍAZ Este Proyecto de Grado ha sido aprobado por el siguiente jurado examinador: Prof. Ascánder Suárez Prof. Luis Astorga Prof. Óscar Meza SARTENEJAS, 17/10/2007

4 GENERACIÓN DE RECONOCEDORES LALR EN DIVERSOS LENGUAJES DE PROGRAMACIÓN POR: CARLOS ALBERTO PÉREZ DÍAZ RESUMEN Claire es una herramienta de generación de reconocedores sintácticos desarrollada en la Universidad Simón Bolívar utilizada principalmente en el compilador del lenguaje GaCeLa, en varios proyectos de grado de estudiantes de Ingeniería de la Computación y en los laboratorios de las asignaturas Traductores e Interpretadores y Lenguajes de Programación. Esta herramienta fue diseñada para poder generar reconocedores sintácticos en varios lenguajes, pero en sus implementaciones iniciales sólo fue desarrollado el generador para el lenguaje de programación Java. El trabajo realizado en este proyecto de grado busca implementar extensiones para generar reconocedores en otros lenguajes distintos de Java, en especial a los lenguajes de programación Ruby y Python, lenguajes que han tenido auge últimamente. Además, se plantea la especificación de un procedimiento que se pueda seguir para la implementación de nuevas extensiones en lenguajes distintos a los ya implementados. Para realizar esto, se desarrolló una referencia para el contenido de una extensión. Además, se expone el diseño y la implementación de las extensiones para los lenguajes anteriormente mencionados, utilizando esta referencia. ii

5 Agradecimientos Agradezco a mi mamá y a mi papá, Ana María y Francisco, y a todos mis hermanos por todo el apoyo que me han brindado Agradezco a César por siempre estar en las buenas y en las malas. Agradezco a mis demás amigos fuera de la universidad por haberme acompañado durante este largo trayecto. Agradezco a mi tutor, el prof. Ascánder Suárez, a mi profesor guía, prof. Pedro Borges, y a todos los demás profesores con los que he tenido el honor de ser su alumno, por el apoyo suministrado durante toda mi carrera. Agradezco a la Comisión de Carrera de Ing. de Computación , por ser un grupo de personas únicas en toda la universidad. Agradezco a la Universidad Simón Bolívar, por formarme como persona y como profesional. Agradezco a Nintendo, por ser motivante fundamental en mi carrera. iii

6 Dedicatoria A mi familia, sin ellos no sería la persona que soy. iv

7 Índice general 1. Introducción 1 2. Marco Teórico Lenguajes Formales Reconocimiento de Lenguajes Autómatas Finitos Autómatas de Pila Técnicas especiales de reconocimiento Compilador. Definición y Estructura Análisis de un Programa Análisis Lexicográfico Análisis Sintáctico Análisis Semántico Introducción a la Herramienta Claire Introducción a Claire Definición de una Gramática en Claire Preámbulo Directivas del reconocedor Definición de las reglas Estructura Interna de Claire Reconocimiento de la gramática Reconocimiento de las unidades lexicográficas v

8 Generación de tablas Construcción de reconocedores Paquete de ejecución dependiente del lenguaje Generación de Reconocedores en Claire Reconocimiento de la gramática Generación de las tablas Traducción al lenguaje destino Estado Actual Herramientas Relacionadas JavaCC Características de JavaCC ANTLR Características de ANTLR CUP Características de CUP Yapps Características de Yapps SPARK Características de SPARK Racc Características de Racc Planteamiento del Problema Lenguajes Seleccionados Lenguaje de Programación Ruby Lenguaje de Programación Python Referencia de una Extensión Estructura de una Extensión Generación de reconocedores vi

9 6.3. Librerías de soporte para ejecución Algoritmos para reconocimiento en LR y en autómatas finitos Lector especial Símbolos y unidades lexicográficas Manejador de tablas Interacción entre el reconocedor y las tablas Otras consideraciones Preámbulo Implementación de referencia - Lenguaje Java Librería de soporte Generación de reconocedores Diseño e Implementación Extensión para el lenguaje Ruby Composición de la librería de soporte Estructura de la definición gramatical y del reconocedor generado Extensión para el lenguaje Python Librería de soporte Estructura de la definición gramatical y del reconocedor generado Implementación Interpretes para la JVM de los lenguajes destinos Otras alternativas Estado actual de las extensiones Conclusiones y Recomendaciones 46 A. Ejemplos de gramáticas de Claire 51 A.1. Calculadora A.1.1. Con destino en jruby A.1.2. Con destino en jython A.2. Lenguaje funcional vii

10 A.2.1. Con destino en jruby A.2.2. Con destino en jython A.3. Subconjunto del lenguaje GaCeLa A.3.1. Destino en jruby A.3.2. Destino en jython viii

11 Índice de tablas 4.1. Comparación de distintos generadores de reconocedores ix

12 Índice de figuras 2.1. Algoritmo de reconocimiento LL Esquema LR utilizado para el reconocimiento Estructura del paquete ve.usb.claire.runtime.java Estructura del módulo Claire::Runtime Estructura del paquete claire.runtime x

13 Lista de Símbolos y Abreviaturas Macro Abreviación de macroinstrucción. LR Left to right, Rightmost Derivation, Reconocimiento de Izquierda a Derecha con Derivación más a la Derecha LALR Look-Ahead, Left to right, Rightmost Derivation, Reconocimiento con Previsión de Izquierda a Derecha con Derivación más a la Derecha P Conjunto potencia. LL Left to right, Leftmost Derivation, Reconocimiento de Izquierda a Derecha con Derivación Más a la Izquierda BNF Forma de Backus-Naur (Backus-Naur Form). Token Unidad indivisible que posee algún significado dentro del lenguaje original. Scanner o Lexer Programa que realiza el análisis lexicográfico de una entrada. Parser Programa que realiza el análisis sintáctico de una entrada. JVM Máquina Virtual de Java (Java Virtual Machine) xi

14 Capítulo 1 Introducción Las primeras computadoras de propósito general se crearon en la década de 1940 (la Z3 de Konrad Zuse en 1941 y la ENIAC en 1946). Estas computadoras poseen como característica fundamental el ser programables, es decir, que pueden cargar y ejecutar conjuntos de instrucciones para realizar diferentes labores. La programación en esa época se realizaba a través del lenguaje de máquina, una serie de códigos en sistema binario que tenía algún significado en la máquina pero era muy díficil de entender para un ser humano convencional. Durante la evolución de las máquinas, la programación se iba complicando gracias a las nuevas características que éstas empezaron a tener. La primera innovación (en la década de 1950) fue la aparición del lenguaje ensamblador. Este lenguaje no es más que una representación simbólica de los códigos utilizados en el lenguaje nativo de máquina, pero provee una capa de abstracción que facilita el desarrollo de programas. En 1954, John Backus publica la especificación de FORTRAN, un lenguaje que busca abstraer más el proceso de programación, al introducir reglas y sintaxis más legibles para el humano. A partir de la salida del primer compilador de FORTRAN (1957), se han desarrollado muchos lenguajes de programación. Ahora el problema radica en construir los sistemas que permitan ejecutar los programas en estos lenguajes. La teoría de autómatas, cuya base está fundamentada en la teoría de lenguajes formales, formalizó el proceso de reconocimiento de lenguajes y sirvió de raíz para el desarrollo de los analizadores sintácticos y lexicográficos utilizados en los compiladores. Para facilitar aún mas la implementación de los lenguajes, se crearon herramientas que permiten generar estos analizadores. 1

15 Para solventar este problema, se han desarrollado muchas herramientas, pero con el pasar del tiempo se han establecido dos que han marcado importancia en la historia de la rama. La primera herramienta es el generador de reconocedores lexicográficos, que genera programas que deciden acerca de la pertenencia o no de una palabra en un lenguaje regular. Son programas básicos y sencillos, que permiten separar la entrada en unidades léxicas que luego serán enviadas a un analizador más sofisticado para su procesamiento. Un generador utilizado normalmente es Lex [1]. La otra herramienta es el generador de reconocedores sintácticos. Un generador automático de reconocedores sintácticos recibe un conjunto de reglas sobre un lenguaje (la gramática de éste) y produce un programa que dada una entrada (por lo general el resultado de un análisis lexicográfico), decide si esta entrada pertenece o no al lenguaje. Estas herramientas pueden, utilizando algún lenguaje de programación de fondo, extender la capacidad de los reconocedores para efectuar acciones o cambios sobre el estado dependiendo de lo que se ha analizado. Varios generadores de reconocedores han surgido en los últimos tiempos, siendo Yacc [2] (o su alternativa libre, Bison [3]) el generador más conocido. En 1998, María Eugenia Ahues, Bernardo Muñoz y Rui Santos (bajo la supervisión del prof. Ascánder Suárez) de la Universidad Simón Bolívar desarrollaron el sistema Yacc4J [4] de generación de reconocedores sintácticos. Luego, en el año 2000, Paúl Pacheco [5] (igualmente supervisado por el prof. Ascánder Suárez) trabajó en la mejora y estabilización del sistema, el cuál fue rebautizado como Claire. Este sistema está desarrollado bajo el lenguaje de programación Java. Un reconocedor generado por Claire integra el análisis lexicográfico y sintáctico bajo una sola infraestructura. Además, Claire presenta la capacidad de generar reglas parametrizables, mejor conocido como macros, y como punto central del trabajo, se puede extender para generar reconocedores en otros lenguajes, aunque actualmente solo lo hace para Java. Este proyecto tiene como fin extender la herramienta para poder generar reconocedores en lenguajes distintos de Java. 2

16 Capítulo 2 Marco Teórico En este capítulo se expondrá la teoría de los lenguajes formales y el reconocimiento de éstos, para luego poder introducir el concepto de compilador, su estructura y los distintos algoritmos utilizados para poder realizar el reconocimiento de los lenguajes a compilar Lenguajes Formales Para poder definir lo que es un lenguaje se debe definir antes los conceptos de símbolo, alfabeto y frase. Un símbolo es un objeto matemático particular, mientras que un alfabeto es un conjunto finito, no vacío de símbolos. Una frase es una secuencia finita de símbolos de un alfabeto [6]. A partir de estos conceptos, se puede decir que un lenguaje es un subconjunto de todas las frases derivadas de un alfabeto particular [6]. Una manera de describir y especificar un lenguaje es a partir de una gramática. La definición de gramática formal, dada por Chomsky [7], es la siguiente: una gramática G es una 4-tupla (N, Σ, P, S) donde: N es un conjunto de símbolos no terminales. Σ es el alfabeto, también denominado como el conjunto de símbolos terminales. Este conjunto tiene que ser disjunto a N. P un conjunto finito de reglas de producción. Una regla de producción es de la forma (Σ N) N(Σ N) (Σ N), donde si A es un alfabeto, A representa una secuencia de cero 3

17 o más símbolos del conjunto A. Una regla de producción α β (donde α (Σ N) N(Σ N) y β (Σ N) ) indica transformaciones de un símbolo no terminal, que puede estar rodeado de cualquier cantidad de símbolos terminales y no terminales (el contexto de la regla), a una frase que contiene símbolos terminales y no terminales. Una aplicación de esta regla sustituye instancias de α por las correspondientes instancias de β. S es el símbolo inicial de producción. Tiene que ser un símbolo no terminal. Una forma sentencial es una frase generada a partir del símbolo inicial. Una derivación es una aplicación sucesiva de reglas de producción que conlleva a una palabra del lenguaje. Una derivación es más a la derecha si siempre se reemplaza los símbolos ubicados más al extremo derecho, mientras que una derivación más a la izquierda hace los reemplazos a partir de los símbolos más a la izquierda. Un árbol de derivación es un árbol cuyo despliegue representa una derivación. Se define una ambigüedad como dos derivaciones que, partiendo del mismo símbolo y tomando caminos distintos, generan la misma frase. Una gramática es ambigua si presenta ambigüedades y un lenguaje es inherentemente ambiguo si toda gramática que genera este lenguaje es ambigua. Dependiendo de la forma de las reglas de producción, se puede establecer una jerarquía de lenguajes. Esta jerarquía se conoce como la jerarquía de Chomsky [7, 8] y se compone de la siguiente forma: Lenguajes regulares. Son todos los lenguajes que pueden ser reconocidos usando gramáticas regulares. Una gramática es regular si solo tiene reglas de sustitución (A a), reglas vacías (A ɛ, donde ɛ es la frase vacía) o reglas de la forma A ab ó A Ba (mas no pueden convivir ambos tipos de reglas en la misma gramática), donde A y B son símbolos no terminales y a es un símbolo terminal. Un formalismo utilizado para expresar lenguajes regulares y las operaciones sobre éstos son las expresiones regulares (REs, [6]). Lenguajes libres de contexto. Son los lenguajes cuyas gramáticas poseen reglas de producción que no dependen del contexto. Formalmente, una gramática de este tipo posee solamente reglas del tipo A γ, donde A es un símbolo no terminal, y γ es una frase que contiene símbolos terminales y no terminales. Una notación utilizada para expresar una gramática libre 4

18 de contexto es la forma Backus-Naur (BNF) [9, 10]. Lenguajes sensitivos al contexto. Las gramáticas de este lenguaje poseen reglas de la forma αaβ αγβ, donde α, β y γ son frases que contienen terminales o no terminales (α y β sería el contexto de aplicación de la regla) y A es un símbolo no terminal. Lenguajes irrestrictos. Son aquellos lenguajes cuyas gramáticas no poseen ninguna restricción en relación a sus reglas de producción. Se puede observar que esta jerarquía es inclusiva - todo lenguaje regular es libre de contexto, sensitivo al contexto y sin restricciones, pero no al revés, igual para los otros tipos de lenguajes. Para efectos de este trabajo, se limitarán los lenguajes estudiados a los regulares y libres de contexto Reconocimiento de Lenguajes Además de las gramáticas, existen otros formalismos para definir lenguajes. Uno de estos formalismos es el de los autómatas. Un autómata es una máquina cuya función es la de decidir si una entrada pertenece o no a un lenguaje. Esta decisión se denomina reconocimiento de un lenguaje. Según la jerarquía de Chomsky introducida en la sección 2.1, existen cuatro tipos de lenguajes. Para cada clase de lenguaje, existe un tipo de autómata que permite reconocer esa clase Autómatas Finitos Un autómata finito es una máquina simple, sin memoria y compuesta de estados y una tabla que contenga las transiciones entre estados, que reconocen los lenguajes regulares. Formalmente, un autómata finito M es una 5-tupla M = (Q, Σ, δ, q 0, F ) donde: Q es el conjunto finito de estados de la máquina Σ es el alfabeto δ : Q (Σ {ɛ}) P(Q) es la función de transición entre estados. q 0 Q es el estado en el que M inicia, y 5

19 F Q es el conjunto de estados finales o de aceptación. Un autómata finito se denomina no-determinístico sin ɛ-transiciones si, para todo estado q, se tiene que δ(q, ɛ) =. Un autómata finito es determinístico si para todo estado q y todo símbolo a del alfabeto se tiene que δ(q, a) 1. Se puede ver que todos estos tipos de autómatas son equivalentes [6], al igual que los autómatas finitos son equivalentes a las gramáticas regulares y a las expresiones regulares [6, 11]. En este trabajo, toda autómata finito va a referir a su variante determinística. Uno puede implementar un reconocedor de lenguajes regulares a mano, siguiendo el proceso de reconocimiento de los autómatas finitos y replicando la función de transición de manera algorítmica Autómatas de Pila Los autómatas finitos, aunque reconocen todos los lenguajes regulares, no pueden reconocer los lenguajes libres de contexto. Para poder reconocer estos, se necesita de una máquina más potente para el reconocimiento de estos lenguajes. Un autómata de pila es una extensión de los autómatas finitos, con la adición de una pila y de control sobre la entrada para poder aumentar la capacidad de reconocimiento. La definición formal de un autómata de pila M es una 7-tupla (Q, Σ, Γ, δ, q 0, Z 0, F ) tal que: Q es el conjunto finito de estados de la máquina Σ es el alfabeto de entrada Γ es el alfabeto de la pila δ : Q Γ (Σ {ɛ}) P(Q Γ ) es la función de transición entre estados. q 0 Q es el estado inicial de la máquina M Z 0 Γ es el símbolo tope inicial de la pila, y F Q es el conjunto de estados finales o de aceptación. El autómata puede terminar de dos formas: al acceder a un estado final o al momento de consumir toda la pila. 6

20 Un autómata de pila es determinístico si en cualquier estado q y pila Z, si δ(q, Z, ɛ) entonces para todo símbolo a del alfabeto δ(q, Z, ɛ) = y, en el caso de que no haya estado con pila sin transición por palabra vacía, entonces solo puede haber a lo sumo una transición para cada símbolo. Los autómatas de pilas generales pueden reconocer toda la clase de lenguajes libres de contexto [6, 11] pero, a diferencia de los autómatas finitos, los autómatas de pila determinísticos no reconocen la totalidad de los lenguajes libres de contexto, pero esta pérdida de generalidad no involucra ningún problema en la práctica, por lo que se usan normalmente para su reconocimiento Técnicas especiales de reconocimiento Desarrollar un autómata de pila puede llegar a ser un proceso complicado para lenguajes grandes, además que una probable implementación de ese autómata puede ser ineficiente, ya que puede requerir volver a un estado anterior para probar nuevos estados. Para simplificar el proceso, existen técnicas de reconocimiento que, sacrificando un poco la capacidad de reconocimiento total de los autómatas de pila, son rápidas (evitan la necesidad de realizar backtracking sobre el árbol de derivación entero) y la dificultad de construcción de estos reconocedores son menores que los tradicionales. De estas técnicas, hay dos importantes: los ascendentes, que construyen el árbol de derivación a partir de las hojas, y los reconocedores descendentes que fabrican el árbol a partir de la raíz del mismo Reconocedores Ascendentes LR Un reconocedor ascendente LR analiza la entrada de izquierda a derecha (L) construyendo la derivación más a la derecha (R) que contenga la frase a reconocer. La idea por detrás de un reconocedor LR es aplicar, de manera inversa, las derivaciones más a la derecha para llegar al símbolo inicial, el cuál indica que la palabra ha sido aceptada. Un reconocedor manual ascendente iría empilando los símbolos conseguidos hasta que pueda asociar lo empilado con una regla, la cuál sustituiría lo empilado con el símbolo presente en la parte izquierda de la regla. Ese conjunto de símbolos que se reemplazan se denomina asa o handle de una forma sentencial. Formalmente, es una sub-frase que corresponde con una parte derecha de una producción tal que su reemplazo por la parte izquierda correspondiente representa un paso a través de una derivación más a la derecha. Un prefijo viable es un prefijo de la forma sentencial que no 7

21 continúa más allá del asa que se encuentra más a la derecha. Para poder realizar un reconocedor LR(0), se necesita primero un autómata que reconozca todos los prefijos viables de G. Para poder utilizar el autómata, se necesita del concepto de item. Un item de una gramática G son todas las tripletas de la forma (A, α, β) tales que A αβ es una producción de G. Se denotan como A α.β. El autómata se construye de la siguiente forma: sea G = (N, Σ, P, S), se define un autómata M p = (Q, N Σ, δ p, I 0, Q { }) donde: Q = P(Items(G)) I 0 es la clausura de los ítems S.α donde S α pertenece a las producciones de G δ p (I j, X) es la clausura de los ítems A αx.β tal que A α.xβ pertenezca al conjunto de ítems I j. Un reconocedor LR(0), utilizando el autómata M p definido anteriormente, es un autómata de pila cuya terminación es por pila vacía donde hace alguna de las siguientes acciones: Empilar Si el símbolo J 1 se encuentra en el tope de la pila y se reconoce a, empilar aj 2 si existe una transición de (J 1, a) a J 2 en M p. Reducir Si x 1 J 1... x n J n se encuentra en el tope de la pila y el item A x 1... x n. pertenece al conjunto de ítems J n asociado a M p, entonces se desempilan todos los símbolos hasta x 1 y se empila el símbolo A. Salto Si J 1 A se encuentra en el tope de la pila y existe una transición de (J 1 A) a J 2 en M p, entonces se empila J 2. Terminar En el caso que I 0 S queden en la pila, se vacía y se acepta la frase. La máquina resultante de realizar estos pasos es el reconocedor LR(0) de G. El problema con LR(0) es que no toda gramática reconocible por un autómata de pila determinístico puede ser reconocido por un reconocedor LR(0) determinístico, ya que hay gramáticas que, conociendo la existencia de autómatas de pila determinísticos que lo reconozcan, pueden generar reconocedores LR(0) no determinísticos [11] o pueden existir conflictos. Un conflicto LR ocurre cuando existe, 8

22 en un conjunto de ítems, dos reglas que pueden inducir a acciones de empilar y reducción simultáneamente (conflicto de empilar-reducir) o dos acciones de reducción al mismo tiempo (conflicto de reducir-reducir). Para resolver el problema, se añade la idea de un conjunto de look-ahead o de previsión que permita al autómata poder decidir que camino tomar. Este conjunto se construye a partir de los símbolos que actúen como prefijos en las frases inmediatamente después de un asa. Se extiende el concepto de item y de clausura para contemplar este nuevo conjunto y la construcción del autómata ahora utiliza el conjunto de previsión para poder decidir a que estado se dirige. El autómata generado por este nuevo proceso es un autómata LR(k) donde k es una cota al conjunto de previsión, aunque siempre se toma 1 ya que todo reconocedor LR(k) puede ser reducido a un reconocedor LR(1). Esta solución elimina los conflictos y el indeterminismo que puede surgir en un reconocedor LR(0), llevando a que los reconocedores LR(1) sean más generales que estos, a cambio de una explosión de espacio considerable (ya que la clausura de ítems ahora considera el conjunto de previsión). Una optimización que se hace a un reconocedor LR(1) es el de mezclar los conjuntos de ítems en el autómata de prefijos viables que contengan los mismos ítems, exceptuando los conjuntos de previsión. Esta optimización, que se conoce como LALR, reconoce menos lenguajes que LR(1) pero utiliza una cantidad notablemente menor de espacio que éste Reconocedores descendentes LL Los reconocedores LL, a diferencia de los LR introducidos en la sección , efectúan el reconocimiento comenzando desde la raíz del árbol de derivación buscando la derivación más a la izquierda. A diferencia de las gramáticas LR, una gramática LL tiene que cumplir con las siguientes restricciones: 1. La gramática no puede ser recursiva a la izquierda. 2. Si existen dos reglas A αβ y A αγ, entonces α = ɛ. 3. Para cada par de no terminales A y terminal a, debe haber a lo sumo una producción que, partiendo de A, derive palabras que empiezan en a. Si una gramática cumple con estas restricciones, construir el reconocedor LL(1) que reconoce el lenguaje se puede hacer de la siguiente forma: 9

23 function llparser(w, γ) si w = $ γ = $ entonces devolver true si no, entonces si w = aw γ = aγ entonces devolver llparser(w, γ ) si no, entonces si w = aw γ = Aγ entonces Sea M[A, a] = A Y 1... Y k devolver llparser(aw, Y 1... Y k γ ) si no, entonces devolver error end si end function a símbolo terminal A símbolo no terminal Figura 2.1: Algoritmo de reconocimiento LL Se construyen dos conjuntos, uno, denominado first(α) que contiene el conjunto de terminales con las que comienzan las palabras derivadas de α (o la palabra vacía. en el caso que α derive a ɛ) y otro, follow(a), que contiene los terminales que pueden aparecer inmediatamente después de A en cualquier forma sentencial. Se construye la tabla LL(1) con la información obtenida de los conjuntos first y follow. La máquina parte con una pila cuyo tope es el símbolo inicial de la gramática, y la entrada. El algoritmo de reconocimiento se especifica en la figura 2.1. Los lenguajes LL(1) reconocen un grupo de lenguajes sin relación a los lenguajes LR(1) - hay lenguajes LL(1) que no pueden ser reconocidos por una máquina LR(1) y viceversa. Los reconocedores LL(1) son fáciles de implementar éstos se pueden implementar rápidamente gracias a una técnica denominada descenso recursivo. El descenso recursivo asocia cada regla con funciones que se llaman recursivamente, de tal forma que el reconocimiento y ejecución de las reglas es una secuencia de llamadas de estas funciones Compilador. Definición y Estructura Un compilador es un programa que lee un programa escrito en un lenguaje denominado fuente y lo traduce en un programa equivalente en otro lenguaje, llamado lenguaje destino [12]. Aunque los compiladores varían de muchas formas (lenguaje destino, forma de reconocimiento o funciones realizadas), éstos siguen un modelo estándar. Este modelo separa a la compilación en 10

24 dos fases importantes: análisis y síntesis. El análisis de un programa busca construir una forma intermedia del programa y comprobar que este programa sea válido según la especificación del lenguaje fuente, mientras que la síntesis busca, dada una representación intermedia de un programa obtenida del proceso anterior, construir la representación en el lenguaje de destino [12]. La fase de importancia de este trabajo es la fase de análisis Análisis de un Programa Para que un compilador pueda reconocer la entrada, y comprobar que es un programa válido para el lenguaje fuente, se necesita realizar un análisis. Este análisis se divide en tres fases: análisis lexicográfico, análisis sintáctico y análisis semántico Análisis Lexicográfico El análisis lexicográfico busca, dado un flujo de caracteres que representa el programa en el lenguaje fuente, leer el flujo de manera lineal y agrupar éste en unidades indivisibles que posean algún significado (token). La porción del compilador encargado de realizar este análisis se denomina scanner, lexer o analizador lexicográfico. Un analizador lexicográfico se puede implementar con un autómata finito que reconozca el lenguaje Análisis Sintáctico El análisis sintáctico intenta determinar, observando el orden en el que se encuentran los tokens en el programa original (proveniente del resultado del análisis lexicográfico), si la entrada se puede agrupar de manera jerárquica en colecciones anidadas con un significado mayor que el que puede poseer un token solo. El programa que se encarga de efectuar el análisis recibe como nombre parser o analizador sintáctico y éste genera un árbol sintáctico una representación intermedia del programa en forma de árbol para una fácil navegación. El mecanismo general utilizado para el análisis sintáctico es el reconocimiento de lenguajes libres de contexto, en especial los autómatas LR, LL y LALR, explicados en la sección

25 Análisis Semántico El análisis semántico revisa el árbol sintáctico generado por la fase del análisis sintáctico y comprueba que el programa cumple las reglas semánticas del lenguaje, y completa el árbol sintáctico con información necesaria para poder realizar la síntesis. Los chequeos que se pueden realizar en esta fase son variados y depende del lenguaje. Algunos ejemplos de chequeos que se hacen son: análisis de tipos, coherencia de variables con respecto a su declaración y optimización de código entre otros. 12

26 Capítulo 3 Introducción a la Herramienta Claire 3.1. Introducción a Claire Claire es un generador de reconocedores sintácticos desarrollado en el lenguaje de programación Java por María Eugenia Ahués, Bernardo Muñoz y Rui Santos en el año 1998 [4] y mejorado por Paúl Pachecoen el año 2000 [5]. Algunas características notables de esta herramienta son: Los reconocedores generados con Claire son, por defecto, LALR(1) [13], aunque se pueden generar reconocedores LR(1) pero estos no se utilizan a costa del tamaño de los reconocedores. Un reconocedor de Claire integra la fase de análisis lexicográfico y sintáctico en una sola herramienta, eliminando así la necesidad de integrar dos herramientas separadas. Claire fué diseñado para poder generar reconocedores sintácticos en cualquier lenguaje, siempre y cuándo la extensión para el lenguaje correspondiente esté presente. Claire posee unas reglas especiales, denominadas macros, que permiten generar reglas gramaticales parametrizadas para ser usadas en cualquier regla. Entre los usos notables de la herramienta están: El lenguaje de programación GaCeLa, un dialecto del lenguaje GCL de Edsger W. Dijkstra. Los proyectos de grado de Wendi Uribarri y de Alejandro Ibarra sobre un editor de especificaciones y de refinamiento de algoritmos basado en la teoría de Carroll Morgan. 13

27 El proyecto de grado de Gabriela Montoya sobre verificación dinámica en Java. La práctica de la asignatura Traductores e Interpretadores en la Universidad Simón Bolívar Definición de una Gramática en Claire La herramienta Claire tiene como entrada una gramática. La definición de esta gramática de entrada puede llevar los siguientes componentes: Preámbulo Directivas referentes a la gramática Definiciones de las reglas sintácticas Definiciones de las reglas lexicográficas Preámbulo El preámbulo es un fragmento de código del lenguaje destino, el cuál puede definir o ejecutar código (dependiendo del lenguaje) antes de la definición de la gramática. El preámbulo puede empezar de dos formas: o utilizando código directamente (e indicar en la línea de comando cuál es el lenguaje destino, o utilizar el lenguaje defecto que es Java) o indicar el lenguaje utilizando la directiva lang Directivas del reconocedor Claire acepta las siguientes directivas: Directiva start: indica al reconocedor cuales son los posibles puntos de inicio en el autómata LR. Por defecto, Claire empieza en la primera regla sintáctica definida. Directiva expand: determina el número máximo de expansiones de las macros. Mayor información relacionada a las macros en la sección Directiva nomain y main: indica a Claire si el reconocedor generado va a incluir o no el código necesario para que el reconocedor funcione como un programa. 14

28 Definición de las reglas En esta sección del archivo de definiciones, se encuentran las reglas que definen la gramática. Hay dos tipos de reglas: las reglas lexicográficas, que definen los tokens asociados al lenguaje, y las reglas sintácticas, que definen las producciones del lenguaje libre de contexto Reglas lexicográficas Una regla lexicográfica se define en Claire utilizando expresiones regulares. El formato de las expresiones regulares utilizadas en la herramienta se encuentra en [5, 13, 14]. En el caso que se consigan dos expresiones regulares en sucesión, Claire dará prioridad siempre a la primera expresión regular encontrada. Esto se puede evitar indicando el orden apropiado, o utilizando alias para identificar las expresiones regulares. Alias Un alias es un identificador que se le puede asignar a un símbolo. Son utilizados principalmente para poder identificar expresiones regulares. Un alias, en Claire se define de la siguiente forma: alias = símbolo En cualquier parte de la gramática que se necesite el símbolo, se puede utilizar el alias y Claire se encarga de realizar la sustitución correspondiente Reglas sintácticas La definición de una regla sintáctica en Claire es de la forma: parteizquierda : partederecha Varias reglas pueden utilizar la misma parte izquierda. En el caso que esto ocurra, se pueden agrupar esas reglas como: parteizquierda : partederecha1 partederecha2... partederecha_n 15

29 Una parte derecha puede tener cero o más símbolos gramaticales, expresiones regulares o alias, separados con espacios en blanco. En el caso de no tener símbolos, se deja la regla en blanco. Precedencia y Asociatividad Pueden existir gramáticas que posean ambigüedades. Para evitar estas ambiguedades (que pueden evitar que un reconocedor funcione correctamente), se puede romper las ambigüedades usando reglas de precedencia y asociatividad. Una regla de precedencia se representa como un número entero después de la regla correspondiente tal que mientras menor sea el número, menor es la precedencia de la regla y, por consiguiente, esa regla tiene mayor prioridad para ser reconocida de primero. La sintaxis para asignar precedencia es: parteizquierda : partederecha1 prec1 partederecha2 prec2... partederecha_n precn En el caso de que la reglas tengan la misma precedencia, se puede usar la asociatividad. Las reglas de asociatividad se definen en Claire como: parteizquierda : partederecha prec %asoc Una regla puede asociarse a la izquierda ( %left), a la derecha ( %right) o puede no tener asociatividad ( %nonassoc). Acciones semánticas A cada regla de la gramática se le puede asignar una acción semántica, que es una porción de código del lenguaje destino que será ejecutado al momento de reconocer la regla. La sintaxis para las acciones semánticas es la siguiente: parteizquierda : partederecha { codigo } En el caso en el que el lenguaje destino acepte tipos (como es el caso de Java, el lenguaje por defecto de Claire), se puede indicar a Claire cuál es el tipo de datos asociado a la regla. Para indicar esto, se utiliza: 16

30 <Tipo>parteIzquierda : partederecha { codigo } Dentro del código asociado a la acción semántica, se pueden utilizar dos tipos de variables: Variables que indican el valor de un símbolo en específico. En el caso de Java, estas variables se definen como $n, donde n es la posición del símbolo a partir del símbolo inicial (que es el símbolo 0). La variable $$ que define el resultado de la regla. Esta variable tiene que tener un valor del tipo definido en la regla. El valor devuelto por una expresión regular es siempre del tipo que define las cadenas de caracteres en el lenguaje de destino (en el caso de Java, String). Macros Una macro se define, en el contexto de Claire, como una regla gramatical parametrizada, en donde los parámetros son símbolos gramaticales. Una macro puede utilizar sus parámetros en la mano derecha y puede invocarse recursivamente. Un ejemplo de una macro es la clausura reflexivo-transitiva (o estrella de Kleene). Una macro que define este operador sería: estrella(regla) : estrella(regla) regla /* vacio */ Claire, al encontrar una llamada de macro, realiza la expansión de ésta, que genera una regla nueva, reemplazando los parámetros con el valor correspondiente y las llamadas recursivas por el símbolo asociado a la regla nueva. Un problema que puede existir con las llamadas recursivas en una macro, es que pueda ocurrir un ciclo infinito. Sea la siguiente macro: m(x) : m(m(x)) Al expandir la llamada de m, Claire encuentra una llamada no recursiva y realiza una nueva expansión. Al expandir la nueva regla, observa que tiene que expandir otra vez la misma regla y así sigue hasta el infinito. Para evitar estos ciclos, se tiene un límite al número de expansiones, que se puede 17

31 especificar en la gramática o como un parámetro al momento de generar el reconocedor. Al llegar al número máximo de expansiones, se cortan y se emite una advertencia al usuario Estructura Interna de Claire Claire está compuesto por cinco módulos importantes: Reconocimiento de la gramática y las unidades sintácticas. Reconocimiento de las unidades lexicográficas. Generación de tablas. Generación de los reconocedores. Librerías de soporte para la ejecución. Se pueden dividir estos módulos en dos grupos: aquellos módulos que no dependen del lenguaje destino, y aquellos que si. Los tres primeros módulos no son dependientes del lenguaje a la cual se va a generar el reconocedor, ya que se encargan de procesar la gramática y de obtener los datos necesarios para la construcción del reconocedor. En cambio, la generación y traducción del reconocedor y las librerías de soporte si dependen del lenguaje. Se puede observar que, para acoplar un nuevo lenguaje, simplemente se tiene que trabajar en los dos últimos módulos. Se procede a describir cada módulo, aunque no se va a ahondar mucho en los módulos que no dependen del lenguaje. Una explicación más profunda referente a estos módulos se encuentra en [5] Reconocimiento de la gramática El módulo de reconocimiento de gramáticas es el principal motor de Claire para la generación de reconocedores, ya que realiza las labores de procesar la gramática recibida, de invocar al módulo de unidades lexicográficas para construir el AFD que reconozca las expresiones regulares y de generar las tablas LR/LALR en conjunción con el módulo de generación de tablas. El resultado de la aplicación de este módulo es una estructura que contiene toda la información relacionada al reconocedor de la gramática recibida (tablas, código a sustituir y los índices necesarios para el funcionamiento de la tabla). 18

32 Este módulo está implementado en el paquete ve.usb.claire.contextfree de la distribución de Claire Reconocimiento de las unidades lexicográficas Este módulo se encarga de reconocer todas las expresiones regulares, y construir el autómata finito que reconozca estas expresiones. Dentro de la distribución de Claire, el paquete ve.usb.claire. regexp contiene el reconocedor de expresiones regulares y los métodos asociados al manejo de éstos Generación de tablas Este módulo tiene como fin el dar una infraestructura para el manejo de tablas, incluyendo la definición de la tabla, sus métodos asociados y los métodos para la creación de tablas. La estructura completa de las tablas aparece explicado en [5]. Este módulo reside, dentro de la distribución, en el paquete ve.usb.claire.table Construcción de reconocedores Ya después de haber procesado la entrada, y haber generado los datos referentes al lenguaje, este módulo utiliza estos datos para poder construir el reconocedor en el lenguaje objetivo. Para construir el reconocedor, Claire necesita de dos componentes: una plantilla que contenga un esquema del reconocedor en el lenguaje destino y un traductor que pueda llenar la plantilla con los datos relacionados a la gramática y sus acciones. El contenido de la plantilla depende del lenguaje, pero debe tener capacidad de guardar la tabla y los índices necesarios para poder obtener los datos de ésta, un método, procedimiento o función para ejecutar las acciones asociadas a las construcciones gramaticales, y un sitio en donde se pueda escribir el preámbulo especificado en la gramática fuente. El traductor se encarga de escribir la plantilla con los datos recibidos del resultado del reconocimiento de la gramática, y generar el reconocedor en el lenguaje destino Paquete de ejecución dependiente del lenguaje Para poder ejecutar los reconocedores generados por Claire, se necesitan los siguientes componentes implementados en el lenguaje de destino: 19

33 pila pilav acia empilar(s 0, pila) i p apuntador al primer símbolo de w$ por siempre hacer s el estado en el tope de la pila a el símbolo apuntado por i p si action(s, a) = empilar s entonces empilar(a, pila) empilar(s, pila) Avanzar i p al próximo símbolo de entrada si no, entonces si action(s, a) = reducir A β entonces Desempilar 2 β de la pila. s el estado al tope de la pila empilar(a, pila) empilar(goto(s, A), pila) Ejecutar la acción asociada a la producción A β usando los valores en pila si no, entonces si action(s, a) = aceptar entonces return end si end por Figura 3.1: Esquema LR utilizado para el reconocimiento El autómata LR para poder realizar el reconocimiento de las reglas sintácticas. Este necesita de la tabla (generada en la gramática) y del algoritmo LR. La versión utilizada por Claire se muestra en la figura 3.1. Un algoritmo que simule un autómata finito para el reconocimiento de las reglas lexicográficas a partir de la entrada. Un manejador nativo para las tablas LR y LALR Generación de Reconocedores en Claire Reconocimiento de la gramática La herramienta, al inicio, recibe por entrada una gramática (que no necesariamente posee código válido del lenguaje destino) y, en el caso que ésta sea válida, se expanden las macros, se resuelven los alias o nombres utilizados en la gramática fuente y se genera, de la gramática resultante, una representación intermedia que contiene las reglas y las expresiones regulares. 20

34 Generación de las tablas Claire, en este punto, procede a generar la tabla LR asociada a la gramática. Por defecto, intentará construir la tabla LALR aunque, en el caso que la gramática no pueda ser reconocida por una tabla LALR el usuario puede solicitar que se genere la tabla LR(1) asociada a este. Las tablas, en Claire, se construyen en dos etapas: la primera, Claire genera la tabla LR/LALR asociada a la gramática y luego se comprimen de tal forma que los espacios vacíos se reutilicen con la información asociada a otros estados. El resultado de esta compresión son dos tablas, la tabla index que contiene los índices en que empiezan los datos asociados a un estado, y una tabla general que contiene el resultado de la tabla, comprimido. Para mayor información asociada a la compresión de las tablas, revisar [5] Traducción al lenguaje destino Ya procesada la gramática y generada la tabla, el siguiente paso es generar el reconocedor en el lenguaje destino. Esto involucra traducir la gramática, las acciones y las tablas al lenguaje destino. El traductor realiza las siguientes acciones, en orden: En el caso que el lenguaje lo facilite, reconocer el preámbulo para obtener información relevante, por ejemplo, la definición de la clase de Java más externa asociada al archivo (como debe haber una sola clase por archivo fuente, entonces el reconocedor estará implementado en esta clase). Sustituir las porciones de la plantilla asociada al lenguaje (tanto las mencionadas en la sección con los códigos o valores asociados a la gramática actual). Reemplazar toda variable $n y $$ en las acciones asociadas a las reglas gramaticales con los valores correspondientes en la pila LR. El resultado de estas acciones es un programa en el lenguaje destino que sirve como reconocedor del lenguaje especificado originalmente en la gramática. 21

35 3.5. Estado Actual Antes de comenzar con el trabajo, la herramienta Claire se encuentra en la versión 5.10, publicada en noviembre del Todos los componentes anteriormente mencionados funcionan completamente, pero solo genera reconocedores para el lenguaje de programación Java (de la versión 1.4 en adelante). 22

36 Capítulo 4 Herramientas Relacionadas En este capítulo se presentan otros generadores de reconocedores sintácticos que generan reconocedores para los lenguajes anteriormente tratados y que se usan en la actualidad. Se plantea además, una comparación entre estos, la cuál está reflejada en la tabla JavaCC El generador de reconocedores JavaCC (Java Compiler Complier) [24] es uno de los generadores de reconocedores más utilizados en aplicaciones Java. Fue creado en 1996 como un proyecto de Sun Microsystems para desarrollar un generador de reconocedores LL(k). La versión más reciente (hasta este momento) es la Características de JavaCC JavaCC genera reconocedores LL(k), donde la k se puede especificar para cada regla aparte, de ser necesario. Por defecto, JavaCC genera reconocedores LL(1). Utiliza una notación BNF extendida. Integra análisis lexicográfico y sintáctico en el mismo paso. Genera reconocedores nada más para el lenguaje de programación Java. Incluye herramientas para el preprocesamiento de árboles, documentación y reporte de errores. 23

37 4.2. ANTLR ANother Tool for Language Recognition (ANTLR) [25] es una herramienta desarrollada por el prof. Terrence Parr de la Universidad de San Francisco cuyo fin es la automatización de labores de generación de reconocedores descendientes recursivos. Fue diseñado con la capacidad de generar salidas para varios lenguajes y ya tiene varios lenguajes implementados. La principal innovación de ANTLR es su técnica de reconocimiento, denominada LL(*), que permite variar el look-ahead sin necesidad de fijarlo. La versión más reciente de ANTLR es la Características de ANTLR ANTLR genera reconocedores LL(*), una variación de los reconocedores LL(k) con conjuntos look-ahead arbitrarios determinados por el algoritmo. Utiliza una notación similar a la notación BNF extendida. Genera reconocedores lexicográficos y sintácticos separadamente, pero usando el mismo archivo de definición. No hay necesidad de un reconocedor lexicográfico aparte. Tiene capacidad para generar reconocedores en varios lenguajes destino: Java, C, C++, C#, Objective/C, Python y Ruby CUP Basado en la herramienta Yacc [2], Java(tm) Based Constructor of Useful Parsers (CUP) [26] es un generador de reconocedores sintácticos LALR para Java. Fue diseñado para ser muy parecido a Yacc, con la diferencia de que genera reconocedores en Java en vez de C, y que utiliza código embebido Java. La versión más reciente de CUP es 0.10k (estable) y 0.11a (beta) Características de CUP Los reconocedores generados por CUP son LALR(1). Utiliza una notación similar a BNF simple. Requiere de un reconocedor lexicográfico aparte, como por ejemplo, JLex [27] o JFlex [28]. 24

38 Sólo genera reconocedores para Java Yapps Yet Another Python Parsing System (Yapps) [29] es un generador de reconocedores desarrollado en Python por Amit Patel. Fue diseñado principalmente para ser fácil de usar y que se pueda integrar a Python. El principal defecto de este reconocedor es que solo puede reconocer strings. Esto se puede pasar si se lee todo el archivo y luego se reconoce con Yapps, pero no es recomendable para archivos muy grandes. La última versión de Yapps es la (estable) y (desarrollo). No se actualiza desde el Características de Yapps Los reconocedores de Yapps son LL(1). Utiliza un subconjunto de la notación BNF extendida. Genera sus propios reconocedores lexicográficos. Está hecho en Python y solo genera reconocedores en Python. Solo es capaz de reconocer strings. No está diseñado con archivos en mente SPARK SPARK [30] es un reconocedor desarrollado en Python cuya característica principal es que utiliza el algoritmo de reconocimiento de Earley [31] como la técnica de reconocimiento. Este algoritmo es más general que LR(1) o LL(k), a cambio de velocidad. SPARK ha ganado reconocimiento al integrarse a la distribución estándar de Python Características de SPARK Utiliza el algoritmo de Earley para reconocimiento sintáctico. Utiliza notación BNF. 25

16 Análisis sintáctico I

16 Análisis sintáctico I 2 Contenido Recordando la estructura de un compilador Recordando el análisis léxico l análisis sintáctico Comparación con el análisis léxico l Rol del Parser Lenguajes de programación Gramáticas structura

Más detalles

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I

Tema 4: Gramáticas independientes del contexto. Teoría de autómatas y lenguajes formales I Tema 4: Gramáticas independientes del contexto Teoría de autómatas y lenguajes formales I Bibliografía Hopcroft, J. E., Motwani, R., y Ullman, J. D. Introducción a la Teoría de Autómatas, Lenguajes y Computación.

Más detalles

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V. Compiladores: Análisis Sintáctico Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V. Sintaxis Define la estructura del lenguaje Ejemplo: Jerarquía en

Más detalles

Procesadores de Lenguaje

Procesadores de Lenguaje Procesadores de Lenguaje Repaso TALF Cristina Tîrnăucă Dept. Matesco, Universidad de Cantabria Fac. Ciencias Ing. Informática Primavera de 2013 La Jerarquía de Chomsky Cuatro niveles de lenguajes formales

Más detalles

Capítulo 9. Introducción a los lenguajes formales. Continuar

Capítulo 9. Introducción a los lenguajes formales. Continuar Capítulo 9. Introducción a los lenguajes formales Continuar Introducción Un lenguaje es un conjunto de símbolos y métodos para estructurar y combinar dichos símbolos. Un lenguaje también recibe el nombre

Más detalles

Conceptos básicos sobre gramáticas

Conceptos básicos sobre gramáticas Procesamiento de Lenguajes (PL) Curso 2014/2015 Conceptos básicos sobre gramáticas Gramáticas y lenguajes Gramáticas Dado un alfabeto Σ, un lenguaje es un conjunto (finito o infinito) de cadenas de símbolos

Más detalles

Procesadores de Lenguaje

Procesadores de Lenguaje Procesadores de Lenguaje Analizadores sintácticos descendentes: LL(1) Cristina Tîrnăucă Dept. Matesco, Universidad de Cantabria Fac. Ciencias Ing. Informática Primavera de 2013 Analizadores sintácticos

Más detalles

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1

Lenguajes y Compiladores Análisis Sintáctico Parte I. Teoría Lenguajes 1 Facultad de Ingeniería de Sistemas Lenguajes y Compiladores Análisis Sintáctico Parte I 1 Introducción El analizador sintáctico recibe una secuencia de tokens y decide si la secuencia está correcta o no.

Más detalles

Unidad 4. Autómatas de Pila

Unidad 4. Autómatas de Pila Unidad 4. Autómatas de Pila Una de las limitaciones de los AF es que no pueden reconocer el lenguaje {0 n 1 n } debido a que no se puede registrar para todo n con un número finito de estados. Otro lenguaje

Más detalles

JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores.

JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores. 1 Compiladores / Guía VII / Ciclo 02-2016 Centro de Investigación y Transferencia de Tecnología JavaCC Parte I Contenido Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores En la presente

Más detalles

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55

Contenido. Capítulo 1. Teoría de conjuntos. 1. Capítulo 2. Lenguaje. 39. Capítulo 3. Lenguajes formales. 55 Contenido Capítulo 1. Teoría de conjuntos. 1 1.1 Conjuntos.... 3 1.1.1 Definiciones básicas.... 3 1.1.2 Operaciones sobre conjuntos.... 6 1.1.3 Diagrama de Venn.... 7 1.1.4 Álgebra de conjuntos.... 7 1.2

Más detalles

Unidad II: Análisis semántico

Unidad II: Análisis semántico Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico

Más detalles

Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas

Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas Unidad I Introducción a la programación de Sistemas M.C. Juan Carlos Olivares Rojas Agenda 1.1 Qué es y que estudia la programación de sistemas? 1.2 Herramientas desarrolladas con la teoría de programación

Más detalles

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular. MODELOS DE COMPUTACION I Preguntas Tipo Test Indicar si son verdaderas o falsas las siguientes afirmaciones: 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular. 2.

Más detalles

Compiladores: Parsing ascendente

Compiladores: Parsing ascendente Compiladores: Parsing ascendente Francisco J Ballesteros LSUB, URJC Page 1 of 64 Parsing ascendente Normalmente utilizaremos parsers descendentes para problemas pequeños cuando podemos escribir uno predictivo

Más detalles

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR:

PROGRAMA DE LABORATORIO SECCIÓN: ÁREA A LA QUE PERTENECE: POS-REQUISITO: AUXILIAR: UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERÍA ESCUELA DE CIENCIAS PROGRAMA DE LABORATORIO CÓDIGO: 777 CRÉDITOS: 4 NOMBRE CURSO: ESCUELA: PRE-REQUISITO: Organización de Lenguajes y Compiladores

Más detalles

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación COMPILADORES Unidad I: Introducción al proceso de compilación Flor Prof. Flor Narciso GIDyC-Departamento de Computación LABSIULA-Escuela de Ingeniería de Sistemas Facultad de Ingeniería Universidad de

Más detalles

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013 TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES Ingeniería Técnica en Informática de Sistemas Segundo curso Departamento de Informática y Análisis Numérico Escuela Politécnica Superior Universidad de Córdoba

Más detalles

1. Computadores y programación

1. Computadores y programación 1. Computadores y programación Informática y computadora (RAE) Informática (Ciencia de la computación) Conjunto de conocimientos científicos y técnicos que hacen posible el tratamiento automático de la

Más detalles

Gramáticas libres de contexto

Gramáticas libres de contexto Gramáticas libres de contexto Conceptos básicos El siguientes es un ejemplo de una gramática libre de contexto, a la cual llamaremos G1. A 0A1 A B B # Una gramática consiste de una colección de reglas

Más detalles

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute.

Es un conjunto de palabras y símbolos que permiten al usuario generar comandos e instrucciones para que la computadora los ejecute. Los problemas que se plantean en la vida diaria suelen ser resueltos mediante el uso de la capacidad intelectual y la habilidad manual del ser humano. La utilización de la computadora en la resolución

Más detalles

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002 Departamento de Cs. e Ingeniería de la Computación Universidad Nacional del Sur Ejercicios Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto

Más detalles

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 3.

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 3. UNIVRSIDAD NACIONAL D DUCACIÓN A DISTANCIA scuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes Tema 3 Parte I Análisis Sintáctico Javier Vélez Reyes jvelez@lsi.uned.es Objetivos

Más detalles

Introducción a la Lógica y la Computación

Introducción a la Lógica y la Computación Introducción a la Lógica y la Computación Parte III: Lenguajes y Autómatas Clase del 4 de Noviembre de 2015 Parte III: Lenguajes y Autómatas Introducción a la Lógica y la Computación 1/21 Lenguajes Formales

Más detalles

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo TEMA 2: CONCEPTOS BÁSICOS DE ALGORÍTMICA 1. Definición de Algoritmo 1.1. Propiedades de los Algoritmos 2. Qué es un Programa? 2.1. Cómo se construye un Programa 3. Definición y uso de herramientas para

Más detalles

El análisis descendente LL(1) 6, 7 y 13 de abril de 2011

El análisis descendente LL(1) 6, 7 y 13 de abril de 2011 6, 7 y 13 de abril de 2011 Analizadores sintácticos (repaso) Los analizadores descendentes: Corresponden a un autómata de pila determinista. Construyen un árbol sintáctico de la raíz hacia las hojas (del

Más detalles

Tema 2 Introducción a la Programación en C.

Tema 2 Introducción a la Programación en C. Tema 2 Introducción a la Programación en C. Contenidos 1. Conceptos Básicos 1.1 Definiciones. 1.2 El Proceso de Desarrollo de Software. 2. Lenguajes de Programación. 2.1 Definición y Tipos de Lenguajes

Más detalles

El proceso del Análisis Léxico

El proceso del Análisis Léxico El proceso del Análisis Léxico El proceso de análisis léxico se refiere al trabajo que realiza el scanner con relación al proceso de compilación. El scanner representa una interfaz entre el programa fuente

Más detalles

Las Etapas de la Compilación

Las Etapas de la Compilación Las de la Compilación El en la Compilación Universidad de Cantabria Outline 1 El Problema 2 Las y el Qué pasos son necesarios dar para hallar la estructura de un programa? En qué pasos podemos dividirlos

Más detalles

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior. Trabajo Final

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior. Trabajo Final Trabajo Final 1 Objetivo Comprender (en gran parte) un programa desarrollado en: C++ (Core ) Generador de código / Ejecución de comandos Flex (Lex) Lexer Genera un Analizador Léxico en C http://en.wikipedia.org/wiki/lex_(software)

Más detalles

GRAMÁTICAS LIBRES DE CONTEXTO

GRAMÁTICAS LIBRES DE CONTEXTO GRAMÁTICAS LIBRES DE CONTEXTO Definición Una gramática libre de contexto (GLC) es una descripción estructural precisa de un lenguaje. Formalmente es una tupla G=, donde Vn es el conjunto

Más detalles

Tema: Autómatas de Estado Finitos

Tema: Autómatas de Estado Finitos Compiladores. Guía 2 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Autómatas de Estado Finitos Contenido En esta guía se aborda la aplicación de los autómatas en el campo de

Más detalles

Tema: Análisis Sintáctico

Tema: Análisis Sintáctico Compiladores. Guía 3 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Análisis Sintáctico Contenido En esta guía se abordarán los conceptos pertenecientes al componente de análisis

Más detalles

Introducción a la programación

Introducción a la programación Introducción a la programación Conceptos Básicos El objetivo fundamental de éste curso es enseñar a resolver problemas mediante una computadora. El programador de computadoras es antes que nada una persona

Más detalles

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas Gramáticas Introducción Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas En algunos lenguajes, una sucesión de símbolos depende del

Más detalles

GRAMATICAS LIBRES DEL CONTEXTO

GRAMATICAS LIBRES DEL CONTEXTO GRMTICS LIBRES DEL CONTEXTO Estas gramáticas, conocidas también como gramáticas de tipo 2 o gramáticas independientes del contexto, son las que generan los lenguajes libres o independientes del contexto.

Más detalles

5 Autómatas de pila 5.1 Descripción informal. 5.2 Definiciones

5 Autómatas de pila 5.1 Descripción informal. 5.2 Definiciones 1 Curso Básico de Computación 5 Autómatas de pila 5.1 Descripción informal Un autómata de pila es esencialmente un autómata finito que controla una cinta de entrada provista de una cabeza de lectura y

Más detalles

Unidad IV Análisis Sintáctico. M.C. Juan Carlos Olivares Rojas

Unidad IV Análisis Sintáctico. M.C. Juan Carlos Olivares Rojas Unidad IV Análisis Sintáctico M.C. Juan Carlos Olivares Rojas Agenda 4.1 Introducción a las Gramáticas libres de contexto y árboles de derivación. 4.2 Diagramas de sintaxis. 4.3 Precedencia de operadores.

Más detalles

METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA

METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA METACOMPILADOR DIDÁCTICO GENERADOR DE CÓDIGO JAVA Erick Leonel Rico Preciado 1, Ana Cristina Bueno Campos 1, José Gerardo Carpio Flores 2, Ruth Sáez de Nanclares Rodríguez 2, Martha Alicia Rocha Sánchez

Más detalles

Tema 3: Gramáticas regulares. Teoría de autómatas y lenguajes formales I

Tema 3: Gramáticas regulares. Teoría de autómatas y lenguajes formales I Tema 3: Gramáticas regulares Teoría de autómatas y lenguajes formales I Bibliografía Hopcroft, J. E., Motwani, R., y Ullman, J. D. Introducción a la Teoría de Autómatas, Lenguajes y Computación. Addison

Más detalles

PROGRAMA INSTRUCCIONAL AUTOMATAS Y LENGUAJES FORMALES

PROGRAMA INSTRUCCIONAL AUTOMATAS Y LENGUAJES FORMALES UNIVERSIDAD FERMIN TORO VICE RECTORADO ACADEMICO UNIVERSIDAD FACULTAD DE INGENIERIA ESCUELA DE MANTENIMIENTO MECÁNICO ESCUELA DE TELECOMUNICACIONES ESCUELA DE ELÉCTRICA ESCUELA DE COMPUTACIÓN PROGRAMA

Más detalles

1. Cadenas EJERCICIO 1

1. Cadenas EJERCICIO 1 LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007 - BOLETÍN DE EJERCICIOS Víctor J. Díaz Madrigal y José Miguel Cañete Departamento de Lenguajes y Sistemas Informáticos 1. Cadenas La operación reversa aplicada

Más detalles

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014 CUP Diseño de compiladores CUP Cup es un generador de analizadores sintácticos LALR Recibe de entrada un archivo con la estructura de la gramática y su salida es un parser escrito en Java Manual oficial:

Más detalles

Computabilidad y lenguajes formales: Sesión 19. Gramáticas Incontextuales (Context Free Grammars)

Computabilidad y lenguajes formales: Sesión 19. Gramáticas Incontextuales (Context Free Grammars) Computabilidad y lenguajes formales: Sesión 19. Gramáticas Incontextuales (Context Free Grammars) Prof. Gloria Inés Alvarez V. Departamento de Ciencias e Ingeniería de la Computación Pontificia Universidad

Más detalles

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos

SISTEMAS INFORMÁTICOS PROGRAMACION I - Contenidos Analíticos Ing. Alejandro Guzmán M. TEMA 2. Diseño de Algoritmos TEMA 2 Diseño de Algoritmos 7 2. DISEÑO DE ALGORITMOS 2.1. Concepto de Algoritmo En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus

Más detalles

CONJUNTOS REGULARES. Orlando Arboleda Molina. 19 de Octubre de Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle

CONJUNTOS REGULARES. Orlando Arboleda Molina. 19 de Octubre de Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle CONJUNTOS REGULARES Orlando Arboleda Molina Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle 19 de Octubre de 2008 Contenido Expresiones regulares Teorema de Kleene Autómatas

Más detalles

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Tema 2 Conceptos básicos de programación. Fundamentos de Informática Tema 2 Conceptos básicos de programación Fundamentos de Informática Índice Metodología de la programación Programación estructurada 2 Pasos a seguir para el desarrollo de un programa (fases): Análisis

Más detalles

Tema: Autómata de Pila

Tema: Autómata de Pila Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores 1 Tema: Autómata de Pila Contenido La presente guía aborda los autómatas de pila, y se enfoca en la aplicación que se le puede dar a estas

Más detalles

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal Algoritmos y solución de problemas Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal Introducción Departamento de Electrónica, Sistemas e Informática En las ciencias de la computación

Más detalles

Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo

Tema 4: Análisis sintáctico ascendente. Análisis sintáctico ascendente: un ejemplo Tema 4: Análisis sintáctico ascendente Procesamiento de enguajes Dept. de enguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de enguajes Tema 4: Análisis sintáctico ascendente 1 / 21

Más detalles

Procesadores de lenguaje Tema Análisis sintáctico (Parte II)

Procesadores de lenguaje Tema Análisis sintáctico (Parte II) Procesadores de lenguaje Tema 3 Análisis sintáctico (Parte II) Salvador Sánchez, Daniel Rodríguez Departamento de Ciencias de la Computación Universidad de Alcalá Resumen Análisis sintáctico ascendente

Más detalles

Generación de Código Intermedio

Generación de Código Intermedio Generación de Código Intermedio Programación II Margarita Álvarez Generación de código intermedio Con la generación de código intermedio se inicia la tarea de síntesis. Aunque un programa fuente se puede

Más detalles

Departamento de Tecnologías de la Información. Tema 4. Máquinas de Turing. Ciencias de la Computación e Inteligencia Artificial

Departamento de Tecnologías de la Información. Tema 4. Máquinas de Turing. Ciencias de la Computación e Inteligencia Artificial Departamento de Tecnologías de la Información Tema 4 Máquinas de Turing Ciencias de la Computación e Inteligencia Artificial Índice 4.1 Límites de los autómatas 4.2 Definición de Máquina de Turing 4.3

Más detalles

Inducción en definiciones y demostraciones AUTÓMATAS Y LENGUAJES FORMALES PRELIMINARES MATEMÁTICOS. Números naturales. Inducción matemática

Inducción en definiciones y demostraciones AUTÓMATAS Y LENGUAJES FORMALES PRELIMINARES MATEMÁTICOS. Números naturales. Inducción matemática Inducción en definiciones y demostraciones AUTÓMATAS Y LENGUAJES FORMALES PRELIMINARES MATEMÁTICOS Francisco Hernández Quiroz Departamento de Matemáticas Facultad de Ciencias, UNAM E-mail: fhq@ciencias.unam.mx

Más detalles

300CIG007 Computabilidad y Lenguajes Formales: Autómatas Finitos

300CIG007 Computabilidad y Lenguajes Formales: Autómatas Finitos 300CIG007 Computabilidad y Lenguajes Formales: Autómatas Finitos Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V. Qué es un computador? Todos lo sabemos!!!

Más detalles

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07 PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07 1. En qué método de análisis sintáctico puede suceder que en la construcción del árbol de derivación de las posibles expansiones de un símbolo no terminal

Más detalles

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 4

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 4 UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes Tema 4 Análisis Sintáctico Ascendente Javier Vélez Reyes jvelez@lsi.uned.es Objetivos

Más detalles

Las Gramáticas LL. Gramáticas con Parsing Eficiente. Universidad de Cantabria

Las Gramáticas LL. Gramáticas con Parsing Eficiente. Universidad de Cantabria Las (k) Las Gramáticas con Parsing Eficiente Universidad de Cantabria Outline Las (k) 1 Las (k) 2 3 Las (k) Formalizalización del Concepto LL Definición Una gramática libre de contexto G = (V, Σ, Q 0,

Más detalles

Expresiones regulares, gramáticas regulares

Expresiones regulares, gramáticas regulares Expresiones regulares, gramáticas regulares Los LR en la jerarquía de Chomsky La clasificación de lenguajes en clases de lenguajes se debe a N. Chomsky, quien propuso una jerarquía de lenguajes, donde

Más detalles

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA Diseño de compiladores Gestión de la memoria / Generación de código ORGANIZACIÓN DE MEMORIA Organización de memoria Depende del tipo de lenguaje (declarativos, imperativos), del compilador y del sistema

Más detalles

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas.

LEX. Las definiciones y subrutinas son opcionales. El segundo %% es opcional pero el primer %% indica el comienzo de las reglas. LEX Estructura de un programa en LEX { definiciones { reglas { subrutinas del usuario Las definiciones y subrutinas son opcionales. El segundo es opcional pero el primer indica el comienzo de las reglas.

Más detalles

Universidad Autónoma Metropolitana Unidad Azcapotzalco. División de Ciencias Básicas e Ingeniería. Licenciatura en Ingeniería en Computación

Universidad Autónoma Metropolitana Unidad Azcapotzalco. División de Ciencias Básicas e Ingeniería. Licenciatura en Ingeniería en Computación Universidad Autónoma Metropolitana Unidad Azcapotzalco División de Ciencias Básicas e Ingeniería Licenciatura en Ingeniería en Computación Propuesta de Proyecto Terminal Clasificación de servicios web

Más detalles

ALGORITMOS DIGITALES II. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

ALGORITMOS DIGITALES II. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006 ALGORITMOS DIGITALES II Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006 OBJETIVOS Conocer los principios básicos de los algoritmos. Establecer paralelos entre los algoritmos, los programas y las

Más detalles

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO Autómatas de pila y lenguajes independientes del contexto -1- AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO AUTÓMATAS DE PILA - Son autómatas finitos con una memoria en forma de pila. - Símbolos

Más detalles

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria 1.2. Jerarquía de niveles de un computador Qué es un computador? Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria Es un sistema tan complejo

Más detalles

Tema V Generación de Código

Tema V Generación de Código Tema V Generación de Código Una vez que se ha realizado la partición HW/SW y conocemos las operaciones que se van a implementar por hardware y software, debemos abordar el proceso de estas implementaciones.

Más detalles

PROGRAMACIÓN II AÑO 2009 TALLER 3: TEORÍA DE LENGUAJES Y AUTÓMATAS

PROGRAMACIÓN II AÑO 2009 TALLER 3: TEORÍA DE LENGUAJES Y AUTÓMATAS Licenciatura en Sistemas de Información PROGRAMACIÓN II AÑO 2009 TALLER 3: TEORÍA DE LENGUAJES Y AUTÓMATAS UNSE FCEyT 1. DESCRIPCIÓN Este taller consta de tres partes. En cada una de ellas se especifican

Más detalles

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas Unidad V Análisis Semántico M.C. Juan Carlos Olivares Rojas Agenda 5.1 Analizador semántico 5.2 Verificación de tipos en expresiones. 5.3 Conversión de tipos. 5.4 Acciones agregadas en un analizador sintáctico

Más detalles

Universidad Nacional del Santa Facultad de Ingeniería E.A.P. de Ingeniería de Sistemas e Informática TEORIA DE COMPILADORES ANALISIS SINTACTICO

Universidad Nacional del Santa Facultad de Ingeniería E.A.P. de Ingeniería de Sistemas e Informática TEORIA DE COMPILADORES ANALISIS SINTACTICO ANALISIS SINTACTICO Análisis Sintáctico Descendente Análisis Sintáctico Ascendente EOF y α S (axioma inicial). 2. : la cadena de entrada no es válida. 3. : consiste en aplicar

Más detalles

SSL Guia de Ejercicios

SSL Guia de Ejercicios 1 SSL Guia de Ejercicios INTRODUCCIÓN A LENGUAJES FORMALES 1. Dado el alfabeto = {a, b, c}, escriba las palabras del lenguaje L = {x / x }. 2. Cuál es la cardinalidad del lenguaje L = {, a, aa, aaa}? 3.

Más detalles

Evolución del software y su situación actual

Evolución del software y su situación actual Evolución del software y su situación actual El software es el conjunto de programas que permite emplear la PC, es decir, es el medio de comunicación con la computadora, el control de sus funciones y su

Más detalles

ESCUELA: UNIVERSIDAD DEL ISTMO

ESCUELA: UNIVERSIDAD DEL ISTMO 1.-IDENTIFICACIÓN ESCUELA: UNIVERSIDAD DEL ISTMO CLAVE: 3041 GRADO: ING. EN COMPUTACIÓN, CUARTO SEMESTRE TIPO DE TEÓRICA/PRÁCTICA ANTECEDENTE CURRICULAR: 3033.- OBJETIVO GENERAL Proporcionar al alumno

Más detalles

autómatas finitos y lenguajes regulares LENGUAJES FORMALES Y

autómatas finitos y lenguajes regulares LENGUAJES FORMALES Y CONTENIDO Reconocedores [HMU2.1]. Traductores [C8]. Diagramas de Estado [HMU2.1]. Equivalencia entre AF deterministas y no deterministas [HMU2.2-2.3]. Expresiones [HMU3]. Propiedades de [HMU4]. Relación

Más detalles

Lenguajes Libres del Contexto

Lenguajes Libres del Contexto Capítulo 3 Lenguajes Libres del Contexto [LP81, cap 3] n este capítulo estudiaremos una forma de representación de lenguajes más potentes que los regulares. Los lenguajes libres del contexto (LC) son importantes

Más detalles

Teoría de Autómatas y Lenguajes Formales. Introducción a las Gramáticas. Gramáticas incontextuales

Teoría de Autómatas y Lenguajes Formales. Introducción a las Gramáticas. Gramáticas incontextuales Teoría de utómatas y Lenguajes Formales Introducción a las ramáticas. ramáticas incontextuales José M. Sempere Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia Introducción

Más detalles

1.-DEFINE EN QUE CONSISTEN LAS GRAMÁTICAS LIBRES DE CONTEXTO

1.-DEFINE EN QUE CONSISTEN LAS GRAMÁTICAS LIBRES DE CONTEXTO 1.-DEFINE EN QUE CONSISTEN LAS GRAMÁTICAS LIBRES DE CONTEXTO una gramática libre de contexto (o de contexto libre) es una gramática formal en la que cada regla de producción es de la forma: V w Donde V

Más detalles

Área: INFORMÁTICA. Saber- Saber: Identificar DFD como herramienta para escribir los algoritmos de forma lógica.

Área: INFORMÁTICA. Saber- Saber: Identificar DFD como herramienta para escribir los algoritmos de forma lógica. Guía No: 2 Subdirección de Educación Departamento de Educación Contratada Colegio CAFAM Bellavista CED GUIA DE APRENDIZAJE Docente: Luz del Carmen Barrera Área: INFORMÁTICA Fecha: II BIMESTRE 2014 Grado:

Más detalles

Procesadores de Lenguaje

Procesadores de Lenguaje Procesadores de Lenguaje Analizadores LALR Cris%na Tirnauca Domingo Gómez Pérez DPTO. DE MATEMÁTICAS, ESTADÍSTICA Y COMPUTACIÓN Este tema se publica bajo Licencia: CreaIve Commons BY NC SA 3.0 El Analizador

Más detalles

Un. VI. Generador de código intermedio.

Un. VI. Generador de código intermedio. Un. VI. Generador de código intermedio. La administración de la memoria se da en esta etapa. Se debe considerar tanto la memoria estática como dinámica, y en esta se utilizan generalmente pilas. Los lenguajes

Más detalles

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4

PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4 PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4 En esta práctica trabajaremos con ANTLR a nivel semántico utilizando gramáticas con atributos. ANTLR permite implementar con facilidad los dos modelos

Más detalles

2.5.1. Procesamiento de documentos XML.

2.5.1. Procesamiento de documentos XML. 2.5.1. Procesamiento de documentos XML. Un analizador o parser XML es una herramienta encargada de leer documentos XML [17], poder acceder a sus elementos y comprobar si el documento es sintácticamente

Más detalles

Expositor: Mauricio Galvez Legua

Expositor: Mauricio Galvez Legua ó Expositor: Mauricio Galvez Legua mgl10may62@hotmail.com 1 Qué es la ó La Robótica es una ciencia aplicada que se ocupa del estudio, desarrollo y aplicaciones de los robots. El estudio de la robótica

Más detalles

Computabilidad y Lenguajes Formales: Autómatas de Pila

Computabilidad y Lenguajes Formales: Autómatas de Pila 300CIG007 Computabilidad y Lenguajes Formales: Autómatas de Pila Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V. Basado en [SIPSER, Chapter 2] Autómatas

Más detalles

Autómatas de Pila y Lenguajes Incontextuales

Autómatas de Pila y Lenguajes Incontextuales Autómatas de Pila y Lenguajes Incontextuales Elvira Mayordomo Universidad de Zaragoza 5 de noviembre de 2012 Contenido de este tema 1. Introducción a los autómatas de pila 2. Definiciones 3. Equivalencia

Más detalles

Autómatas de Pila. Descripciones instantáneas o IDs. El Lenguaje de PDA. Equivalencia entre PDAs y CFGs INAOE (INAOE) 1 / 50

Autómatas de Pila. Descripciones instantáneas o IDs. El Lenguaje de PDA. Equivalencia entre PDAs y CFGs INAOE (INAOE) 1 / 50 INAOE (INAOE) 1 / 50 Contenido 1 2 3 4 (INAOE) 2 / 50 Pushdown Automata Las gramáticas libres de contexto tienen un tipo de autómata que las define llamado pushdown automata. Un pushdown automata (PDA)

Más detalles

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo Algoritmos En general, no hay una definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten

Más detalles

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales. ÁRBOLES DE SINTAXIS ÁRBOL grafo dirigido acíclico. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales. Los nodos terminales (nodos hojas) están rotulados por los

Más detalles

Complejidad computacional (Análisis de Algoritmos)

Complejidad computacional (Análisis de Algoritmos) Definición. Complejidad computacional (Análisis de Algoritmos) Es la rama de las ciencias de la computación que estudia, de manera teórica, la optimización de los recursos requeridos durante la ejecución

Más detalles

Profs. Carlos Pérez y Ricardo Monascal

Profs. Carlos Pérez y Ricardo Monascal TRADUCTORES E INTERPRETADORES Clase 0: Introducción al Curso Quiénes somos? Prof. Carlos Pérez caperez@ldc.usb.ve Prof. Ricardo Monascal rmonascal@ldc.usb.ve Oficina: MYS-228A (Sí, es la misma) Recursos

Más detalles

Agenda. BNF y EBNF Brevemente, lo necesario para especificar el lenguaje sobre el que vamos a trabajar.

Agenda. BNF y EBNF Brevemente, lo necesario para especificar el lenguaje sobre el que vamos a trabajar. Agenda BNF y EBNF Brevemente, lo necesario para especificar el lenguaje sobre el que vamos a trabajar. JLEX y JCUP Breve descripción del las herramientas para generar el parser o analizador sintáctico.

Más detalles

Compiladores: Generación de Código. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón

Compiladores: Generación de Código. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón Compiladores: Generación de Código Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón Generación de Código Representación Intermedia Tabla de Símbolos

Más detalles

Tema 5 Tabla de Símbolos

Tema 5 Tabla de Símbolos Traductores, Compiladores e Intérpretes 1 Tema 5 También se la llama tabla de nombres o tabla de identificadores y tiene dos funciones principales: - Efectuar chequeos semánticos. - Generación de código.

Más detalles

Técnicas de Programación

Técnicas de Programación Técnicas de Programación 2.1.- Introducción: unos conceptos previos y primeros conceptos de la API Introducción La resolución de un problema con medios informáticos implica generalmente la siguiente secuencia

Más detalles

Teoría de Lenguajes y Autómatas Conceptos y teoremas fundamentales

Teoría de Lenguajes y Autómatas Conceptos y teoremas fundamentales Se prohíbe la reproducción total o parcial de este documento, excepto para uso privado de los alumnos de la asignatura Teoría de Autómatas I de la UNED y los alumnos de asignaturas equivalentes de otras

Más detalles

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje. Modulo 1. Introducción a los lenguajes de programación La solución de problemas mediante en uso de un computador nos lleva a desarrollar programas o aplicaciones, la construcción de estos programas debe

Más detalles

Teoría de la Computación

Teoría de la Computación Teoría de la Computación Grado en Ingeniería Informática Prácticas de Laboratorio Profesor: Gregorio de Miguel Casado * email: gmiguel@unizar.es Dpto. de Informática e Ingeniería de Sistemas Escuela de

Más detalles

Temas. Objetivo. Que el estudiante logre: 1) Identificar conceptos constructivos de la Teoría de la Computabilidad. 2) Definir autómatas de pila.

Temas. Objetivo. Que el estudiante logre: 1) Identificar conceptos constructivos de la Teoría de la Computabilidad. 2) Definir autómatas de pila. 0 Temas Definición de autómata de pila Autómata de pila determinístico y no determinístico Objetivo Que el estudiante logre: 1) Identificar conceptos constructivos de la Teoría de la Computabilidad. 2)

Más detalles

Lenguajes y Gramáticas

Lenguajes y Gramáticas Lenguajes y Gramáticas Teoría de Lenguajes Fernando Naranjo Introduccion Se desarrollan lenguajes de programación basados en el principio de gramática formal. Se crean maquinas cada vez mas sofisticadas

Más detalles

Trabajo Práctico. Teoría de Lenguajes. Segundo cuatrimestre 2015

Trabajo Práctico. Teoría de Lenguajes. Segundo cuatrimestre 2015 Trabajo Práctico Teoría de Lenguajes Segundo cuatrimestre 2015 1 Introducción El objetivo de este trabajo práctico es desarrollar un compositor de fórmulas matemáticas. El mismo tomará como entrada la

Más detalles

Clase 17: Autómatas de pila

Clase 17: Autómatas de pila Solicitado: Ejercicios 14: Autómatas de pila de GLC M. en C. Edgardo Adrián Franco Martínez http://computacion.cs.cinvestav.mx/~efranco @efranco_escom edfrancom@ipn.mx 1 Contenido Autómata de pila Definición

Más detalles