Conceptos básicos sobre gramáticas

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

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

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

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

Generación de Código Intermedio

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

token siguiente! Tabla de símbolos

LENGUAJES Y GRAMÁTICAS

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

16 Análisis sintáctico I

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

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

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

INTRODUCCIÓN A LOS LENGUAJES

Tema 5: Traducción dirigida por la sintaxis

AMBIENTES DE COMPILACION

Gramáticas de Atributos

Gramáticas tipo 0 o Estructura de frase En este tipo de gramáticas no hay restricción en su producciones y tienen la forma siguiente.

Lenguajes y Compiladores Traducción Dirigida por la Sintaxis

Análisis Semántico y Traducción Dirigida por la Sintaxis. Programación II Margarita Álvarez

Procesadores de Lenguajes. Análisis sintáctico. Gramáticas libres de contexto

Modelos De Computación. Guía Modelos de Computación. Tema I: Lenguajes y Gramáticas

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

GRAMATICAS LIBRES DEL CONTEXTO

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

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

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

Sintaxis y Semántica. Un repaso

Gramáticas libres de contexto

Gramaticas Independientes del Contexto, ejemplos y ejercicios

Yacc/Bison. Introducción

Unidad 5 Análisis semántico

Pontificia Universidad Católica del Ecuador

ANÁLISIS SINTÁCTICO I ANALIZADORES SINTÁCTICOS

Teoría de autómatas. Un enfoque práctico. Recortables. Thelma Cantú María Gpe. Mendoza

ANÁLISIS SINTÁCTICO II GENERADOR DE ANALIZADORES SINTÁCTICOS ASCENDENTES

Procesadores de Lenguaje

Se pueden agrupar las reglas que tienen la misma parte izquierda:

1. Acciones en Yacc. %{ #include <stdio.h> yyerror (char *s) { fprintf (stderr, %s\n, s) ; } %} %% : S \n {printf ( Correcto\n );} ; : ( S ) S

Expresiones y sentencias

14 Lenguajes y gramáticas II

Sintaxis y Semántica. Tema 3. Sintaxis y Semántica. Expresiones y Lenguajes Regulares. Dr. Luis A. Pineda ISBN:

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente

ANÁLISIS SINTÁCTICO I GRAMÁTICAS

CAPITULO 5: GRAMÁTICAS

17 Análisis sintáctico II Compiladores - Profr. Edgardo Adrián Franco Martínez. Gramáticas limpias y bien formadas

Alfabetos y cadenas (1) Alfabetos y cadenas (2) Lenguajes. Propiedades de la concatenación:

Lenguajes y Compiladores Análisis Léxico

Gramaticas Independientes del Contexto, ejemplos y ejercicios *

Tema 5. Análisis semántico

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

Qué es el análisis semántico?

ESPECIFICACIÓN DE SÍMBOLOS

Expresiones regulares

HERRAMIENTAS YACC Y BISON

Este método de diseño de algoritmos en etapas, yendo de los conceptos generales a los de detalle, se conoce como método descendente (top-down).

INTRODUCCIÓN A COMPILADORES Y LENGUAJES FORMALES LENGUAJES FORMALES

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

Los modelos abstractos de cómputo. Tema 1: Introducción. El modelo transductor. El modelo reconocedor. ordenador. datos. Modelo Abstracto de Cómputo

Operadores y Expresiones

Examen de Procesadores de Lenguaje

Tema: Autómata de Pila

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

CÓMO DESARROLLAR Y PROBAR PROGRAMAS?, COMPRUÉBALO!

Expresiones regulares, gramáticas regulares

Coordinación de Ciencias Computacionales INAOE. Teoría de Autómatas y Lenguajes Formales. Temario detallado para examen de ingreso 2012

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

Tema 5: Traducción dirigida por la sintaxis

Unidad II: Análisis semántico

GENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)

Compiladores e intérpretes Introducción

Expresiones y sentencias

Teoría de la Computación y Leguajes Formales

FLEX: A FAST LEXICAL ANALYZER GENERATOR

Analizadores sintácticos LR(0) y SLR

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

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

Tema 2: Lenguajes Formales. Informática Teórica I

Transcripción:

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 pertenecientes al alfabeto. Es posible que la cadena vacía, ɛ, pertenezca a un lenguaje Una gramática es una forma compacta de representar un lenguaje IMPORTANTE: Una gramática genera un único lenguaje, pero un mismo lenguaje puede ser generado por varias gramáticas Una gramática es una cuádrupla G = (V N, V T, S, P ), donde V N es el conjunto de símbolos variables o no terminales, V T es el conjunto de símbolos terminales (todos los terminales deben pertenecer al alfabeto), S es el símbolo inicial de la gramática (S siempre es un ), y P es el conjunto de producciones o reglas de la gramática Producciones y derivaciones Una producción o regla de una gramática tiene una parte izquierda y una parte derecha. Tanto la parte izquierda como la parte derecha son una cadena de símbolos terminales y es Normalmente, solamente se especifica el conjunto de producciones P, y se asume que el símbolo inicial de la gramática es la parte izquierda de la primera producción. Ejemplo: A a B C B b bas B big C boss C ɛ C c G = (V N = A, B, C, V T = a, b, bas, big, boss, c, S = A, P = A...) Una derivación es una secuencia de cadenas de símbolos (llamadas formas sentenciales) en la que cada cadena es resultado de la aplicación de una regla de la gramática a la cadena anterior. Una derivación válida es aquella en la que la primera cadena de la secuencia es el símbolo inicial, y la última es una cadena de terminales. Ejemplos: A a B C a B c a big C boss c a big boss c A a B C a b bas C a b bas En los ejemplos, la primera derivación se dice que es una derivación por la derecha, porque siempre se deriva el situado más a la derecha, y la segunda es una derivación por la izquierda IMPORTANTE: El lenguaje generado por una gramática es el conjunto de cadenas de terminales obtenidas a partir de derivaciones válidas usando las reglas de la gramática Un árbol de derivación es un árbol en el que se representa una derivación válida de una cadena (pero no se especifica el orden en que se han aplicado las reglas)

