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

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

Generador de analizadores sintácticos BISON

Diseño de Compiladores I YACC: Yet Another Compiler-Compiler

Generador de analizadores léxicos FLEX

2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.

Compiladores: Parsing ascendente

Construcción de una calculadora con Flex y Bison. Construcción de una calculadora con Flex y Bison. Índice (I)

Procesadores de Lenguaje

El lenguaje C. 1. Identificadores, constantes y variables

GRAMATICAS LIBRES DEL CONTEXTO

Teoría de Autómatas y Lenguajes Formales LEX BISON Dr. Eric Jeltsch F. Introducción para los laboratorios y actividades relacionadas.

Hoja técnica sobre yacc 1 y lex 2. Introducción. lex PL, 2014/2015 1

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

GENERACIÓN DE CÓDIGO

Modelos de Computación I. Ingeniería Informática

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

Práctica de constantes, expresiones y operadores. Programación en C 1

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

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

GUÍA BÁSICA DE FLEX Y BISON

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

S Qué es el analizador sintáctico?

Una Herramienta para el Análisis Léxico: Lex

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

OPERADORES Y EXPRESIONES

TRADUCTORES, COMPILADORES E INTÉRPRETES. EJERCICIOS TEMA 5, 6, 7 y 8.

Gramática abstracta. Gramática abstracta. Forma de escribirlas: Pizquierda : Pderecha <Predicado> atributos o acc. semánticas}

8.1. Introdución. %% [b\ t]+ $ ;

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

LENGUAJE. Tema 2 Elementos de un programa

Expresiones y sentencias

Elementos de un programa en C

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

Elementos léxicos del lenguaje de programación C

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

Integración de JFlex y CUP (analizadores léxico y sintáctico)

Datos y tipos de datos

Informática I para Bachillerato

Tema: Autómata de Pila

Procesadores de Lenguaje CUP - Constructor of Useful Parsers

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

41 Jornadas Argentinas de Informática Concurso de Trabajos Estudiantiles Categoría: Teoría de la Computación, Modelos Formales y Compiladores.

Prácticas de Lenguajes, Gramáticas y Autómatas

Existen diferentes compuertas lógicas y aquí mencionaremos las básicas pero a la vez quizá las más usadas:

TEMA 3.- El analizador sintáctico

Expresiones Regulares y Derivadas Formales

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

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Operadores de comparación

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

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

Introducción a C++ y Code::Blocks

Curso de Programación Avanzada en C

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

Capítulo 6 Tabla de símbolos

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

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

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

Lenguajes y Gramáticas

Principios de Computadoras II

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

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

Capítulo 7 OPERADORES Y EXPRESIONES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Inicio del programa. Entrada de datos. Proceso de datos. Salida de datos. Fin del programa

MANUAL DE RUBY (PARTE I) Luis José Sánchez González

Tema 4. Operadores y Expresiones

FLEX: Un generador de analizadores léxicos. AT&T Lex (más común en UNIX) MKS Lex (MS-Dos) Flex Abraxas Lex Posix Lex ScanGen JLex...

Carrera: SCC Participantes. Representantes de la academia de sistemas y computación de los Institutos Tecnológicos.

Flex a la rápida. José Ignacio Medina

Las plantillas permiten definir funciones genéricas.

Programación. Ejercicios Tema 3. Elementos Básicos del Lenguaje C

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

7.4. UTILIDADES DE LAS PILAS

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

COMPILADOR DE PSEUDOCÓDIGO COMO HERRAMIENTA PARA EL APRENDIZAJE EN LA CONSTRUCCIÓN DE ALGORITMOS RAFAEL ANIBAL VEGA CASTRO

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

AUTÓMATAS DE PILA Y LENGUAJES INDEPENDIENTES DEL CONTEXTO

INSTITUTO POLITÉCNICO NACIONAL

Se guardan en archivos con extencion c y los cabezales con extension h

Práctica 3: Construcción de una mini shell Diseño de Sistemas Operativos U.L.P.G.C.

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

FUNCIONES PHP: DECLARACIÓN Y LLAMADAS. PARÁMETROS, RETURN. EJERCICIOS EJEMPLOS RESUELTOS. (CU00827B)

