Yacc/Bison. Introducción

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

Yacc/Bison. Índice. Construcción del programa objetivo Flujo de control de las funciones yylex() e yyparse()

Construcción de una calculadora con Lex/Flex y Yacc/Bison

Seminario de introducción a Bison

10 Introducción a BISON/YACC

DESARROLLO DE LA PRÁCTICA DE ANÁLISIS SINTÁCTICO

FLEX: A FAST LEXICAL ANALYZER GENERATOR

YACC. Los símbolos terminales que la gramática empleará. El axioma o símbolo inicial de la gramática. %token. %start

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

FLEX: A FAST LEXICAL ANALYZER GENERATOR

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

HERRAMIENTAS YACC Y BISON

Lex. Lex. Ing. Adrian Ulises Mercado Martínez. Enero 30, Ing. Adrian Ulises Mercado Martínez Lex Enero 30, / 27

Uso de la herramienta YACC

Análisis semántico. Análisis semántico. Índice (I)

Tema 5 Tabla de Símbolos

UNIVERSIDAD NACIONAL DE JUJUY FACULTAD DE INGENIERÍA APUNTES DE CÁTEDRA EL METACOMPILADOR BISON INTERFAZ FLEX - BISON

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

Tema: Generación de analizadores con YACC

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

ANÁLISIS LÉXICO EXPRESIONES REGULARES

Construcción de un analizador léxico para ASPLE con Lex/Flex. Construcción de un analizador léxico para ASPLE con Lex/Flex

Prácticas Compiladores YACC Este material no es obligatorio para la práctica. Grupos de Kostadin Koruchev.

Construcción de un analizador léxico para ALFA con Flex. Construcción de un analizador léxico para ALFA con Flex. Índice (I)

Diseño de Compiladores I. Estructura General de un Compilador

Introducción a Flex y Bison

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

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

Generador de analizadores sintácticos BISON

Lex (flex,... ) Generación de analizador léxico p.1

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

Funciones Definición de función

Conceptos básicos sobre gramáticas

Introducción a los generadores de analizadores léxicos y sintácticos FLEX y BISON: Implementación de una pequeña calculadora

Práctica 3 Introducción al Manejo de Bison

8- LEX-Expresiones regulares

1. Funcionamiento de lex

INTRODUCCIÓN AL PROCESO DE COMPILACIÓN

Elementos de un programa en C

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

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

Generación de analizador sintáctico ascendente Yacc (bison,... ) Generación de analizador sintáctico ascendente v1.1 c 2005 José Fortes Gálvez p.

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

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

Tema 2: Análisis léxico

Introducción a la Programación

Seminario de introducción a Flex

CAPITULO 6: FUNCIONES

COMPILADORES. Tema 4. Análisis semántico

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

Analizador Sintáctico RECURSIVO

Tema 2: Análisis léxico

ANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa

Generador de analizadores léxicos FLEX

Qué es Lex? Busca concordancias de un conjunto de expresiones regulares y un archivo de entrada y ejecuta acciones asociadas.

PRÁCTICAS DE PROCESADORES DEL LENGUAJE CURSO 2008/2009

TEORÍA. definition TAG. PROPERTIES ID expr EXTENDS ID FIN_TAG. DELAYED : expr

Tema: Análisis Sintáctico LR

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

Compiladores: Análisis Léxico. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V.

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

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

Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas

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

Funcionamiento del A.L.

Temas. Objetivo. Analizador Sintáctico: funciones y tipos. Analizador Sintáctico Descendente. Analizador Sintáctico Ascendente

Tema 5: Traducción dirigida por la sintaxis

Estructuración del programa en partes más pequeñas y sencillas

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

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

12 La herramienta LEX

Agenda. Introducción Analizador léxico Analysis El problema de analizar sintácticamente Analizador sintáctico descendeterecursivo

TEORÍA DE AUTÓMATAS Y LENGUAJES

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

CUP. Diseño de compiladores. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP. Estructura del archivo CUP 20/04/2014

Transcripción:

