ANÁLISIS DESCENDENTE. Compruébese que la siguiente gramática es LL(1) sin modificarla.

Documentos relacionados
INTRODUCCIÓN AL ANÁLISIS ASCENDENTE. V id asig num. La siguiente figura muestra la tabla de análisis SLR de la gramática anterior:

Tema 5. Análisis semántico

Procesadores de lenguajes. Ejercicios del Tema 5. Ejercicio 5.1. Ejercicio 5.2. Ejercicio 5.3. Ejercicio 5.4. Ejercicio 5.5. Ejercicio 5.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Tema 7. Generación de código

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

Tema 5: Traducción dirigida por la sintaxis

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Java. Introducción a la Programación Orientada a Objetos

Elementos léxicos del lenguaje de programación Java

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Compiladores. Análisis Sintáctico Ascendente. Adrian Ulises Mercado Martínez. Facultad de Ingeniería, UNAM. 5 de septiembre de 2013

Elementos de un programa en C

UNIDAD V. Analisis Semantico. 5.1 Introduccion. Analizador Semántico. Verifica que el significado de las construcciones del lenguaje tengan sentido.

LABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison

Tipos Recursivos de Datos

16 Análisis sintáctico I

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

Introducción a Haskell. Cecilia Manzino

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

4. Operadores Operador asignación

Curso de Java Introducción a la Programación II

8.1.- FUNCIONES Y PROCEDIMIENTOS DEFINIDOS POR EL USUARIO EN TURBO PASCAL.

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

Manual de turbo pascal

El sistema de clases de Haskell. Introducción

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

Estructura de datos y Programación

Gramáticas de Atributos

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Tema 2. Tipos predefinidos

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

TEMA 3: ANÁLISIS SEMÁNTICO

Informática PRÀCTICA 3 Curs Práctica Nº 3: Tipos de datos simples. Constantes y variables. Operadores aritméticos. Formato de salida.

INTRODUCCIÓN A COMPILADORES Y LENGUAJES FORMALES LENGUAJES FORMALES

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Algunos ejercicios sobre modelado sintáctico en exámenes de Compiladores e intérpretes

Para crear un arreglo de cualquier tipo de elementos la sintaxis es:

Programación de Videojuegos Tema 15 Tipos de Dato I. 15. Tipos de Dato I

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Introducción a Haskell. El lenguaje Haskell

Módulo. = Asignación = = Comp. de igualdad!= Com. de desigualdad <= Comp. menor o igual >= Comp. mayor o igual AND lógico OR lógica.

1 ELEMENTOS BASICOS DEL LENGUAJE

Análisis léxico. Formalización y desarrollo. Procesadores de Lenguajes. Ingeniería Técnica superior de Ingeniería Informática

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

DEFINICIONES BÁSICAS DE LAS ESTRUCTURAS DE DATOS

Analizador Léxico. Programación II Margarita Álvarez. Analizador Léxico - Funciones

Objetivo N 2. Conocer la Estructura General de un Programa en C++ Estructura de Datos Prof. Egilde Márquez

Procesadores de lenguaje Tema 5 Comprobación de tipos

ANÁLISIS SINTÁCTICO I GRAMÁTICAS

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Tema 3. Patrones y Definiciones de Funciones

Definición de la sintaxis (1) Definición de la sintaxis (2) Definición de la sintaxis (3)

El lenguaje C. 1. Identificadores, constantes y variables

ANÁLISIS SEMÁNTICO VERIFICACIÓN DE TIPOS

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas

Los tipos de datos primitivos

Inducción, Recursión y Alcance. Inducción, Recursión y alcance. Inducción, Recursión y Alcance. Inducción, Recursión y Alcance

Conceptos básicos sobre gramáticas

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Tema 1. Introducción

FUNDAMENTOS DE INFORMÁTICA

Programación 1 Tema 3. Información, datos, operaciones y expresiones

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Tema: Análisis Sintáctico

Definiciones de tipo. Sinónimos de tipo

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

