Tema 3. Introducción al análisis sintáctico

Documentos relacionados
Procesadores de Lenguaje

GRAMATICAS LIBRES DEL CONTEXTO

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

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

Compiladores: Parsing ascendente

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

EJERCICIOS del TEMA 3: Lenguajes independientes del contexto

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

Procesadores de Lenguaje

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

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

Tema 3. Análisis sintáctico descendente

Procesadores de Lenguaje

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.

Tema: Autómata de Pila

Unidad 4. Autómatas de Pila

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

PROGRAMA INSTRUCCIONAL AUTOMATAS Y LENGUAJES FORMALES

Expresiones regulares, gramáticas regulares

Procesadores de lenguaje Tema 6 La tabla de símbolos

Universidad de Costa Rica. Escuela de Ciencias de la Computación e Informática CI-2700 TÓPICOS ESPECIALES - COMPILADORES.

Estatutos de Control C# Estatutos de Decisión (Selección)

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

Autómatas Deterministas. Ivan Olmos Pineda

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

INAOE. Gramáticas Libres de Contexto. Definición formal de CFGs. Derivaciones usando. Derivaciones. izquierda y. derecha.

Un autómata con pila no determinista (APND) es una septupla Q A B F en la que

S Qué es el analizador sintáctico?

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

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

Principios de Computadoras II

GUÍA BÁSICA DE SCHEME v.4

Manual de turbo pascal

Las Etapas de la Compilación

2007/ PROGRAMACIÓN. Tipo: TRO Curso: 1 Semestre: AB CREDITOS Totales TA TS AT AP PA OBJETIVOS. 1.-Introducción.

Lenguajes y Gramáticas

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

El lenguaje C. 1. Identificadores, constantes y variables

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

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

PHP: Lenguaje de programación

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

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

Guía práctica de estudio 05: Diagramas de flujo

Ejercicios de Lógica Proposicional *

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

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

Teoría de la Computabilidad

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Ingeniería en Computación. Autómatas y Lenguajes Formales. Unidad de competencia IV: Conocer, utilizar y diseñar gramáticas de libre contexto

Máquinas de Turing IIC3242. IIC3242 Máquinas de Turing 1 / 42

Máquinas de Turing IIC3242. IIC3242 Máquinas de Turing 1 / 45

Autómatas de Pila y Lenguajes Incontextuales

Procesadores de lenguaje Tema 2 Análisis léxico

Aritmética de Enteros

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

µ-c: Manual de referencia del lenguaje Micro-C

Máquinas Secuenciales, Autómatas y Lenguajes. Tema 3.1: Autómatas Finitos Deterministas

Estructuras de Control

Tema: Tabla de Símbolos

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

Un. VI. Generador de código intermedio.

ESCUELA: UNIVERSIDAD DEL ISTMO

INTRODUCCIÓN A LA PROGRAMACIÓN EN FORTRAN. Métodos Numéricos Carlos Zotelo

7.4. UTILIDADES DE LAS PILAS

Tema 5 Lenguajes independientes del contexto. Sintaxis

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

ANÁLISIS SEMÁNTICO. Especificación formal: Semántica Operacional, semántica denotacional, semántica Axiomática, Gramáticas con Atributos.

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Interrogación 2. Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. Segundo Semestre, 2003

Expresiones Regulares y Derivadas Formales

Curso de Programación 1

Texto: Hopcroft, J. E., Motwani, R., Ullman, J.D., Introduction to Automata Theory, Languajes, and Computation. 3rd Edition. Addison Wesley, 2007.

Algebra lineal y conjuntos convexos

1. Computadores y programación

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Espacios Vectoriales

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Índice Proposiciones y Conectores Lógicos Tablas de Verdad Lógica de Predicados Inducción

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

Expresiones y sentencias

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

Estructura de Datos y de la Información. Pilas y expresiones aritméticas

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

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

GENERADOR DE COMPILADORES BASADO EN