Descripción y Contenido del Curso. Programación C++ Capacity Academy.

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

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Introducción al lenguaje C

Sintaxis y Semántica del Lenguaje. Gramáticas

Tema 13: Programas interactivos

Problemas de Espacios Vectoriales

Expresiones regulares, gramáticas regulares

Compilación de lenguajes de programación

GLOSARIO DE MICROSOFT VISUAL BASIC (HAZ CLIC EN LA OPCION DEL MENU Y ACCEDERAS RAPIDAMENTE)

2ª Convocatoria 2008/2009 (15-IX-2009) 4º Ing. Informática. CPS. Universidad de Zaragoza Tiempo de realización: 3 horas

Estructuras de Control

Figura 4.1 Clasificación de los lenguajes de bases de datos

Lenguaje C Preprocesador, Compilación y Enlazado.

Procesadores de lenguaje Tema 2 Análisis léxico

Transcripción:

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 2

1. Introducción Especificaciones YACC -d -v y.tab.h y.tab.c y.output y.tab.h: contiene la codificación de los símbolos terminales de la gramática y.tab.h: contiene la rutina yyparse() para el análisis sintáctico y.output: contiene el autómata de reconocimiento sintáctico 3

2. Especificaciones Declaraciones (opcional) %% Reglas de la gramática %% Funciones C (opcional) 4

Declaraciones %{ Declaraciones C %} %token token_1 token_n %left operadores %start S (No es necesario, ya que por defecto se toma el símbolo no-terminal de la primera regla) 5

Reglas N α1 α2 ε M β N : / la opción ε debe ser la primera / α1 α2 ; / finalizador de reglas / M : β ; 6

Código en las reglas N A B C M X Y N: A B C { Código C } ; N: X { Código C } Y { Código C } ; 7

3. Ambigüedad y conflictos Una gramática ambigua genera conflictos. EJEMPLO EXPR : EXPR + EXPR EXPR * EXPR id Se generan conflictos por la indefinición de PRECEDENCIA y ASOCIATIVIDAD de los operadores 8

Conflictos por Precedencia y Asociatividad Precedencia id + id * id ( (id + id) * id ) ( id + (id * id) ) Asociatividad id + id + id ( (id + id) + id ) ( id + (id + id) ) 9

Solución de los conflictos (por defecto) Por defecto, YACC soluciona los conflictos de la siguiente forma: shift/reduce shift reduce/reduce escoge la primera regla declarada En cualquier caso, YACC siempre informa de los conflictos solucionados de esta forma. 10

Ejemplo (I) STMT : if ( EXPR ) then STMT if ( EXPR ) then STMT else STMT id = EXPR if (a+b) then if (x+y) then a=b else b=c 1. if (a+b) then [ if (x+y) then a=b ] else b=c 2. if (a+b) then [ if (x+y) then a=b else b=c ] Conflicto SHIFT/REDUCE ante el símbolo: else 11

Ejemplo (II) Por defecto, YACC resuelve el conflicto a favor del SHIFT, y nos informa de la existencia del conflicto. Es correcta esta solución por defecto? SI, ya que la ambigüedad ha sido resuelta tal como indican los lenguajes de programación, es decir, el ELSE se asocia al IF más interno. Sin embargo, no siempre son correctas las soluciones por defecto. 12

Soluciones por defecto no satisfactorias EXPR : EXPR + EXPR EXPR * EXPR id a + b + c (a + (b + c) ) a * b + c (a * (b + c) ) Podemos eliminar la solución por defecto en los conflictos mediante la especificación de la precedencia y asociatividad de los operadores 13

Especificando Precedencia y Asociatividad Operadores binarios: precedencia y asociatividad Operadores unarios: solamente la precedencia En la sección de declaraciones del fichero de especificaciones podríamos indicar: %left + - %left * / %nonassoc - (tienen igual precedencia entre ellos) (mayor precedencia que los anteriores) (mayor precedencia que los anteriores) Problema: el - unario y el - binario utilizan el mismo símbolo. La solución pasa por utilizar un símbolo auxiliar. 14