Tema 2. El lenguaje JAVA

Sintaxis de C Ing. Jose Maria Sola Dr. Oscar Ricardo Bruno

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Objetivos Que el estudiante logre conocer, comprender y manejar conceptos y técnicas vinculados con el Analizador Léxico, para lo cual debe:

Uso de la herramienta YACC

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Elementos léxicos del lenguaje de programación C

Ficha de Aprendizaje N 13

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

TEMA 02 TIPOS, OPERADORES Y EXPRESIONES

Qué es el análisis semántico?

Expresiones y sentencias

Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.

Expresiones y sentencias

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Tema 3. Tipos de datos simples

Teoría de Autómatas y Lenguajes Formales Práctica 4

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Tema 3. Análisis sintáctico descendente

Transcripción:

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 D h C λ D i Es LL(1) la siguiente gramática? A B C D B b B λ C c C λ D d D λ Ejercicio 3.3 Dada la siguiente gramática, elimínese la recursividad a la izquierda y los factores comunes por la izquierda y compruébese que la gramática resultante cumple la condición LL(1). S S inst S S var D S λ D D ident E D D ident sep D int D float E S fproc 1

Procesadores de Lenguajes 2 Ejercicio 3.4 Dada la siguiente gramática: S A B A begin S end B theend A λ B var L : tipo B B fvar B λ L L, id L id a) Háganse las transformaciones necesarias para eliminar la recursividad por la izquierda. b) Calcúlense los conjuntos de primeros y siguientes de cada no terminal. c) Compruébese que la gramática modificada cumple la condición LL(1). d) Constrúyase la tabla de análisis sintáctico LL(1) para esta nueva gramática. e) Finalmente, hágase la traza del análisis de la siguiente cadena, comprobando que las derivaciones son correctas mediante la construcción del árbol de análisis sintáctico. Ejercicio 3.5 begin var id,id: tipo var id:tipo fvar end var id: tipo theend Dada la siguiente gramática: S S inst S T R V T tipo T λ R blq V fblq R λ V id S fin V id ; V λ Constrúyase un analizador descendente recursivo (ASDR) para la gramática LL(1) equivalente. Ejercicio 3.6 Dada la siguiente gramática: E [ L E a L E Q Q, L Q ]

Procesadores de Lenguajes 3 a) Constrúyase un analizador descendente recursivo (ASDR) para la gramática LL(1) equivalente. b) Escríbase la secuencia de llamadas recursivas a las funciones del ASDR que se realizarían durante la ejecución para la cadena de entrada [ a, a ]. Ejercicio 3.7 Dada la siguiente gramática: P D S D D V D λ S S I S λ V decl id ; V decl id ( P ) ; V decl [ D ] id ; I id ; I begin P end a) Háganse las transformaciones necesarias para que cumpla la condición LL(1). b) Constrúyase la tabla de análisis sintáctico LL(1) para esa nueva gramática. c) Hágase la traza de las cadenas: Ejercicio 3.8 decl id ( begin id ; ) decl id ( decl [ decl id ; ] id ; ) ; id ; Considere la siguiente gramática descrita en notación EBNF: E O ( barra O ) O O I I I sim parab E parce C C ( ast sum int λ) (a) Realizar las transformaciones necesarias para expresarla en notación BNF. (b) Realizar las transformaciones necesarias para convertirla en una gramática LL(1). (c) Calcular los conjuntos Primeros, Siguientes y Predicción de la gramática obtenida. (d) Describir el analizador descendente recursivo de la gramática obtenida (en Java, C o pseudocódigo)