El Juego como Problema de Búsqueda

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

Equivalencia Entre PDA y CFL

Teoría de Lenguajes. Clase Teórica 7 Autómatas de Pila y Lenguajes Independientes del Contexto Primer cuartimestre 2014

Programación en Visual Basic Ricardo Rodríguez García

INSTITUTO POLITECNICO NACIONAL CENTRO DE ESTUDIOS CIENTIFICOS Y TECNOLOGICOS " GONZALO VAZQUEZ VELA "

Lenguajes (gramáticas y autómatas)

Lenguajes, Gramáticas y Autómatas Conceptos

Unidad 2: Ecuaciones, inecuaciones y sistemas.

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

Fundamentos de Programación. Flujo de Control I: Estructuras selectivas

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

Planificaciones Algoritmos y Programación I. Docente responsable: AZCURRA DIEGO ANDRES. 1 de 5

Transcripción:

Tema 3 Introducción al análisis sintáctico Bibliografía: Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, técnicas y herramientas, Tema 4, pág.: 163-186. Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 3, páginas: 93-140. Contenidos: 1. l proceso de análisis sintáctico. 2. specificación sintáctica de los lenguajes de programación: a) Gramáticas independientes del contexto versus expresiones regulares. b) Gramáticas independientes del contexto versus gramáticas dependientes del contexto. 3. Derivaciones y árboles sintácticos. 4. Gramáticas limpias y bien formadas. 5. l problema de la ambigüedad en las gramáticas. liminación: a) Mediante reglas de precedencia. b) Mediante transformación. 6. Clasificación de los métodos de análisis sintáctico. 71

72 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO 3.1. l proceso de análisis sintáctico Funciones del analizador sintáctico: Comprobar si la cadena de componentes léxicos proporcionada por el analizador léxico puede ser generada por la gramática que define el lenguaje fuente (Gramática Independiente del Contexto, GIC). Construir el árbol de análisis sintáctico que define la estructura jerárquica de un programa y obtener la serie de derivaciones para generar la cadena de componentes léxicos. l árbol sintáctico se utilizará como representación intermedia en la generación de código. Informar de los errores sintácticos de forma precisa y significativa y deberá estar dotado de un mecanismo de recuperación de errores para continuar con el análisis. gram. indep. contexto programa fuente analizador léxico componente léxico obtén siguiente componente léxico analizador sintáctico analizador árbol semántico análisis sintáctico gestor errores tabla de símbolos l análisis sintáctico se puede considerar como una función que toma como entrada la secuencia de componentes léxicos producida por el análisis léxico y produce como salida el árbol sintáctico. n la realidad, el análisis sintáctico hace una petición al análisis léxico del componente léxico siguiente en la entrada (los símbolos terminales) conforme lo va necesitando en el proceso de análisis, conforme se mueve a lo laro de la gramática. Reconocedor versus analizador sintáctico

3.2. SPCIFICACIÓN SINTÁCTICA D LOS LNGUAJS D PROGRAMACIÓN73 Un reconocedor trata de determinar simplemente si la cadena puede o no ser generada por la gramática (salida boolena). Podríamos preguntar algo más. Si queremos reconocer las estructuras propias de los lenguajes de programación en el fichero de entrada para guiar la traducción, es necesario conocer su estructura jerárquica, el árbol de análisis sintáctico. 3.2. specificación sintáctica de los lenguajes de programación La mayoría de las construcciones de los lenguajes de programación se pueden representar con una gramática independiente del contexto (GIC). La mayoría de las construcciones de los lenguajes de programación implican recursividad y anidamientos. G = {S, V T, V NT, P }, S: el axioma o símbolo de inicio V T : conjunto de terminales, los componentes léxicos V NT : conjunto de no-terminales P: conjunto de reglas de producción de la forma V NT X 1,..., X n, con X i (V T V NT ) Pregunta: Si las expresiones regulares son un caso particular de GIC, por qué no se incluye la especificación léxica como parte de la sintaxis? Los AFD son muy sencillos de implementar y son muy eficientes frente a los autómatas a pila necesarios para reconocer las GIC, la eficiencia del traductor se vería comprometida. xpresiones regulares o gramáticas independientes del contexto? Las expresiones regulares no permiten construcciones anidadas tan comunes en los lenguajes de programación: paréntesis equilibrados, concordancia de pares de palabras clave como begin-end, do-while,... Por ejemplo: consideremos el problema de los paréntesis equilibrados en una expresión aritmética. l hecho de que haya un

