Uso de la herramienta YACC

Documentos relacionados
JavaCC Parte I. 1 Compiladores / Guía VII / Ciclo Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores.

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

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

Generador de analizadores sintácticos BISON

Elementos de un programa en C

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

Generador de analizadores léxicos FLEX

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

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

Introducción a Flex y Bison

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Tema: Autómata de Pila

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

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

Funciones como Subprogramas en C++

Fundamentos de Programación 2017-I

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

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

2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 SUMA

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

El lenguaje C. 1. Identificadores, constantes y variables

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Programación. Test Autoevaluación Tema 3

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

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

Compiladores: Parsing ascendente

Tema 4. Operadores y Expresiones

Guía número 1. Métodos numéricos. Universidad de san buenaventura de Cali

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

Construcción de tablas de análisis sintáctico LL(1)

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

Tema: Excel Formulas, Funciones y Macros

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

Universidad Tecnológica de los Andes. Ing. Hesmeralda Rojas Enriquez [GUÍA RATIONAL ROSE] Usando UML

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

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

Estructuras de Datos Declaraciones Tipos de Datos

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

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

Programación Estructurada

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

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

Tema: Clases y Objetos en C#. Parte II.

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

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

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

Ecuaciones de primer grado o lineales

12 símbolos (13 si se incluye el espacio en blanco)

E Ú E +T T T Ú T * F F F Ú ( E ) NUM. Queremos calcular: Los pasos que seguiremos serán:

Procesadores de Lenguaje

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

: Algorítmica y Estructura de Datos I

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

UNIDAD DIDÁCTICA #1 CONTENIDO

UNIDAD DE APRENDIZAJE I

Las Etapas de la Compilación

TADs en C. Matías Bordese Algoritmos y Estructuras de Datos II - Laboratorio 2013

Programcaión Básica. Arreglos y Estructuras de Datos (2)

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

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

funciones printf scanf

Manual de turbo pascal

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

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

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

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

Lenguaje de Programación

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

Tema: Tabla de Símbolos

Operadores y Expresiones

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

TIPOS DE DATOS BASICOS EN LENGUAJE C

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

Tema: Herramientas UML, Análisis y diseño UML

Programación estructurada (Introducción a lenguaje C)

Taller de Informática I Dpto. Computación F.C.E. y N. - UBA 2010

Tema: Herramientas UML, Análisis y diseño UML

Tema 16: Tipos de datos estructurados en lenguaje C

Lenguaje de programación C. Introducción

Programación Básica. Martin Méndez Facultad de Ciencias Universidad Autónoma de San Luis Potosí

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

Preliminares. Tipos de variables y Expresiones

PROGRAMA INSTRUCCIONAL AUTOMATAS Y LENGUAJES FORMALES

Apuntadores en C y C++

Procesadores de Lenguaje

Tema: Generación de código intermedio

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

Expresiones y sentencias

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

5 centenas + 2 decenas + 8 unidades, es decir: = 528

YACC: El Compilador-Compilador. 9.1 Introducción

Vamos a profundizar un poco sobre los distintos tipos de datos que podemos introducir en las celdas de una hoja de cálculo

Tema 13: Apuntadores en C

Checks, Triggers y Excepciones en InterBase: validando desde la base de datos

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

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

DIPLOMADO. Evaluación de la Calidad de la práctica docente para la implementación del Nuevo Modelo Educativo en Escuelas de Ingeniería del I.P.N.

Principios de Computadoras II

Transcripción:

1 Compiladores / Guía VI / Ciclo 02-2016 Centro de Investigación y Transferencia de Tecnología Uso de la herramienta YACC Contenido Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores En la presente práctica se hace una introducción a la herramienta yacc, la cual servirá para generar analizadores sintácticos en el desarrollo de los compiladores. Objetivos Específicos Utilizar una distribución de Linux que proporcione una herramienta de generación de análisis sintáctico. Construir un analizador sintáctico haciendo uso de la herramienta yacc. Material y Equipo Guía de laboratorio N 5. Máquina Virtual Linux, distribución Bodhi. LXTerminal, Flex, yacc y Bison. Introducción Teórica Introducción YACC es una herramienta que sirve para generar un programa, capaz de analizar gramaticalmente una entrada dada por lex, a partir de una especificación. Esta especificación, debe contener los tokens reconocidos y los tipos de datos de los mismos si es que se ocupan para realizar operaciones sobre ellos, y una especificación de gramática en un formato similar a BNF (Backus Naus Form), que va desde el símbolo no terminal más general a cada una de las opciones terminales. Ejemplo: <Expresion> Numero + <Expresion> Numero - <Expresion> Numero En el ejemplo podemos ver que <Expresion> es un símbolo no terminal que está compuesto por un "Numero" terminal seguido de un símbolo '+' o '-' terminales seguido por un <Expresion> no terminal, que a su vez puede ser otro número u otra expresión más compleja. Una especificación yacc se divide en tres secciones diferentes de manera similar a lex, la de definiciones, la de reglas, y la de subrutinas, que van igualmente separadas por un '', mismas que pueden incluir código de C encerrado entre un y un %. %token y %type

2 Compiladores / Guía VI / Ciclo 02-2016 %token sirve para definir los tokens que hay, y si es necesario, el tipo de dato que usan, todos los tokens son tomados como símbolos terminales, %left y %right El siguiente paso, es definir el tipo de precedencia de nuestros tokens operadores, en este punto tenemos dos factores, la precedencia por sí misma, y la agrupación de los operadores. Precedencia La precedencia es asignada en orden inverso al que aparecen, es decir, el último operador declarado, tiene mayor precedencia que el anterior y así sucesivamente. Asociatividad %left y %right indican si el operador se agrupa a la derecha o a la izquierda, por ejemplo, en el caso de EXPO (Exponente) debe asociarse a la derecha, por que buscamos que se resuelva de ese modo, de derecha a izquierda, por ejemplo: Buscamos que 4^3^5^2^9 Sea evaluado asi : 4^(3^(5^(2^9))) Por lo contrario, las sumas y restas queremos resolverlas de izquierda a derecha: Buscamos que 4-3+5+2-9 sea evaluado así: (((4-3) +5) +2)-9 Usar este tipo de declaraciones es importante para disminuir la posibilidad de ambigüedades en el lenguaje generado. %start En algunos casos es conveniente indicarle a yacc cuál es el símbolo (no terminal) inicial a la hora de hacer el parseo, es decir, el símbolo que se trata de reducir, si esta opción no es especificada, yacc toma al primer símbolo de la sección de reglas como símbolo inicial. En nuestro ejemplo, se presentan ambos casos, nuestro símbolo inicial "Input" se encuentra al inicio del archivo y también está declarado como símbolo inicial. %start Input Reglas En esta parte finalmente llegamos a la definición de la gramática, acá podemos observar que cada símbolo se define con su nombre, seguido de dos puntos ":" seguidos de varios símbolos que conformaran su composición gramatical que, en caso de tener varias opciones, son separados por " " (OR) indicando que se tienen varias opciones para reducir ese símbolo y para terminar cada regla, un "". Ejemplo: Si tomamos la gramática que definimos al principio de esta sección: <Expresión> Numero + <Expresión>