Procesadores de Lenguajes 4 Ejercicio 3.9 La siguiente gramática permite describir un circuito formado por resistencias unidas en serie o en paralelo. Calcule los conjuntos Primeros, Siguientes y Predicción para las reglas y símbolos de la gramática. Circuito CircuitoSerie RamaParalela RamaParalela CircuitoSerie RamaParalela RamaParalela λ CircuitoSerie CircuitoBase ConexionSerie ConexionSerie - CircuitoBase ConexionSerie ConexionSerie λ CircuitoBase resistencia CircuitoBase ( Circuito ) Ejercicio 3.10 La siguiente gramática, expresada en notación EBNF, permite describir un texto formado por un único párrafo. Párrafo ( Frase )+ FinDeLínea Frase Claúsula ( coma Claúsula )* punto Claúsula Palabra ( espacio Palabra )* Palabra ( letra )+ (a) Realize las transformaciones necesarias para expresarla en notación BNF. (b) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos Ejercicio 3.11 La siguiente gramática, expresada en notación EBNF, permite describir la estructura de una clase. Clase class id llaveab ( Campo Constructor Metodo )* llavece Campo Tipo id pyc Constructor id parab ( Tipo ( coma Tipo )* )? parce pyc Metodo Tipo id parab ( Tipo ( coma Tipo )* )? parce pyc Tipo int float char (b) Realice las transformaciones necesarias para que cumpla la propiedad LL(1).

Procesadores de Lenguajes 5 (c) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos Ejercicio 3.12 La siguiente gramática, expresada en notación EBNF, representa la sintaxis de la definición de tipos en un lenguaje funcional: Type type id eq Decl semicolon Decl ( BaseDecl Decl rel BaseDecl ) BaseDecl ( id List Tuple ) List lbra Decl rbra Tuple lpar Decl ( comma Decl )* rpar (b) Realice las transformaciones necesarias para que cumpla la propiedad LL(1). (c) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos (d) Construya el Analizador Sintáctico Descente Recursivo de la gramática obtenida Ejercicio 3.13 La siguiente gramática representa la sintaxis de la instrucción de asignación de un lenguaje basado en conjuntos: Asig id igual Expr pyc Expr Base Expr Expr union Base Expr Expr interseccion Base Base par_ab Expr par_ce Base id Base llave_ab Enum llave_ce Enum λ Enum Lista Lista num Lista Lista coma num

Procesadores de Lenguajes 6 A continuación se muestra un ejemplo de una cadena de entrada para esta gramática: A = { 1, 2 } ( { 3, 4, 5 } B ) ; (a) Realice las transformaciones necesarias para que cumpla la propiedad LL(1). (b) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos (c) Construya la tabla de análisis sintáctico LL(1) de la gramática obtenida. Ejercicio 3.14 Considere la siguiente gramática: Expr Atom List Atom number identifier List lparen Seq rparen Seq Seq Expr Expr (a) Realice las transformaciones necesarias para que cumpla la propiedad LL(1). (b) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos (c) Construya la tabla de análisis sintáctico LL(1) de la gramática obtenida. (d) Realice la traza a la siguiente entrada ( a ( b ( 2 ) ) ( c ) ) Ejercicio 3.15 La siguiente gramática representa la sintaxis simplificada del operador new: NewOperator new id Constructor NewOperator new id Array NewOperator new type Array Constructor lparen ( expr ( comma expr )* )? rparen Array ( lbracket expr rbracket )+ ( lbracket rbracket )* (a) Realice las transformaciones necesarias para expresar la gramática en notación BNF. (b) Realice las transformaciones necesarias para que cumpla la propiedad LL(1).

Procesadores de Lenguajes 7 (c) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos (d) Construya la tabla de análisis sintáctico LL(1) de la gramática obtenida. Ejercicio 3.16 La siguiente gramática representa la sintaxis de las claúsulas import en Java: ImportClause import id ( dot id )* (dot star)? semicolon (a) Realice las transformaciones necesarias para obtener una gramática en notación BNF que cumpla la propiedad LL(1). (b) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos (c) Construya la tabla de análisis sintáctico LL(1) de la gramática obtenida. (d) Realice la traza para la cadena de entrada import id dot id dot id dot star semicolon Ejercicio 3.17 La siguiente gramática representa la sintaxis de la instrucción de asignación de un lenguaje basado en conjuntos en notación EBNF: Asig id igual Expr pyc Expr Comp ( ( union interseccion ) Comp )* Comp ( complemento )? Base Base ( llave_ab ( num (coma num )* )? llave_ce par_ab Expr par_ce id ) (b) Realice las transformaciones necesarias para convertirla en una gramática LL(1). (c) Calcule los conjuntos Primeros, Siguientes y Predicción de la gramática obtenida. (d) Construya la tabla de análisis sintáctico LL(1) para esa nueva gramática. (e) Realice la traza de la siguiente cadena de entrada: A = { 1, 2 } ( { 3, 4 } B );