Ejemplo (I) %token id %left + - %left * / %nonassoc UMINUS %% EXPR : EXPR + EXPR EXPR - EXPR EXPR * EXPR EXPR / EXPR - EXPR id Símbolo auxiliar - a * b -( a * b) incorrecto 15

Ejemplo (II) Cada regla de la gramática tiene la precedencia y asociatividad del último token de la regla, aunque se puede modificar utilizando %prec. Por tanto, el problema del - unario puede quedar resuelto de la siguiente forma: %token id %left + - %left * / %nonassoc UMINUS %% EXPR %% : EXPR + EXPR EXPR - EXPR EXPR * EXPR EXPR / EXPR - EXPR %prec UMINUS id Símbolo auxiliar 16

Resumen de resolución de conflictos en YACC 1 Si no especificamos la precedencia y/o asociatividad de un operador, YACC utiliza la solución por defecto. shift/reduce shift reduce/reduce la primera regla declarada 2 Si especificamos la precedencia y/o asociatividad de todos los operadores, YACC utiliza esa información para solucionar los conflictos. Veamos un ejemplo en el que se mezclan ambas situaciones 17

Resolución de conflictos: Ejemplo genérico (I) %left + %left * %nonassoc UMINUS %% EXPR : EXPR + EXPR EXPR - EXPR EXPR * EXPR EXPR / EXPR - EXPR %prec UMINUS id %% 18

Resolución de conflictos: Ejemplo genérico (II) Expresiones Interpretación -a* b + c [ (- a) * b ] + c -a-b + c - [ a - (b + c) ] - a * b / c (- a) * (b / c) -a-b/ c - [ a - (b / c) ] a - b + c + d a - [ (b + c) +d ] a - b * c / d a - [ b * (c / d) ] a - b / c + d a - [ b / (c + d) ] a - b / c / d a - [ b / (c / d) ] 19

4. TRATAMIENTO DE ERRORES Cuando el analizador sintáctico encuentra un error, simplemente hace la siguiente llamada: yyerror ( syntax error ); La rutina yyerror() de la librería es la siguiente: yyerror (s) char * s; { fprintf(stderr, %s\n, s); } 20

Modificando yyerror() yyerror (s) char * s; { fprintf(stderr, %s\n, s); fprintf(stderr, Numero de linea %d\n, n_linea); fprintf(stderr, Simbolo terminal %s\n, yytext); } n_linea: variable que controla el número actual de línea. yytext: cadena que almacena el último token reconocido. 21

5. Uso con el LEX %token cte %left + - %left * / %nonassoc UMINUS %% EXPR %% : EXPR + EXPR EXPR - EXPR EXPR * EXPR EXPR / EXPR - EXPR %prec UMINUS ( EXPR ) cte main() { yyparse(); } 22

Especificación LEX %{ #include y.tab.h /* Fichero de codificación de tokens */ %} %% [ \t\n] ; [0-9]+ { return (cte); }. { return (yytext[0]); } %% ----------------------------------------------------------------------------------------------- Fichero y.tab.h #define cte 257 23

Comandos para generar el parser $ yacc -d -v file.y se generan: y.tab.h, y.tab.c, y.output $ lex file.l se genera: lex.yy.c $ cc y.tab.c lex.yy.c -ly -ll -o parser $ parser < fichero_fuente 24

6. Algunos consejos prácticos 1. Utilizar reglas recursivas por la izquierda siempre que sea posible (favorece el reconocimiento ascendente, ya que los árboles sintácticos crecen hacia la izquierda) 2. Cuidado con los tokens que son palabras claves en el lenguaje C. Véase lo que sucede en la página siguiente: 25

Problema con las palabras claves en C LEX #include y.tab.h DESASTRE if { return (if); } else { return (else); } YACC STMT : if ( EXPR ) STMT else STMT Fichero y.tab.h #define if 257 #define else 258 26

Solución: utilizar otros nombres lógicos LEX #include y.tab.h if { return (if_t); } else { return (else_t); } YACC STMT : if_t ( EXPR ) STMT else_t STMT Fichero y.tab.h #define if_t 257 #define else_t 258 27