Yacc/Bison Índice Marina de la Cruz Alfonso Ortega Introducción Uso de Yacc/Bison con Lex/Flex Construcción del programa objetivo casple Comunicación entre las funcionesmain(), yylex() eyyparse() Formato del fichero de especificación de Yacc/Bison Estructura del fichero Sección de definiciones Yacc/Bison Sección de reglas Sección de funciones de usuario Prácticas de compiladores 2004-2005 1 Introducción Yacc es un generador de analizadores sintácticos LALR(1). Bison es la versión GNU de Yacc. Es totalmente compatible con Yacc. Mejora algunas de las prestaciones de Yacc. Habitualmente Yacc/Bison se utiliza junto con con Lex/Flex. Lex/Flex genera un analizador léxico:yylex() Yacc/Bison genera un analizador sintáctico:yyparse() Prácticas de compiladores 2004-2005 2

Uso de Yacc/Bison con Lex/Flex (I) Construcción del programa objetivocasple (i) *.l Especificación Lex/Flex Especificación Yacc/Bison *.y Lex/Flex Yacc/Bison lex.yy.c y.tab.c yylex( ) yyparse( ) Funciones de usuario *.c gcc Librerías del sistema libl.a / libfl.a liby.a casple VER DESCRIPCIÓN DEL DIAGRAMA EN LA PÁGINA Prácticas de compiladores 2004-2005 SIGUIENTE 3 Uso de Yacc/Bison con Lex/Flex (II) Construcción del programa objetivocasple (ii) Lex/Flex construye la funciónyylex() de análisis morfológico a partir del fichero de especificación correspondiente. El fichero donde se ubica la funciónyylex() se llamalex.yy.c. Yacc/Bison construye la funciónyyparse() de análisis sintáctico a partir del fichero de especificación correspondiente. La funciónyyparse() se ubica en el fichero y.tab.c. Las funciones de usuario incluyen funciones de soporte como por ejemplo funciones para generar código, funciones invocadas por Lex y Yacc como por ejemployywrap() oyyerror(), y también la función principal que invoca al analizador sintáctico para realizar la compilación. Todas estás funciones se pueden organizar en varios ficheros. Las librerías del sistema proporcionan versiones sencillas de las funciones que son invocadas por Lex y Yacc así como una versión mínima de la función principal que invoca al analizador léxico o al sintáctico. Si el usuario proporciona estas funciones, no es necesario utilizar las librerías. Dependiendo del sistema operativo, las librerías existen o no, por lo tanto para facilitar la portabilidad del código, es recomendable que el usuario aporte sus propias versiones de las funciones. Para obtener el programa objetivocasple, se compilan y enlazan los ficheros descritos anteriormente. Prácticas de compiladores 2004-2005 4

Uso de Yacc/Bison con Lex/Flex (III) Comunicación entre las funcionesmain(),yylex() eyyparse() (i) main( ) Analizar entrada 0 si análisis OK 1 en otro caso yyparse( ) Solicitud del siguiente token Uso en las acciones yylval Nº del token, 0 si es EOF Valor del token yylex( ) Leer caracteres Fichero de entrada VER DESCRIPCIÓN DEL DIAGRAMA EN LA PÁGINA SIGUIENTE Prácticas de compiladores 2004-2005 5 Uso de Yacc/Bison con Lex/Flex (IV) Comunicación entre las funcionesmain(),yylex() eyyparse() (ii) La funciónmain() invoca a la función de análisis sintácticoyyparse() que devuelve un 0 si termina el análisis con éxito, es decir, si la entrada es sintácticamente correcta. En caso contrario devuelve un 1. La funciónyyparse() solicita a la funciónyylex() los tokens de la entrada y comprueba si forman una construcción válida de acuerdo a las reglas de la gramática descritas en el fichero de especificación correspondiente. Cuando detecta un error sintáctico, es decir, recibe un token que no espera, invoca a la funciónyyerror() y termina el proceso de análisis devolviendo un 1. La funciónyylex() lee el fichero de entrada para identificar los tokens descritos en el fichero de especificación correspondiente. Cada vez que la funciónyylex() devuelve un token al analizador sintáctico, si el token tiene un valor asociado, yylex() guarda ese valor en la variableyylval antes de terminar. Por ejemplo, un identificador de una variable, además de tener un número de token que lo identifica y distingue de otros tipos de tokens, también tiene asociado como valor o atributo, el lexema del identificador. Sin embargo, un paréntesis no tiene asociado ningún valor o atributo. La funciónyyparse() utiliza el valor de la variable yylval en las acciones de las reglas de la gramática. Prácticas de compiladores 2004-2005 6