74 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO paréntesis abierto obliga a que haya un paréntesis cerrado. ste problema es similar a considerar el lenguaje L = {aba, aabaa, aaabaaa,..., } = {a n ba n 0} Si intentamos escribir una expresión regular, lo más próximo sería: {a ba } pero no se garantiza que el número de a s antes y después sea el mismo. Las expresiones regulares NO SABN contar. NO es posible especificar la estructura de un lenguaje de programación con sólo expresiones regulares. Son suficientes las gramáticas independientes del contexto? NO, existen ciertos aspectos de los lenguajes de programación que no se pueden representar con una GIC. A estos aspectos se les llama aspectos semánticos, son aspectos en general dependientes del contexto. Por ejemplo, el problema de declaración de los identificadores antes de uso. Se podría representar mediante el lenguaje L={wcw tal que w (a b) } este lenguaje no puede ser representado por una GIC. Por qué no usar gramáticas contextuales? Su reconocimiento es demasiado complejo para ser eficiente en un problema práctico. Será en el tema de análisis semántico donde se abordará estos problemas mediante el uso de acciones concretas (acciones semánticas) que no son propias de la gramática en sí. Será codigo escrito para hacer las comprobaciones semánticas necesarias (tipos, declaración antes de uso,...)

3.2. SPCIFICACIÓN SINTÁCTICA D LOS LNGUAJS D PROGRAMACIÓN75 jemplo de una gramática para un sencillo lenguaje: Program module id ; Declarations begin StatementList end id. Declarations type id = TypeDenoter ; TypeList Declarations var id IdList : TypeDenoter ; VarList Declarations function id ( Parameter ParameterList ) : SimpleType ; Declarations begin StatementList end id ; Declarations ɛ TypeList id = TypeDenoter ; TypeList ɛ VarList id IdList : TypeDenoter ; VarList ɛ IdList, id IdList ɛ Parameter TypeDenoter id ɛ ParameterList, Parameter ParameterList ɛ SimpleType char integer real boolean TypeDenoter SimpleType id CompositeType CompositeType array [ num integer.. num integer ] of SimpleType record id IdList : SimpleType ; FieldList end FieldList id IdList : SimpleType ; FieldList ɛ StatementList Statement ; StatementList ɛ Statement AssignStm IfStm WhileStm FunctionStm ReturnStm WriteStm ReadStm AssignStm LeftValue = xpression LeftValue id id [ xpression ] id. id IfStm if xpression then StatementList lsestm end lsestm else StatementList ɛ WhileStm while xpression do StatementList end FunctionStm id ( Arg ArgList ) ReturnStm return xpression WriteStm write xpression ReadStm read LeftValue Arg Num - Num id - id ɛ Num num integer num real ArgList, Arg ArgList ɛ xpression LeftValue ( xpression ) true false Num FunctionStm xpression * xpression xpression / xpression xpression - xpression xpression + xpression - xpression xpression or xpression xpression and xpression not xpression xpression < xpression xpression > xpression xpression == xpression Cuadro 3.1: jemplo de especificación sintáctica

