PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 3
|
|
- Alejandro Núñez Ruiz
- hace 6 años
- Vistas:
Transcripción
1 PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 3 En esta práctica trabajaremos con ANTLR a nivel sintáctico. En las prácticas anteriores ya hemos visto los elementos básicos de la notación. En ésta, nos centraremos fundamentalmente en la manera en la que se comunican analizadores léxicos y sintácticos, la forma en la que deben escribirse las gramáticas y la resolución de cierto tipo de ambigüedades sintácticas. Un ejemplo simple He aquí un analizador sintáctico simple, es capaz de reconocer expresiones aritméticas con números enteros y reales, se incluye además el analizador léxico en el mismo fuente: // Analizador léxico class Analex extends Lexer BLANCO : (' ' '\t' "\r\n") {$settype(token.skip) protected DIGITO : '0'..'9' NUMERO : (DIGITO)+('.'(DIGITO)+)? OPERADOR : '+' '-' '/' '*' PARENTESIS : '(' ')' SEPARADOR : '' // Analizador sintáctico class Anasint extends Parser entrada : instrucciones EOF instrucciones : (instruccion)* instruccion : exp "" exp : exp_mult (("+" "-") exp_mult)* exp_mult : exp_base (("*" "/") exp_base)* exp_base : NUMERO "(" exp ")"
2 El analizador sintáctico generado se implementará a través de la clase Anasint (tal y como hemos indicado en el fuente) que será una subclase de LLkParser que es la que implementa los aspectos genéricos de los reconocedores sintácticos. La clase Anasint ofrece un método por cada símbolo terminal de la gramática, dichos métodos serán los encargados de reconocer el lenguaje asociado a los símbolos correspondientes. Probando el analizador sintáctico Para poder probar el analizador sintáctico utilizaremos una clase principal que cree los analizadores léxico y sintáctico, y que llame al método encargado de reconocer el símbolo principal de la gramática (anasint.instrucciones()): ////// // Procesador.java (clase principal) ////// import java.io.* import antlr.* public class Procesador { public static void main(string args[]) { try { FileInputStream fis = new FileInputStream(args[0]) Analex analex = new Analex(fis) Anasint anasint = new Anasint(analex) anasint.entrada() catch(antlrexception ae) { System.err.println(ae.getMessage()) catch(filenotfoundexception fnfe) { System.err.println("No se encontró el fichero") Análisis léxico y sintáctico en fuentes separados. Exportación de vocabularios Una de las ventajas de ANTLR es que permite especificar todos los analizadores en un único fuente o en fuentes separados. Esto permite que adaptemos nuestra especificación al tamaño del problema. Si el lenguaje es muy simple podremos incluir todos los analizadores en un fuente y no tendremos que preocuparnos de comunicarlos. Si por el contrario el lenguaje es complicado podremos especificar los analizadores por separados y comunicarlos a través de una interfaz. El hecho de generar una implementación orientada a objetos hace que las interfaces sean muy simples y claras. El analizador sintáctico invocará al método nexttoken del analizador léxico cada vez que requiera un token y recibirá como respuesta un objeto de la clase Token (de la subclase CommonToken o de otra que le indiquemos tal y como vimos en la práctica dedicada al análisis léxico). La información más importante de un objeto de la clase Token viene dada por su atributo type. Este atributo sirve para identificar el tipo de token, y es de tipo entero para optimizar las múltiples comparaciones que ha de hacer el analizador sintáctico al
3 procesar los tokens recibidos desde el analizador léxico. Se denomina vocabulario al conjunto de tokens, junto con su codificación, presentes en un fichero de gramática. ANTLR codifica los vocabularios a través de dos ficheros: una interfaz java y un fichero de texto. La interfaz java contiene un atributo entero para cada token inicializado con el valor que a la postre servirá de codificación del tipo de token. Esta interfaz es el elemento clave en la coordinación de dos analizadores ya que si ambos la implementan compartirán la información codificada en ella. La interfaz para el analizador sintáctico del ejemplo anterior sería: // $ANTLR 2.7.2: "Anasint.g" -> "Anasint.java"$ public interface AnasintTokenTypes { int EOF = 1 int NULL_TREE_LOOKAHEAD = 3 // "" = 4 // "+" = 5 // "-" = 6 // "*" = 7 // "/" = 8 int NUMERO = 9 // "(" = 10 // ")" = 11 Tal y como se indica en la primera línea del fichero esta interfaz se ha obtenido a partir de la compilación del fichero Anasint.g (que contiene sólo la especificación del analizador sintáctico). El nombre de la interfaz se obtiene añadiendo el prefijo TokenTypes al nombre del analizador. El otro fichero utilizado en la codificación de vocabulario tiene el mismo nombre que el de la interfaz pero su extensión es ".txt". En él además del token y del número que lo representa se incluye también una cadena de caracteres con el nombre del token (siempre que lo tenga). Esta última información se utiliza en el informe de errores cuando además del tipo de token se necesita conocer también su nombre. En nuestro caso el fichero AnasintTokenTypes.txt tendría el siguiente contenido: // $ANTLR 2.7.2: Anasint.g -> AnasintTokenTypes.txt$ Anasint // output token vocab name ""=4 "+"=5 "-"=6 "*"=7 "/"=8 NUMERO=9 "("=10 ")"=11 Si especificamos los analizadores léxico y sintáctico en un mismo fuente ANTLR se encarga de generar un vocabulario común para los dos. Sin embargo, si los analizadores están en fuentes distintos tenemos que preocuparnos de que ambos trabajen con el mismo vocabulario. Esto se consigue con la opción importvocab que permite añadir tokens de otro vocabulario a los definidos en un analizador. Dado que los tokens que
4 realmente nos interesan son los especificados en el analizador sintáctico importaremos el vocabulario desde el análisis sintáctico hacia el léxico: // Analex.g: Analizador léxico class Analex extends Lexer options { importvocab = Anasint // Reglas De esta forma el vocabulario común a los dos analizadores será el del sintáctico, contenido en la interfaz AnasintTokenTypes.java. Cómo escribir buenas gramáticas? Los tres esquemas de reglas más usuales en la descripción de lenguajes, son el esquema lista, el esquema agregado y el esquema elección. La descripción de estos esquemas es la siguiente: Esquema lista: se aplica cuando la entrada que se quiere reconocer consta de una secuencia de elementos de una misma categoría. Por ejemplo una lista de números, una lista de instrucciones, una lista de identificadores. En ANTLR se dispone de los operadores + y * para especificar listas de uno o más elementos y listas de cero o más elementos. Un ejemplo de lista sería: lista : (elemento)* Esquema agregado: se aplica cuando la entrada que se quiere reconocer consta siempre de un número fijo de elementos. Por ejemplo una instrucción de asignación o un programa compuesto por tres secciones. Las reglas que definen este tipo de construcciones sintácticas son del tipo: agregado : componente1 componente2 componente3 Con tantos componentes como sean necesarios. Esquema elección: se aplica para agrupar distintas opciones en la definición de la estructura sintáctica de una determinada entrada. Por ejemplo los distintos tipos de instrucciones en un lenguaje de programación o los distintos tipos de datos en la declaración de una variable. Las reglas que definen una elección son del tipo: eleccion : opcion1 opcion2 opcion3 El proceso de escritura de una gramática consiste en identificar a qué tipo de esquema obedece un determinado elemento del lenguaje y especificarlo con las reglas correspondientes. Lo aconsejable es aplicar estos esquemas paso a paso, lo que dará lugar a una gramática más clara y legible. En este sentido hay que ser cuidadoso con las facilidades (propias de la notación EBNF) que ANTLR nos proporciona para escribir
5 gramáticas compactas ya que su abuso puede dar lugar a gramáticas excesivamente crípticas. Por ejemplo: entrada : ((IDENT ("," IDENT)* "=")? NUMERO ("," NUMERO)* "") Genera el mismo lenguaje que la siguente, que es mucho más clara y fácil de escribir y comprender: entrada : (asignacion)* asignacion : (idents)? numeros "" idents : IDENT ("," IDENT)* "=" numeros : NUMERO ("," NUMERO)* Predicados sintácticos Para los problemas que pueden aparecer cuando una gramática no cumple la condición LL(k) las soluciones serán similares que se aplicaron en la especificación del analizador léxico cuando había tokens con prefijos comunes: Ampliar el número de símbolos de anticipación con la opción k, ó utilizar predicados sintácticos para resolver localmente las reglas que provocan conflictos. Tomemos como ejemplo el típico problema no-ll(1) que supone determinar si el primer identificador de una instrucción se corresponde con un nombre de función (en una llamada) o un nombre de variable (en una asignación). La gramática de partida sería: instruccion : asignacion llamada... asignacion : IDENT ":=" expr "" llamada : IDENT "(" expr ")" "" La solución pasa por aprovechar el hecho de que los dos primeros símbolos de una instrucción son siempre IDENT ":=", y se expresaría de la siguiente forma con un predicado sintáctico asociado a la regla conflictiva: instruccion : (IDENT ":=") => asignacion llamada... ANTLR utiliza el predicado para realizar una simulación del análisis previa a la toma de la decisión. De esta forma el analizador predictivo puede contar, siempre que así lo indiquemos, con más información para determinar la regla que tiene que aplicar.
6 Predicados semánticos Además de los predicados sintácticos, ANTLR permite definir predicados semánticos. Estos predicados son expresiones lógicas en Java que deben ser ciertas durante el análisis de la gramática, por ejemplo: // Código Java auxiliar {boolean reconocenumero = true // Reglas entrada : {reconocenumero? NUMERO IDENT En este caso el predicado semántico (la expresión {reconocenumero?) está al principio de la parte derecha de una regla por lo que tiene el efecto de habilitar o deshabilitar la aplicación de la misma. En general el predicado semántico puede aparecer en cualquier lugar dentro de la parte derecha de una regla. Precedencia y asociatividad Uno de los pocos lenguajes para los que no es fácil escribir una gramática aplicando la metodología vista en el apartado anterior es el de las expresiones (aritméticas, lógicas, regulares, etc.). Esto se debe fundamentalmente a la posibilidad de utilizar operadores infijos (es decir, que se mezclan entre los operandos) que además pueden estar encuadrados en distintos niveles de prioridad. Si escribimos una gramática para un lenguaje de expresiones y no tenemos en cuenta este tipo de cuestiones seguramente obtendremos como resultado una gramática ambigua. Para las expresiones con sumas y multiplicaciones la siguiente gramática adolece de este problema: expresion : expresion "+" expresion expresion "*" expresion NUMERO Por ejemplo la expresión 2+2*2 podría ser analizada como (2+2)*2 ó como 2+(2*2). Veamos cómo obtener a partir de esta gramática otra que resuelva esta ambigüedad y además pueda ser procesada sin problemas por un reconocedor descendente. Para empezar hay que escribir la gramática de forma que no aparezca ninguna recursión por la izquierda. Para ello basta con pensar que una expresión no es más que una lista de números en la que se utiliza como separadores + ó *, visto así una posible solución sería: expresion : NUMERO (("+" "*") NUMERO)* Esta gramática ya resuelve la cuestión de la recursión por la izquierda, aunque todavía no es una solución definitiva ya que no tiene en cuenta para nada la prioridad de los operadores. No es que sea ambigua, en realidad lo que ocurre es que utiliza un mecanismo demasiado simple para determinar en qué orden han de aplicarse las operaciones: aplica primero las que están más a la izquierda. Si se construye el árbol de derivación para la entrada 2+2*2+2*2, se observará que la aplicación de las operaciones propuesta por la gramática es ((((2+2)*2)+2)*), totalmente distinta a la que nos
7 interesaría que es ((2+(2*2))+(2*2)). De todas formas la idea no es del todo mala ya que resuelve bien las situaciones en las que hay que aplicar varias veces el mismo operador, como que debe ser interpretada de izquierda a derecha, o sea ((2-2)-2) en lugar de (2-(2-2)). En realidad lo que le falta a la gramática anterior es estratificar la aplicación de operaciones, de manera que se obligue a aplicar unas antes que otras. Así, si consideramos que una expresión es una lista de sumandos, donde cada sumando es el resultado de multiplicar una lista de números la gramática quedaría como sigue: expresion: sumando ("+" sumando)* sumando: NUMERO ("*" NUMERO)* Esta gramática sí puede ser considerada ya una solución ya que no es ambigua, aplica antes las multiplicaciones y después las sumas, y además en caso de encontrar varios operadores iguales los asocia de izquierda a derecha. Podemos aprovechar los dos niveles establecidos por las reglas expresion y sumando para incluir operadores que tengan una prioridad similar (la división igual que la multiplicación y la resta igual que la suma): expresion: sumando (("+" "-") sumando)* sumando: NUMERO (("*" "/") NUMERO)* Si queremos incluir paréntesis tan sólo tenemos que establecer un nivel nuevo para que no coincida con la prioridad de los niveles anteriores. Cambiaremos también los nombres de los símbolos porque a medida que aumentamos el número de niveles es más difícil encontrar nombres significativos: expr : expr_mult (("+" "-") expr_mult)* expr_mult : expr_base (("*" "/") expr_base)* expr_base : NUMERO "(" expr ")" Ejercicios 1. Escribir los analizadores léxico y sintáctico que aparecen al principio del enunciado en fuentes separados. Compilarlos y probar el funcionamiento. 2. Escribir un analizador sintáctico para los elementos del lenguaje C presentes en el siguiente ejemplo, las palabras reservadas están resaltadas en negrita: while (a<b) { if(2*a>=b) b=2 a=a+1 3. Extender el ejercicio anterior con los elementos presentes en el siguiente ejemplo,: void main(void) { int a, b a=100 b = 1000 while (a<b) {
8 if(2*a>=b) { printf("punto medio %d\n",a) break a=a+1 4. Escribir un analizador sintáctico para los elementos de XML presentes en el siguiente ejemplo: <biblioteca> <libro> <titulo> La isla del tesoro </titulo> <autor> Robert L. Stevenson </autor> <editorial> Juventud </editorial> </libro> <!-- Pendiente de leer --> <libro> <titulo> Yo que he servido al Rey de Inglaterra </titulo> <autor> Bohumil Hrabal </autor> <editorial> Destino </editorial> </libro> </biblioteca> 5. Amplía el analizador del ejercicio anterior para que reconozca atributos dentro de las etiquetas. Por ejemplo: <libro idioma="español"> libro idioma="español" </libro> Diseña la solución de manera que el analizador léxico descomponga estas etiquetas complejas en tokens. Para ello serán de utilidad los predicados semánticos ya que permitirán habilitar o deshabilitar reglas léxicas según el contexto. 6. Ampliar el ejercicio 3 para que las expresiones admitan el operador de cambio de signo (-) y los operadores lógicos (&&, y!). 7. Ampliar el ejercicio anterior para que el reconocedor procese también los tipos char y float, los literales carácter y real (por ejemplo 'a' y 1.09), la declaración y llamada de funciones, y el condicional aritmético (por ejemplo a>3?2:1 ). 8. Escribir un analizador que procese los elementos del lenguaje de descripción de grafos GDL presentes en el siguiente ejemplo: graph: { // Nodo Sevilla y carreteras que parten de él node: { title: "sevilla" label: "Sevilla" edge: { source: "sevilla" target: "cadiz" arrowstyle: none edge: { target: "huelva" arrowstyle: none source: "sevilla" edge: { source: "sevilla" target: "rosal" arrowstyle: none // Nodo Cádiz y carreteras que parten de él node: { label: "Cádiz" title: "cadiz" edge: { arrowstyle: none source: "cadiz" target: "medina" // Nodo Huelva y carreteras que parten de él node: { title: "huelva" label: "Huelva" edge: { source: "huelva" target: "rosal" arrowstyle: none
9 // Resto de nodos node: { title: "rosal" label: "Rosal de la Frontera" borderstyle: dotted node: { title: "medina" label: "Medina Sidonia" borderstyle: dotted En concreto, los elementos utilizados son los siguientes: Descripción de nodos (node) y sus atributos asociados title (identificador del nodo), label (texto para la visualización) y borderstyle (a elegir entre solid, dashed y dotted). Descripción de arcos (edge) y sus atributos asociados source (identificador del nodo origen), target (identificador del nodo destino) y arrowstyle (a elegir entre solid, line y none). 9. Escribe un analizador que procese gramáticas expresadas en el lenguaje ANTLR. Sólo deberá procesar la parte de reglas de un fichero de gramáticas, de manera que una posible entrada sería: instrucciones : (expresion "")* EOF expresion : exp_mult (("+" "-") exp_mult)* exp_mult : exp_base (("*" "/") exp_base)* exp_base : NUMERO "(" expresion ")"
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 5
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 5 En esta práctica estudiaremos los mecanismos que proporciona ANTLR para crear árboles de sintaxis abstracta. Estos aspectos (junto con la notación
Más detallesPROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 1
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 1 Esta práctica supone la primera toma de contacto con la herramienta ANTLR (ANother Tool for Language Recognition). ANTLR es una herramienta que integra
Más detallesPROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 6
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 6 En esta práctica veremos cómo recorrer árboles de sintaxis abstracta con ANTLR. La notación utilizada nos va a resultar familiar ya que comparte muchos
Más detallesPROCESADORES 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 detallesTEMA 2: ANÁLISIS LÉXICO-SINTÁCTICO
1 TEMA 2: ANÁLISIS LÉXICO-SINTÁCTICO OBJETIVO Dar respuesta a las siguientes preguntas: Qué es el análisis léxico-sintáctico de un lenguaje? Cómo se diseña y construye un analizador léxico-sintáctico?
Más detallesÁrboles de Sintaxis Abstracta en ANTLR
Árboles de Sintaxis Abstracta en ANTLR Antlr permite construir árboles de sintaxis abstracta (ASA) mediante anotaciones en la gramática indicando qué tokens deben tratarse como raíces de subárboles, cuáles
Más detallesPROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 1
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 1 ANTLR es una herramienta que integra la generación de analizadores léxicos, sintácticos, árboles de sintaxis abstracta y evaluadores de atributos.
Más detallesVARIABLES AUTOMÁTICAS
VARIABLES AUTOMÁTICAS Perl es un lenguaje muy flexible y con unas instrucciones muy potentes y útiles. Uno de los aspectos más destacables en este sentido es el de las expresiones regulares, hay multitud
Más detallesUnidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones
Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice
Más detalles16 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 detallesCarlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas
2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos
Más detallesTEMA 3: ANÁLISIS SEMÁNTICO
1 TEMA 3: ANÁLISIS SEMÁNTICO OBJETIVO Dar respuesta a las siguientes preguntas: Qué es el análisis semántico de un lenguaje? Cómo se diseña y construye un analizador semántico? EL PROBLEMA DEL CÁLCULO
Más detallesTema 2: Análisis léxico
Tema 2: Análisis léxico Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 2: Análisis léxico 1 / 22 Fundamentos del análisis
Más detallesANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa
ANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa ANALIZADOR LÉXICO (AL) El Analizador léxico (scanner), lee la secuencia de caracteres del programa fuente, caracter a caracter, y los agrupa para formar unidades
Más detallesTema: 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 detallesCurso de Java Introducción a la Programación II
Curso de Java Introducción a la Programación II Jaime Fernández Martín Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Tipos Java 2 Decalaración de variables 3 Operadores aritméticos Índice
Más detallesAnálisis semántico. Análisis semántico. Índice (I)
Análisis semántico Índice (I) Marina de la Cruz Alfonso Ortega Objetivo del análisis semántico Decisiones para la construcción de un analizador semántico Análisis semántico con Bison Nivel de indirección
Más detallesGramáticas de Atributos
Teoría de Lenguajes Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Etapas de un Compilador Analizador Léxico Analizador Sintáctico (Parser)... Lexer: Genera secuencia de tokens Reporta
Más detallesPrincipios de Computadoras II
Departamento de Ingeniería Electrónica y Computadoras Operadores y Expresiones rcoppo@uns.edu.ar Primer programa en Java 2 Comentarios en Java Comentario tradicional (multi-línea) Comentario de línea Comentario
Más detallesJava. Introducción a la Programación Orientada a Objetos
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Más detallesVARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Más detallesCentro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Antonio Rivero Cuesta La Sintaxis de Java I... 5 Tipos de datos... 6 Tipos de datos simples... 7 Operadores... 11 Operadores Aritméticos... 12 Operadores relacionales...
Más detallesYACC (Yet Another Compiler Compiler) LALR(1) Parser Generator
YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator 1 INDICE 1. Introducción 2. Especificaciones 3. Ambigüedad y conflictos 4. Tratamiento de errores 5. Uso con el LEX 6. Algunos consejos prácticos
Más detallesUNIVERSIDAD 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 detallesUNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 2.
UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes Tema 2 Análisis Léxico Javier Vélez Reyes jvelez@lsi.uned.es Objetivos del Tema
Más detallesPRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009
PRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009 PRÁCTICA 2: ANALIZADOR SINTÁCTICO Y TABLA DE SÍMBOLOS. Objetivo de la Práctica Esta práctica tiene como primer objetivo la codificación de un analizador
Más detallesLenguaje de Diseño. Primera Parte. Segundo Cuatrimestre 2017
Primera Parte Fund. de la Informática Int. a la Programación Int. a la Computación Resolución de Problemas y Algoritmos Segundo Cuatrimestre 2017 1 Etapas en el proceso de resolver un problema: 1- Comprender
Más detallesPROCESADORES 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 detallesTema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN
Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN - Introducción - Sintaxis - Semántica básica - Tipos de datos - Expresiones y enunciados - Procedimientos y ambientes - Tipos abstractos de datos y módulos
Más detallesCompiladores: Introducción
Compiladores: Introducción Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V. (galvarez@puj.edu.co) Basado en [Aho, 2007, chp. 1] Qué es un COMPILADOR?
Más detallesProgramación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa
Programación 1 Tema I. Conceptos y elementos básicos de Programación Lección 2. Lenguaje de programación y ejecución de un programa 1 Léxico, sintaxis y semántica de un lenguaje #include #include
Más detallesANÁLISIS SINTÁCTICO I GRAMÁTICAS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detallesAnálisis léxico. Formalización y desarrollo. Procesadores de Lenguajes. Ingeniería Técnica superior de Ingeniería Informática
Procesadores de Lenguajes Ingeniería Técnica superior de Ingeniería Informática Departamento de Lenguajes y Sistemas informáticos Análisis léxico Formalización y desarrollo Javier Vélez Reyes jvelez@lsi.uned.es
Más detallesANÁLISIS DESCENDENTE. Compruébese que la siguiente gramática es LL(1) sin modificarla.
Procesadores de lenguaje Ejercicios del Tema 3 ANÁLISIS DESCENDENTE Ejercicio 3.1 Compruébese que la siguiente gramática es LL(1) sin modificarla. Ejercicio 3.2 A B C D B a C b B λ C c A d C e B f C g
Más detallesUna clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:
Clase teórica 2 Algoritmos en C Página 1 de 6 TIPOS DE DATOS Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación: Por el momento nuestro
Más detallesLos parámetros: son los campos que se comunican a los métodos de los objetos.
Modulo 6. Variables y Operadores Variables Un objeto almacena los estados en campos, estos campos se conocen en java como variables. Por eso a menudo podemos ver estas dos palabras usadas para referirse
Más detallesIntroducción. El proceso de traducción
Toda compilación es un proceso de transformación paulatina que convierte un programa escrito en un lenguaje fuente de alto nivel en otro programa escrito en un lenguaje objeto de bajo nivel. Ese proceso
Más detallesUniversidad de Valladolid
Universidad de Valladolid Departamento de Informática Teoría de autómatas y lenguajes formales. 2 o I.T.Informática. Gestión. Examen de primera convocatoria. 18 de junio de 29 Apellidos, Nombre... Grupo:...
Más detallesControla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion
UNIDAD IV Analisis Sintactico 4.1 Introduccion Sintaxis significa estructura del orden de las palabras en una frase. La tarea del analisis sintactico es revisar si los símbolos aparecen en el orden correcto
Más detallesTema 5. Análisis semántico
Departamento de Tecnologías de la Información Tema 5 Análisis semántico Ciencias de la Computación e Inteligencia Artificial Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas
Más detallesEstructuras de control selectivas
Práctica 3 Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 2.0.2 Concepto de sentencia y estructura de control El cuerpo de los métodos
Más detallesANÁLISIS LÉXICO EXPRESIONES REGULARES
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detallesElementos léxicos del lenguaje de programación Java
Elementos léxicos del lenguaje de programación Java Elementos léxicos del lenguaje de programación Java Palabras reservadas Identificadores Literales Operadores Delimitadores Comentarios Apéndices Operadores
Más detalles4. Operadores Operador asignación
Programación orientada a objetos con Java 43 4. Operadores Objetivos: a) Describir los operadores (aritméticos, incrementales, de relación, lógicos y de asignación) y los tipos de dato primitivos sobre
Más detallesAgenda. Introducción Analizador léxico Analysis El problema de analizar sintácticamente Analizador sintáctico descendeterecursivo
Agenda Introducción Analizador léxico Analysis El problema de analizar sintácticamente Analizador sintáctico descendeterecursivo Analizador sintáctico Bottom-Up 1-1 1-2 Introducción Los sistemas de implementación
Más detallesPRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA
PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA El objetivo de la práctica es desarrollar un compilador utilizando las herramientas flex y bison y el lenguaje
Más detallesGeneració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 detallesLas 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 detallesBison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison
Bison Índice Marina de la Cruz Alfonso Ortega Introducción Uso de Bison con Flex Construcción del programa objetivo alfa Comunicación entre las funciones main(), yylex() e yyparse() Formato del fichero
Más detallesElementos de un programa en C
Elementos de un programa en C Un programa en C consta de uno o más archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusión de archivos y la sustitución
Más detallesLenguaje de Diseño. Primera Parte. Resolución de Problemas y Algoritmos. Primer Cuatrimestre Ing. En Informática e Ing.
Primera Parte Resolución de Problemas y Algoritmos Ing. En Informática e Ing. En Computación Primer Cuatrimestre 2017 1 Lenguajes Algorítmicos Los algoritmos pueden describirse, en mayor o menor detalle,
Más detallesLenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores
Facultad de Ingeniería de Sistemas Lenguajes y Aspectos Formales (Parte 2) 2007 1 Derivaciones El proceso de búsqueda de un árbol sintáctico para una cadena se llama análisis sintáctico. El lenguaje generado
Más detallesDesarrollo de editores textuales con Xtext
Procesadores de Lenguajes 2 Desarrollo de editores textuales con Xtext Curso 2013-2014 Iván Ruiz Rube Departamento de Ingeniería Informática Escuela Superior de Ingeniería Universidad de Cádiz Xtext 1
Más detallesTema 3. Análisis sintáctico descendente
Departamento de Tecnologías de la Información Tema 3 Análisis sintáctico Ciencias de la Computación e Inteligencia Artificial Índice 3.1 Características del análisis sintáctico 3.2 Gramáticas libres de
Más detallesAnálisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas
Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas Análisis semático c 2001 José Fortes Gálvez p.1 Análisis?... semántico? La semántica corresponde al significado asociado
Más detallesProgramación Orientada a Objetos
Unidad III Programación Orientada a Objetos en Java Programación Orientada a Objetos Programación I - 0416202 Contenido Esta lección abarca los siguientes temas con respecto a Java: Qué es Java? Breve
Más detallesCompiladores. Análisis Sintáctico Ascendente. Adrian Ulises Mercado Martínez. Facultad de Ingeniería, UNAM. 5 de septiembre de 2013
Compiladores Análisis Sintáctico Ascendente Adrian Ulises Mercado Martínez Facultad de Ingeniería, UNAM 5 de septiembre de 2013 Adrian Ulises Mercado Martínez (FI,UNAM) Compiladores 5/07/2013 1 / 34 Índice
Más detallesFLEX: A FAST LEXICAL ANALYZER GENERATOR
FLEX: A FAST LEXICAL ANALYZER GENERATOR Especificación Léxica Fichero.l flex Programa con la implementación del AFD, código fuente, yy.lex.c yy.lex.c Compilador de C milex (ejecutable) Para compilar flex
Más detallesFuncionamiento del A.L.
ANALIZADOR LEXICO 1 Funcionamiento del A.L. Programa fuente Analizador léxico Componente léxico Obtén el siguiente componente léxico Analizador sintáctico Tabla de símbolos 2 Maneja el fichero del programa
Más detallesTema 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 detallesCÓMO DESARROLLAR Y PROBAR PROGRAMAS?, COMPRUÉBALO!
CÓMO DESARROLLAR Y PROBAR PROGRAMAS?, COMPRUÉBALO! AUTORÍA MARÍA CATALÁ CARBONERO TEMÁTICA PROGRAMACIÓN ETAPA CICLO MEDIO Y SUPERIOR DE INFORMÁTICA Resumen A la hora de realizar un programa en cualquier
Más detallesProgramación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.
Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC. Variables Conceptos de Memoria Una variable es un espacio en la memoria del PC Cada variable tiene un nombre, un tipo, un tamaño y un valor
Más detallesUnidad 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 detallesUnidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos
Unidad Didáctica 3 Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Definición de tipo genérico Hablamos de un tipo genérico cuando el tipo en cuestión depende
Más detallesAnálisis semántico. Análisis semántico. Índice
Análisis semántico Índice Marina de la Cruz Alfonso Ortega Notación Objetivo del análisis semántico Pasos para la construcción de un analizador semántico Análisis semántico con Bison Definición de los
Más detallesTeoría de Autómatas y Lenguajes Formales Práctica 4
Departamento de Tecnologías de la Información Área de Ciencias de la Computación e Inteligencia Artificial Teoría de Autómatas y Lenguajes Formales Práctica 4 1.- OBJETIVOS El objetivo de esta práctica
Más detallesConstrucciones del Lenguaje Java
Construcciones del Lenguaje Java Autor: Juan Alberto López Cavallotti Versión de Java: 5 / 6 Comentarios Comentario de Línea Comentario Multilínea //Esto es un comentario. /* Esto comenta varias lineas.
Más detallesPráctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje
Práctica 4 Análisis LALR para milenguaje y construcción de un traductor de milenguaje 1. Objetivos 1. Hacer una introducción práctica a la traducción dirigida por la sintaxis basada en el análisis LALR
Más detallesTEORÍ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 detallesAnálisis Semántico y Traducción Dirigida por la Sintaxis. Programación II Margarita Álvarez
Análisis Semántico y Traducción Dirigida por la Sintaxis Programación II Margarita Álvarez Análisis Semántico Comprobación estática Comprobación de tipos: la aplicación de los operadores y operandos deben
Más detallesUn calculadora avanzada... y algo más!
INFORMÁTICA, GRUPO D Un calculadora avanzada... y algo más! Vamos a familiarizarnos con el entorno interactivo de Python. Vamos a construir expresiones aritméticas y a guardar los resultados en variables
Más detallesInformática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales
UNA / AREA TRANSDEPARTAMENTAL DE ARTES MULTIMEDIALES Licenciatura en Artes Multimediales Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales JavaScript Algoritmo
Más detallesYACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start
YACC Yacc (Yet Another Compiler Compiler) es un programa que permite construir analizadores gramaticales en C a partir de una gramática libre al contexto. Junto con Lex permite construir rápidamente las
Más detallesINTRODUCCIÓN AL PROCESO DE COMPILACIÓN
INTRODUCCIÓN AL PROCESO DE COMPILACIÓN El programa que se debe compilar es una secuencia de caracteres que termina con un centinela. CONCEPTOS BÁSICOS Un compilador es un complejo programa que lee un programa
Más detallesTeoría de Autómatas y Lenguajes Formales, IS17 Ingeniería Técnica en Informática de Sistemas. Práctica 1: Introducción al Analizador Léxico FLEX
Teoría de Autómatas y Lenguajes Formales, IS17 Ingeniería Técnica en Informática de Sistemas Práctica 1: Introducción al Analizador Léxico FLEX Enunciado: El objetivo de esta práctica consiste en aprender
Más detallesProgramación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.
Programación n Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño o Vargas MsC. Variables y expresiones aritméticas Variables Conceptos de Memoria Una variable es un espacio en la memoria
Más detallesTema 2. Concepto de Algoritmo
Tema 2. Concepto de Algoritmo Objetivos Definir el concepto de algoritmo Resolver problemas sencillos mediante el diseño de un algoritmo Conocer los tipos de datos elementales y las operaciones sobre ellos
Más detallesTema 4. Operadores y Expresiones
Tema 4 Operadores y Expresiones Contenidos 1. Conceptos Básicos. 2. Operadores Aritméticos. 3. Operadores de Relación, de Igualdad y Lógicos. 4. Operadores de Incremento y Decremento. 5. Operadores y Expresiones
Más detallesTema: Análisis Léxico
Compiladores. Guía 2 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Análisis Léxico Contenido En esta guía se dará a conocer la manera en que un compilador realiza el análisis
Más detallesGENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detallesElementos léxicos del lenguaje de programación C
Elementos léxicos del lenguaje de programación C Elementos léxicos de los lenguajes de programación (tokens) Palabras reservadas Identificadores Literales Operadores Delimitadores Comentarios Apéndices
Más detallesLenguajes de Programación Programación funcional
Lenguajes de Programación Programación funcional Roberto Bonvallet Departamento de Informática Universidad Técnica Federico Santa María Concepto de función En el paradigma imperativo: Una función es una
Más detallesGENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detalles3.3 Conceptos Básicos del Lenguaje Java
3.3 Conceptos Básicos del Lenguaje Java Conjunto de Caracteres Java utiliza Unicode, un conjunto de caracteres de 16 bits Java permite leer ASCII de 7-bit o Latin-1, conviertiéndolo a Unicode Son pocos
Más detallesVariables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.
Variables Una variable no es más que un nombre simbólico que identifica una dirección de memoria: Suma el contenido de la posición 3001 y la 3002 y lo almacenas en la posición 3003 vs. total = cantidad1
Más detallesLENGUAJES Y GRAMÁTICAS
LENGUAJES Y GRAMÁTICAS Orlando Arboleda Molina Escuela de Ingeniería de Sistemas y Computación de La Universidad del Valle 20 de septiembre de 2008 Contenido Lenguajes y Gramáticas Gramáticas Gramáticas
Más detallesPROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez
PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez Elementos de lenguaje: Identificadores Tipos de datos 2 Tipos de datos primitivos 3 Tipos de datos referenciados Clases Interfaces Arrays
Más detallesCapítulo 7 OPERADORES Y EXPRESIONES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"
Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C" Autor: Carlos Javier Pes Rivas (correo@carlospes.com) Capítulo 7 OPERADORES Y EXPRESIONES 1 OBJETIVOS Conocer los tipos de operadores
Más detalles12 La herramienta LEX
2 Contenido La herramienta Lex Esquema de un fuente en Lex Zona de definiciones Zona de reglas Zona de rutinas del usuario Archivo de salida (lex.yy.c) Copilar un fuente de Lex Opciones estándar Depuración
Más detallesFACULTAD POLITÉCNICA DIRECCIÓN ACADÉMICA PROGRAMA DE ESTUDIO I. IDENTIFICACIÓN Carrera : Ingeniería de Sistemas CARGA HORARIA (Horas reloj) Asignatura : Compiladores Carga Horaria Semestral 64 Semestre
Más detallesGRAMATICAS 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 detallesTema 5: Traducción dirigida por la sintaxis
Tema 5: Traducción dirigida por la sintaxis Procesamiento de Lenguajes Dept. de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 5: Traducción dirigida por la sintaxis
Más detallesConceptos 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 detallesabril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples
Desarrollo de aplicaciones en Java Generación de código fuente Compilación Ejecución Elementos de aplicaciones simples EII147-01-02 Introducción a las tecnologías de información Escuela de Ingeniería Industrial
Más detallesTema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL
Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL Cualquier duda sobre el contenido de este tema se puede enviar al foro TEORIA2. 2.1.- El tipo de datos entero (byte,
Más detallesEspecificación de TAD. Lección 2
Especificación de TAD Lección 2 Esquema Características generales de una especificación Especificación algebraica Especificación no formal Lectura recomendada: sección 1.3 del libro de Z.J. Hernández et
Más detallesEl lenguaje C. 1. Identificadores, constantes y variables
Principios de Programación El lenguaje C 1. Identificadores, constantes y variables 1.1. Conceptos de memoria Los nombres de variable como x, y, suma corresponden a localizaciones o posiciones en la memoria
Más detallesExpresiones y sentencias
Expresiones y sentencias Expresión Construcción (combinación de tokens) que se evalúa para devolver un valor. Sentencia Representación de una acción o una secuencia de acciones. En C, todas las sentencias
Más detallesSISTEMAS 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