Formato del fichero de especificación de Yacc/Bison (I) Estructura del fichero Un fichero de especificación de Yacc/Bison tiene tres secciones separadas por líneas que contienen el separador %%. sección de definiciones %{ %} /* delimitadores de código C */ %% sección de reglas %% sección de funciones de usuario Prácticas de compiladores 2004-2005 7 Formato del fichero de especificación de Yacc/Bison (II) Sección de definiciones Yacc/Bison (i) En esta sección se puede incorporar bloques de código C que se copiará literalmente en el fichero de salida, definir el tipo de la variable yylval, los símbolos (terminales y no terminales) de la gramática, el axioma de la gramática, y la asociatividad y precedencia de los operadores. Bloque de código C Este bloque contiene: definiciones de macros declaraciones de variables declaraciones de funciones directivas #include... que se van a utilizar en las acciones de las reglas gramaticales. El contenido de esta sección se copia literalmente al principio del fichero y.tab.c que genera Yacc/Bison. Prácticas de compiladores 2004-2005 8

Formato del fichero de especificación de Yacc/Bison (III) Declaración %union Sección de definiciones Yacc/Bison (ii) Por defecto, la variable yylval mediante la cual Lex/Flex le pasa a Yacc/Bison los valores semánticos de los tokens es de tipo int. Pero habitualmente, los valores semánticos de los tokens son de distintos tipos. Por ejemplo, un token de tipo identificador tiene un valor semático de tipochar*, mientras que un token de tipo constante numérica entera tiene un valor semántico de tipo int. Con la declaración %union se define indirectamente una estructuraunion de C con un campo para cada tipo de valor semántico. Por ejemplo, si los tipos de valores semánticos sonint ychar* se utiliza la siguiente declaración : %union { char* cadena int numero } Prácticas de compiladores 2004-2005 9 Formato del fichero de especificación de Yacc/Bison (IV) Sección de definiciones Yacc/Bison (iii) Declaración %token (i) Se utiliza para definir los simbolos no terminales (tokens) de la gramática. La forma más sencilla es: %token NOMBRE_TOKEN Una forma más completa es: %token <campo_union> NOMBRE_TOKEN Ejemplo: %token IF %token THEN... %token <cadena> ID %token <numero> NUM Desde Lex/Flex, los tokens cualificados se devolverán haciendo, por ejemplo: [A-Z]+ { yylval.identificador = yytext return ID } [0-9]+ { yylval.numero = atoi(yytext) return NUM } Prácticas de compiladores 2004-2005 10