76 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO 3.3. Derivaciones. Árboles de anal. sintáctico Dada α, β (V T V NT ) cadenas arbitrarias de símbolos gramaticales, se dice que α A β α γ β es una derivación, si existe una producción A γ. Sea S α, si α (V T V NT ) se dice que α es una forma de frase o forma sentencial si α (V T ) se dice que α es una frase o sentencia. xisten dos tipos de derivaciones: Derivación más a la izquierda: se sustituye en cada paso el no-terminal más a la izquierda de la forma de frase. La denotaremos por: α mi β Derivación más a la derecha: se sustituye en cada paso el no-terminal más a la derecha de la forma de frase. La denotaremos por: α md β Por ejemplo para la gramática: id num + ( ) - Si queremos derivar la frase (id + id) ( + ) (id + ) (id + id) derivación más a la izquierda. ( + ) ( + id) (id + id) derivación más a la derecha.

3.3. DRIVACIONS. ÁRBOLS D ANAL. SINTÁCTICO 77 3.3.1. Árboles de análisis sintáctico Un árbol de análisis sintáctico indica cómo a partir del axioma de la gramática se deriva una frase (cadena) del lenguaje. Dada una gramática independiente del contexto, un árbol de análisis sintáctico es un árbol tal que: 1. La raíz está etiquetada con el símbolo inicial. 2. Cada hoja está etiquetada con un componente léxico. Las hojas de izquierda a derecha forman la frase (el programa fuente). 3. Cada nodo interior está etiquetado con un no-terminal. 4. Si A es un no-terminal y X 1, X 2,..., X n son sus hijos de izquierda a derecha, entonces existe la producción A X 1, X 2,..., X n, con X i (V T V NT ). l árbol de análisis sintáctico contiene en general mucha más información que la estrictamente necesaria para generar el código. Se puede construir una estructura más sencilla, los árboles abstractos de análisis sintáctico. jemplo: expresiones aritméticas (igual semántica, menor complejidad) ntrada: id * id * * id id id id árbol de análisis sintáctico árbol abstracto de análisis sintáctico ntrada: (id +id )* id * ( ) * id id + id id + id id

78 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO 3.4. Gramáticas limpias y bien formadas Llamamos símbolo vivo al símbolo a partir del cual se puede derivar una cadena de terminales. Llamamos símbolo muerto a los símbolos no-vivos, no generan una cadena del lenguaje. Llamamos símbolo inaccesible si nunca aparece en la parte derecha de una producción. A las gramáticas que contienen estos tipos de símbolos se les llama gramáticas sucias. Teorema 1: si todos los símbolos de la parte derecha de una producción son símbolos vivos, entonces el símbolo de la parte izquierda también lo es. Algoritmo para detectar símbolos muertos 1. Hacer una lista de no-terminales que tengan al menos una producción con sólo símbolos terminales en la parte derecha. 2. Dada una producción, si todos los no-terminales de la parte derecha pertenecen a la lista, entonces podemos incluir en la lista al no-terminal de la parte izquierda de la producción. 3. Cuando ya no se puedan incluir más símbolos en la lista mediante la aplicación del paso 2, la lista contendrá los símbolos no-terminales vivos y el resto serán símbolos muertos.

3.4. GRAMÁTICAS LIMPIAS Y BIN FORMADAS 79 Teorema 2: si el símbolo no-terminal de la parte izquierda de una producción es accesible, entonces todos los símbolos de la parte derecha también lo son. Algoritmo para detectar símbolos inaccesibles 1. Se inicializa una lista de no-terminales que sabemos que son accesibles con el axioma. 2. Si la parte izquierda de una producción está en la lista, entonces se incluye en la misma al no-terminal que aparece en la parte derecha de la producción. 3. Cuando ya no se pueden incluir más símbolos a la lista mediante la aplicación del paso 2, entonces la lista contendrá todos los símbolos accesibles y el resto de los no-terminales serán innacesibles. Para limpiar una gramática primero se eliminan los símbolos muertos y después los símbolos inaccesibles. Una gramática está bien formada si es limpia y además no contiene producciones-ɛ. Para eliminar producciones-ɛ, remitirse a la signatura de TALF. jemplo: limpiar la gramática S a A B A A c B d B e f S C g D h D t D x y z