3 Compiladores / Guía VI / Ciclo 02-2016 Numero - <Expresión> Numero Y la transformamos a una regla de yacc, se vería como esto: Expresión: NUMERO '+' Expresión {$$ = $1 + $3 NUMERO '-' Expresión {$$ = $1 - $3 NUMERO {$$ = $1 En el ejemplo ya transformado a una regla gramatical de yacc, podemos ver que ya se especifica que hacer con los símbolos de la gramática una vez que son resueltos en la parte de código de C. En este ejemplo, Expresión es el símbolo no terminal que se está definiendo de manera recursiva, el valor que tomara una vez resuelto es el valor asignado a la variable $$, que traducida a C es una variable mapeada al símbolo no terminal, $1, $2 y $3 son variables que son mapeadas al valor de los símbolos de cada línea de cada regla, estas son numeradas de izquierda a derecha. Ejemplo: En este segmento de regla: Expresión: NUMERO '+' Expresión Expresión equivale a $$ NUMERO equivale a $1 '+' equivale a $2 Y Expresión (la parte recursiva) equivale a $3 Procedimiento Ejemplo 1. Realizaremos una calculadora sencilla: Utilizando el mismo principio de la guía anterior vamos a crear el archivo example1.l #include <string.h> #include "y.tab.h" extern int intval % integer [0-9]+ nl \n [\t]+ {integer {nl {sscanf(yytext, "%d", &intval) return INTEGER {return NEWLINE

4 Compiladores / Guía VI / Ciclo 02-2016. {return yytext[0] Ahora, crearemos el archivo example.y #include <stdio.h> int intval extern char *yytext % %token INTEGER %token NEWLINE %left '+' '-' %left '*' %nonassoc UMINUS %start line /* simbolo sentencial */ line: line term term: NEWLINE expr NEWLINE {printf("%d\n", $1) error NEWLINE {yyerror("error en la expresion") expr: INTEGER {$$ = intval expr '+' expr {$$ = $1 + $3 expr '-' expr {$$ = $1 - $3 expr '*' expr {$$ = $1 * $3 '(' expr ')' {$$ = $2 '-' expr %prec UMINUS {$$ = - $2 main() { yyparse() yyerror(char *s) { printf("hubo un error : %s en el simbolo %c\n", s, yytext[0])

5 Compiladores / Guía VI / Ciclo 02-2016 Para compilar el archivo, se hace lo siguiente: NOTA: El ejercicio da una advertencia, pero funciona correctamente. Ejemplo 2. Calculadora con expresiones matemáticas complejas. Creando el archivo example2.l #include "y.tab.h" #include <stdlib.h> #include <stdio.h> % white [ \t]+ digit [0-9] integer {digit+ {white { /* Ignoramos espacios en blanco */ "exit" "quit" "bye" {printf("terminando programa\n")exit(0) {integer { yylval.dval=atof(yytext) return(number) "+" return(suma) "-" return(resta) "*" return(multi) "/" return(divide) "^" return(expo) "(" return(izq_paren) ")" return(dere_paren) "\n" return(end)

6 Compiladores / Guía VI / Ciclo 02-2016 Creando el archivo example2.y #include <stdio.h> #include <math.h> % %union{ double dval %token <dval> NUMBER %token SUMA RESTA MULTI DIVIDE EXPO %token IZQ_PAREN DERE_PAREN %token END %left SUMA RESTA %left MULTI DIVIDE %left NEG %right EXPO %type <dval> Expression %start Input Input: Line Input Line Line: END Expression END { printf("result: %f\n",$1) Expression: NUMBER { $$=$1 Expression SUMA Expression { $$=$1+$3 Expression RESTA Expression { $$=$1-$3 Expression MULTI Expression { $$=$1*$3 Expression DIVIDE Expression { $$=$1/$3 RESTA Expression %prec NEG { $$=-$2 Expression EXPO Expression { $$=pow($1,$3) IZQ_PAREN Expression DERE_PAREN { $$=$2 int yyerror(char *s) { printf("%s\n",s)

7 Compiladores / Guía VI / Ciclo 02-2016 int main(void) { yyparse() Para compilar: Ejercicios propuestos 1. Modificar el ejemplo 2 de manera que se pueda dividir. Además, se debe validar la división entre cero. Cuando exista una operación de ese tipo, por ejemplo, 8/0, el programa debe enviar un mensaje: Error al dividir. Investigación Complementaria 1. Agregar a la calculadora las funciones trigonométricas del seno y el coseno. Bibliografía Manuel Alfonseca Moreno, Marina de la Cruz Echeandía, Alfonso Ortega de la Puente, Estrella Pulido Cañabate, Compiladores: Teoría y Práctica, Pearson Educación, S.A., Madrid, 2006