Procesadores de Lenguajes 8 Ejercicio 3.18 La siguiente gramática representa la sintaxis de las expresiones formadas por productos y potencias de números, en notación EBNF: Expresión Factor ( prod Factor )* Factor Base ( elev Base )* Base ( num lparen Expresión rparen ) (b) Realice las transformaciones necesarias para convertirla en una gramática LL(1). (c) Calcule los conjuntos Primeros, Siguientes y Predicción de la gramática obtenida. (d) Construya la tabla de análisis sintáctico LL(1) para esa nueva gramática. (e) Realice la traza de la siguiente cadena de entrada: 2 ^ 4 * 3 ^ ( 5 * 6 ) ^ 3 Ejercicio 3.19 La siguiente gramática, expresada en notación EBNF, permite describir una versión reducida de la sintaxis de Prolog. Programa ( Claúsula )* Claúsula ( Hecho Regla ) Hecho Predicado dot Regla Predicado imp Literales dot Predicado atom ( lparen Literales rparen )? Literales Literal ( comma Literal )* Literal var const Predicado Lista Lista lbracket Literales ( tail Literal )? rbracket (b) Realice las transformaciones necesarias para convertirla en una gramática LL(1). (c) Calcule los conjuntos Primeros, Siguientes y Predicción de la gramática obtenida. (d) Construya la tabla de análisis sintáctico LL(1) para esa nueva gramática.

Procesadores de Lenguajes 9 Ejercicio 3.20 La siguiente gramática, expresada en notación EBNF, permite describir un circuito formado por resistencias unidas en serie o en paralelo: Circuito CSerie ( paralelo CSerie )* CSerie CBase ( serie CBase )* CBase resistencia parab Circuito parce (e) Realice las transformaciones necesarias para obtener una gramática equivalente expresada en notación BNF y que cumpla la propiedad LL(1). (f) Calcule los conjuntos Primeros, Siguientes y de Predicción para las reglas y símbolos Construya la tabla de análisis sintáctico LL(1) para la gramática resultante. Ejercicio 3.21 A continuación se presenta la gramática de un lenguaje de representación de árboles: Arbol tree id lbrace ListaDeNodos rbrace ListaDeNodos Nodo ( comma Nodo )* Nodo NodoHoja NodoInterno NodoHoja id NodoInterno id lbrace ListaDeNodos rbrace (b) Realice las transformaciones necesarias para convertirla en una gramática LL(1). (c) Calcule los conjuntos Primeros, Siguientes y Predicción de la gramática obtenida. (d) Construya la tabla de análisis sintáctico LL(1) para esa nueva gramática. DISEÑO DE GRAMÁTICAS LL(1) Ejercicio 3.22 Los ficheros fuente en Java comienzan con la declaración del paquete al que pertenecen las clases o interfaces definidas en el fichero, seguido de un conjunto de claúsulas de importación. Las claúsulas import indican al compilador que el fichero fuente puede contener referencias a una determinada clase de un paquete diferente.