80 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO 3.5. Gramáticas ambiguas Una gramática es ambigua cuando para una determinada sentencia produce más de un árbol de derivación. La gramática siguiente es ambigua: id num + * ( ) - Supongamos la sentencia id + id * id ntrada: num + num * num * + + num num * num num num num l significado semántico es DIFRNT. No existe una única traducción posible. Se genera código diferente. No existe un algoritmo que determine con certeza en un plazo finito de tiempo si una gramática es ambigua o no. A lo sumo que se ha llegado en el estudio de la ambigüedad es que hay algunas condiciones que de cumplirse determinan la ambigüedad, pero en el caso de no cumplirse no se puede decir que la gramática es no ambigua. Necesidad de evitar las gramáticas ambiguas. Cómo? transformando la gramática o estableciendo precedencias entre operadores y de asociatividad. Se puede eliminar la ambigüedad transformando la gramática agrupando todos los operadores de igual precedencia en grupos y asociando a cada uno una regla, de forma que los que tengan menor precedencia aparezcan más cercanos al símbolo de inicio, precedencia en cascada. sto conlleva el aumento de la complejidad de la gramática y con ello en la del árbol sintáctico. La gramática deja de ser intuitiva.

3.5. GRAMÁTICAS AMBIGUAS 81 jemplo 1: gramática ambigua num + - * / Si la transformamos, esta gramática ya no es ambigua. exp exp + term exp - term term term term * factor term / factor factor factor ( exp ) num IMPORTANT: Una regla recursiva a izquierdas, hace que el operador sea asociativo por la izquierda. Una regla recursiva a derechas hace que el operador sea asociativo por la derecha. jemplo 2: el problema del dangling else y el convenio de la asociación al if más cercano. statement if stmt other if stmt if ( exp) statement exp 0 1 if ( exp) statement else statement Por ejemplo: para la sentencia if (0) if (1) other else other tenemos dos árboles de derivación. Crear los dos árboles...

82 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO 3.6. Clasificación métodos de análisis sintáctico Atendiendo a la forma en que se construye el árbol de análisis sintáctico los métodos de análisis sintáctico se clasifican: Métodos descendentes: se parte del símbolo de inicio de la gramática que se coloca en la raíz y se va construyendo el árbol desde arriba hacia abajo hasta las hojas, eligiendo la derivación que da lugar a una concordancia con la cadena de entrada. Se basa en la idea de predice una derivación y establece una concordancia con el símbolo de la entrada (predict/match). l análisis sintáctico descendente corresponde con un recorrido prefijo del árbol de análisis sintáctico (primero expandimos el nodo que visitamos y luego procesamos los hijos). S Sujeto Verbo Objeto Sujeto el Nombre un Nombre Objeto el Nombre un Nombre Verbo el Nombre un Nombre Nombre perro gato león jemplo: l león cazó un gato Crear el árbol... Problemas: recursión a izquierdas, diferentes alternativas en una producción, cómo conseguir un coste lineal?