PL, 2013/2014 2 A a B C b bas ε Características especiales Se dice que una gramática es ambigua cuando, para una cadena determinada, existe más de un árbol de derivación IMPORTANTE: la única forma de saber si una gramática es ambigua es encontrando una cadena con más de un árbol de derivación, no hay otra forma Ejemplo: E E opsuma E E num La cadena 2+3-4 tiene dos árboles de derivación, y la cadena 2+3-4+5 tiene más de dos árboles ( cuántos?) Una gramática se dice que es recursiva por la izquierda si tiene al menos una regla de esta forma: E E opsuma T De forma similar, una gramática puede presentar recursividad por la derecha: E T opsuma E Una gramática se dice que tiene factores comunes por la izquierda si tiene en al menos dos reglas (con la misma parte izquierda) símbolos comunes al principio de la parte derecha de la regla: Jerarquía de gramáticas A B a C A B a d... Según la forma de las producciones, las gramáticas se clasifican en: Regulares: en la parte izquierda sólo hay un, y la parte derecha puede haber: terminal terminal ɛ Independientes del contexto (context-free): en la parte izquierda sólo hay un, en la parte derecha no hay restricciones Dependientes del contexto: en la parte izquierda puede haber terminales y es, pero al menos debe haber un, y la longitud de la parte derecha debe ser mayor o igual que la de la parte izquierda No restringidas

PL, 2013/2014 3 Qué tipos de gramáticas se usan en los compiladores? En los compiladores se utilizan solamente gramáticas regulares y gramáticas independientes del contexto (GIC) Las gramáticas regulares se utilizan para especificar los tokens (en realidad, se utilizan expresiones regulares, pero son equivalentes) Las GIC se utilizan para especificar la sintaxis de las construcciones del lenguaje fuente En los lenguajes de programación hay restricciones semánticas (p.ej. es necesario haber declarado una variable antes de utilizarla), que hacen que en realidad los lenguajes de programación sean lenguajes sensibles al contexto, pero no se utilizan gramáticas sensibles al contexto, se utilizan GIC a las que se añaden acciones para la comprobación de las restricciones semánticas. Diseño de gramáticas para expresiones en lenguajes de programación Un buen diseño de la gramática nos permitirá reflejar de forma natural características semánticas del lenguaje en el árbol de derivación, y esto permitirá que la traducción sea más sencilla Es importante por tanto diseñar una buena gramática, pero luego es posible que se tenga que modificar según el tipo de analizador sintáctico que se desee utilizar Además, es posible que al diseñar el proceso de traducción sea necesario rediseñar la gramática para facilitar el diseño del traductor Diseño de gramáticas para expresiones: asociatividad La asociatividad indica cómo se agrupan los operandos en un operador cuando aparecen más de dos operandos. Por ejemplo, 4-3-2 normalmente vale -1, porque el operador - suele tener asociatividad por la izquierda, y primero se evalua 4-3 y al resultado se le resta 2. Sin embargo, si la asociatividad fuera por la derecha, el resultado sería 3 ( 4-(3-2) ) Los paréntesis permiten alterar la asociatividad por defecto de un operador Cómo se puede reflejar la asociatividad en una gramática? asociatividad izquierda E E opsuma T asociatividad derecha E T opsuma E Pero... no son todos los operadores asociativos por la izquierda? Sí, casi todos, pero no todos: a=b=c=0 Diseño de gramáticas para expresiones: precedencia En la mayoría de los lenguajes de programación, unos operadores se evaluan antes que otros. Por ejemplo, 2+3*4 casi siempre vale 14. Como ocurre con la asociatividad, los paréntesis permiten alterar la precedencia de los operadores: (2+3)*4 Cómo se puede reflejar la precedencia en una gramática? con un diferente para cada nivel de precedencia: Expr Expr or EBool Expr EBool EBool EBool and ExpRel EBool ExpRel ExpRel E oprel E E E opsuma T E T T T opmul F T F F... Algunos operadores no permiten usar más de dos operandos, como por ejemplo: a<b<c a<b && b<c

PL, 2013/2014 4 Tabla de asociatividades y precedencias Es una tabla en la que aparecen los operadores y su asociatividad, ordenados de menor a mayor precedencia: Operador Asociatividad @ izquierda % derecha # izquierda A A @ B A B B C % B B C C C # D C D D... Operadores unarios Los operadores unarios son más difíciles de reflejar en una gramática, requiere un buen conocimiento del lenguaje y de las gramáticas Los ejemplos más conocidos son: el operador de negación,!, que además permite que se repita el operador:!!!true ExpRel! ExpRel el operador de cambio de signo, - o +, que no permite repeticiones (por ejemplo, ----3 no es correcto) E opsuma T El problema del dangling- Con qué if se asocia el? La regla que se usa normalmente es asociar el al if más cercano: Consejo: es mejor usar bloques entre llaves de forma explícita

PL, 2013/2014 5 Fragmento de gramática para la instrucción if : Tiene dos características no deseables: 1. Tiene factores comunes por la izquierda 2. Es ambigua!!!!! Instr id opasig Expr Instr... Instr if ( Expr ) Instr Instr if ( Expr ) Instr Instr... y sin embargo, se utiliza en prácticamente todos los compiladores basados en análisis sintáctico ascendente (los que usan yacc o bison).