Formato del fichero de especificación de Yacc/Bison (V) Declaración %token (ii) Sección de definiciones Yacc/Bison (iv) Por convenio, los nombres de los tokens se ponen en mayúsculas. Se pueden agrupar varios tokens en una linea si tienen el mismo tipo. Los tokens de un único carácter no es necesario declararlos, porque están declarados implícitamente en Ycc/Bison. Desde Lex/Flex, este tipo de tokens se devolverán haciendo, por ejemplo: + {return + } ( {return ( } {return } El número 0 está reservado para el fin de fichero. Lex/Flex hará lo siguiente: <<EOF>> {return 0 } Cuando se compila el fichero de especificación *.y se utiliza la opción -d, que fuerza a que Yacc/Bison genere el fichero y.tab.h que contiene las definiciones de los tokens. Si este fichero se incluye en la especificación de Lex/Flex, se consigue que Yacc/Bison y Lex/Flex compartan las definiciones de tokens. Prácticas de compiladores 2004-2005 11 Formato del fichero de especificación de Yacc/Bison (VI) Sección de definiciones Yacc/Bison (v) Ejemplo de fichero y.tab.h ejemplo.y %{ %} %union { char* cadena int numero } %token IF %token THEN %token ELSE %token <cadena> ID %token <numero> NUM %% %% Yacc/Bison -d y.tab.c y.tab.h typedef union { char* cadena int numero }YYSTYPE extern YYSTYPE yylval #define IF 257 #define THEN 258 #define ELSE 259 #define ID 260 #define NUM 261 ejemplo.l #include y.tab.h Prácticas de compiladores 2004-2005 12

Formato del fichero de especificación de Yacc/Bison (VII) Sección de definiciones Yacc/Bison (vi) Declaración %type Se utiliza cuando se ha hecho la declaración %union para especificar múltiples tipos de valores. Permite declarar el tipo de los símbolos no terminales. Lo no terminales a los que no se les asigna ningún valor a través de $$ no es necesario declararlos (ver sección de reglas de la gramática) La declaración es de la forma %type <campo_union> nombre_no_terminal Por convenio, los nombres de los no terminales se ponen en minúsculas. Se pueden agrupar varios no terminales en una linea si tienen el mismo tipo. Declaración %start Declara el axioma de la gramática. Si se omite la declaración, se asume que el axioma de la gramática es el primer no terminal de la sección de reglas de la gramática. La declaración es de la forma %start axioma Prácticas de compiladores 2004-2005 13 Formato del fichero de especificación de Yacc/Bison (VIII) Declaraciones %left y %right Sección de definiciones Yacc/Bison (vii) Permiten declarar la asociatividad de los operadores de la gramática. La declaración %left especifica asociativiadad por la izquierda. La declaración %right especifica asociativiadad por la derecha. La precedencia de los operadores queda establecida por el orden de aparición de las declaraciones de asociatividad en el fichero de especificación, siendo de menor precedencia en operador que antes se declara. Por ejemplo, las declaraciones: %left + - %left * / establecen que los cuatro operadores son asociativos por la izquierda, que + y - son de la misma precedencia, pero de menor que * y /. Prácticas de compiladores 2004-2005 14

Formato del fichero de especificación de Yacc/Bison (IX) Sección de reglas (i) Es la sección más importante del fichero de especificación. Contiene las reglas de la gramática escritas en un formato concreto y opcionalmente con acciones asociadas a las reglas. Formato de las reglas: simbolonoterminal: simb1 simb2 simbm [acción] si varias reglas tienen la misma parte izquierda se pueden agrupar simbolonoterminal: partederecha1 [acción1] partederecha2 [acción2] por claridad, se comentan las reglas lambda: simbolonoterminal: /* vacío */ [acción1] partederecha2 [acción2] Prácticas de compiladores 2004-2005 15 Formato del fichero de especificación de Yacc/Bison (X) Sección de reglas (ii) Ejemplo de especificación de reglas (sin acciones): Descripción BNF del lenguaje <declaration> ::= <mode> <idlist> Ejemplo.y declaration: mode idlist <mode> ::= bool int ref <mode> mode: BOOL INT REF mode <procedures> ::= <procedure><procedures>... procedures:... procedure procedures /* vacío */ Prácticas de compiladores 2004-2005 16

Formato del fichero de especificación de Yacc/Bison (XI) Sección de reglas (iii) Las acciones de las reglas: las acciones son un conjunto de instrucciones C encerradas entre llaves, y que se ejecutan cada vez que se reconoce una instancia de la regla. Normalmente se sitúan al final de la regla, aunque también se admiten en otras posiciones de la regla. La mayoría de las acciones trabajan con los valores semánticos de los símbolos de la parte derecha, accediendo a ellos mediante pseudo-variables del tipo $N, donde N representa la posición del símbolo. El valor semántico del símbolo no terminal de la parte izquierda de la regla se referencia con $$. El tipo del valor semántico de un símbolo es el que se le haya asociado mediante una declaración %token (terminales) o %type (no terminales). La acción por defecto es: Ejemplo: $$ = $1 exp:... exp + exp {$$ = $1 + $3} Prácticas de compiladores 2004-2005 17 Formato del fichero de especificación de Yacc/Bison (XII) Sección de funciones de usuario En esta sección se ubican todas las funciones de soporte: Funciones diseñadas por el usuario para ser utilizadas en las sección de reglas. Funciónyyerror() Cuandoyyparse() detecta un error sintáctico, es decir, recibe un token que no espera, invoca a la funciónyyerror(). Esta función tiene que ser proporcionada por el usuario, y se puede incorporar en esta sección del fichero de especificacióncalc.y (en Linux se puede no proporcionar ya que la proporciona la librería de Yacc/Bison). El prototipo de la función es: void yyerror(char* s) El único parámetro de la función es el mensaje del error sintáctico ocurrido. La versión mínima de esta función muestra por pantalla el mensaje que recibe como parámetro. El contenido de esta sección se copia literalmente en el fichero de salida. En aplicaciones grandes, es más conveniente agrupar todas las funciones de soporte en un fichero o conjunto de ficheros, en lugar de incluirlas en esta sección. Prácticas de compiladores 2004-2005 18