3.6. CLASIFICACIÓN MÉTODOS D ANÁLISIS SINTÁCTICO 83 Métodos ascendentes: se construye el árbol de análisis sintáctico desde las hojas hasta la raíz. n las hojas está la cadena a analizar y se intenta reducirla al símbolo de inicio de la gramática que está en la raíz. Se trata de desplazar-se en la cadena de entrada y encontrar una subcadena para aplicar una reducción (una regla de producción a la inversa), (shiftreduce). l análisis sintáctico ascendente corresponde con un recorrido postorden del árbol (primero reconocemos los hijos y luego mediante una reducción reconocemos el padre). Insertar un ejemplo de como efectivamente los dos tipos de análisis corresponden con los tipos de recorrido prefijo y postfijo. Atendiendo a la forma en que procesan la cadena de entrada se clasifican en: Métodos direccionales: procesan la cadena de entrada símbolo a símbolo de izquierda a derecha. Métodos no-direccionales: acceden a cualquier lugar de la cadena de entrada para construir el árbol. Necesitan tener toda la cadena de componentes léxicos en memoria. Más costosos, no se suelen implementar. Atendiendo al número de alternativas posibles en una derivación se clasifican en: Métodos deterministas: dado un símbolo de la cadena de entrada se puede decidir en cada paso cuál es la alternativa/derivación adecuada a aplicar, sólo hay una posible. No se produce retroceso y el coste el lineal. Métodos no-deterministas: en cada paso de la construcción del árbol se deben probar diferentes alternativas/derivaciones para ver cual es la adecuada, con el correspondiente aumento del coste. Importancia de los métodos direccionales y deterministas en el diseño de traductores. l determinismo por la necesidad de eficiencia (coste lineal frente a exponencial que le haría prohibitivo en el diseño práctico de traductores) y porque las herramientas para la generación de traductores asumen esta condición. Los

84 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO descendentes ascendentes no direccionales Unger CYK direccionales no deterministas Predice/Concuerda 1º en anchura 1º en profundida Desplaza/Reduce 1º en anchura 1º en profundida deterministas Predice/Concuerda Desplaza/Reduce Gram. LL(1) Gram. LR(k) LR(0), SLR(1), LALR(1) métodos direccionales por la propia naturaleza secuencial en que se va procesando los símbolos del fichero fuente de izquierda a derecha.

3.7. JRCICIOS 85 3.7. jercicios 1. (0.2 ptos) Dadas la siguiente gramática, elimina los símbolos muertos e inaccesibles. S a A B C D d A a B C B b C c D d g h 2. (0.2 ptos) Dada la siguiente grámatica, escribe la derivación más a la izquierda, el árbol de análisis sintáctico y el árbol sintáctico abstracto para las siguientes expresiones: (a) 3+4*5-6; (b) 3*(4-5+6) exp exp addop term term addop + - term term mulop factor factor mulop * / factor ( exp ) num 3. (0.2 ptos) Dada la siguiente grámatica simplificada de una expresión en LISP: (a) escribe las derivaciones más a la derecha y más a la izquierda de la entrada (a 23 (m x y)). Dibuja el árbol de análisis sintáctico para esa sentencia. lexp atom list atom number identifier list ( lexp-seq ) lexp-seq lexp-seq lexp lexp 4. (0.2 ptos) Dada la siguiente gramática, construya el árbol de análisis sintáctico para la frase not (true or false). s una gramática ambigua?

86 TMA 3. INTRODUCCIÓN AL ANÁLISIS SINTÁCTICO bexp bexp or bterm bterm bterm bterm and bfactor bfactor bfactor not bfactor ( bexp ) true false 5. (0.2 ptos) scribe una gramática para expresiones booleanas que incluya las constantes true y false, los operadores and, or y not y los paréntesis. Se ha de tener en cuenta que el operador or tiene menor precedencia que el operador and y éste menor que el operador not. Construye la gramática de forma que los operadores and y or sean asociativos por la izquierda y el operador not por la derecha. 6. (0.2 ptos) Comprueba que se puede resolver el problema de la ambigüedad del dangling else transformando la gramática a la forma: statment matched-stmt unmatched-stmt matched-stmt if ( exp ) matched-stmt else matched-stmt other unmatched-stmt if ( exp ) statement exp 0 1 if ( exp ) matched-stmt else unmatched-stmt Justificar usando un ejemplo. 7. (0.2 ptos) Comprueba que el intento de resolver el problema de la ambigüedad del dangling else no es adecuado: statment if ( exp ) statement matched-stmt matched-stmt if ( exp ) matched-stmt else statment other exp 0 1 Justificar usando un ejemplo.