Procesadores de Lenguajes 10 Las claúsulas de importación comienzan con la palabra clave import, seguida del nombre completo de la clase, terminando en punto y coma. El nombre completo de la clase se forma con el nombre del paquete, seguido de un punto y el nombre de la clase. Si la clase pertenece a un subpaquete dentro de una jerarquía, entonces el nombre del paquete se forma con los nombres de los subpaquetes separados por puntos. El nombre de la clase se pude sustituir por un asterisco, indicando en ese caso que se están importando todas las clases del paquete indicado. A continuación se muestran algunos ejemplos de claúsulas import: import java.util.vector; import java.util.stack; import java.sql.*; import javax.swing.border.*; Desarrolle una gramática LL(1) que reconozca el formato de las claúsulas import de Java. Ejercicio 3.23 En Java, el operador new permite crear tanto objetos de una cierta clase como matrices de un cierto tipo de datos. En el primer caso, la palabra clave new va seguida del constructor de la clase. En el caso de la creación de matrices, la palabra clave new va seguida del tipo de dato y de la dimensión de la matriz. El tipo de datos de la matriz puede ser tanto un tipo simple (char, int, long, float, double,...) como objetos de una determinada clase. Es importante señalar que las matrices pueden ser multidimensionales y que se puede dejar sin especificar el tamaño de las últimas dimensiones de la matriz, pero nunca el tamaño de la primera dimensión. A continuación se muestran algunos ejemplos de la instrucción new: new Label( Titulo ) new Label[5][2] new Label[3][][] new int[2+3][j][] Desarrolle una gramática LL(1) que reconozca el formato de la instrucción new de Java. Utilice para ello los tokens new, lparen, rparen, lbracket, rbracket, comma e id, así como los símbolos lingüísticos predefinidos SimpleType (que reconoce un tipo de datos simple) y Expression (que reconoce una expresión). Ejercicio 3.24 La sintaxis de declaración de variables en C admite la posibilidad de declarar una única variable ( int x; ) o una lista de variables del mismo tipo base ( int x, y, z; ). Cada variable declarada puede tener asociado una expresión para calcular su valor inicial ( int x=1, y; ). Además, la sintaxis de C permite definir tanto tipos simples como arrays y punteros. Para definir punteros se introducen asteriscos delante del identificador de la variable ( int **x; ). Por su parte, los arrays pueden ser multidimensionales y cada dimensión viene expresada por una expresión de tipo entero entre corchetes ( int x [2][2*a]; ). Es posible definir arrays de punteros ( int *x[3]; ).

Procesadores de Lenguajes 11 Describa por medio de una gramática LL(1) la sintaxis descrita anteriormente. Considere que se dispone de los símbolos no terminales TypeIdentifier, que reconoce el tipo base, y Expression, que reconoce expresiones de cualquier tipo. Ejercicio 3.25 La declaración de las funciones en Haskell consta de su nombre (un identificador que comienza con una letra minúscula) y su tipo de datos. Por ejemplo, la declaración de la función divide, que verifica si un número entero es divisible por otro número entero, se declara así: divide :: Integer -> Integer -> Bool En general, las declaraciones de tipos en Haskell pueden ser de las siguientes formas: (a) Un identificador de tipo predefinido, que en este caso comienza por una letra mayúscula (por ejemplo, Integer ). (b) Una lista de datos de un cierto tipo base, que se expresa con la declaración del tipo base entre corchetes (por ejemplo, [ Integer ] ). (c) Una tupla de diferentes tipos, que se expresa con la lista de tipos separada por comas y entre paréntesis (por ejemplo, ( Integer, Bool, String ) ). (d) Una relación entre tipos, que se expresa uniendo los tipos mediante flechas (por ejemplo, Integer -> Integer ). La combinación de estos tipos de construcciones permite declarar tipos de datos muy complejos. Por ejemplo, la expresión [ Integer -> Integer ] -> ( String, Integer ) -> Bool permite definir el tipo de una función que toma como primer argumento una lista de funciones (que toman un parámetro entero y devuelven un valor entero), como segundo argumento una tupla formada por una cadena y un entero y genera como salida un booleano. Diseñe una gramática LL(1) de describa la declaración de tipos de Haskell. Considere para ello los siguientes tokens: id, lbracket, rbracket, lparen, rparen, comma y arrow.