Fundamentos de Yacc

10
FUNDAMENTOS DE YACC… LEXY LUCIN – S7K

Transcript of Fundamentos de Yacc

Page 1: Fundamentos de Yacc

FUNDAMENTOS DE YACC…

LEXY LUCIN – S7K

Page 2: Fundamentos de Yacc

CONCEPTOS BÁSICOS

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.

Page 3: Fundamentos de Yacc

El usuario de Yacc prepara una especificación que incluye: un conjunto de reglas que describen los

elementos de la entrada un código a ser invocado cuando una regla

es reconocida una o más rutinas para examinar la entrada

Page 4: Fundamentos de Yacc

PROCESO EN YACC

Luego Yacc convierte la especificación en una función en C que examina la entrada. Esta función, un parser, trabaja mediante la invocación de un analizador léxico que extrae tokens de la entrada.

Los tokens son comparados con las reglas de construcción de la entrada, llamadas reglas gramaticales.

Cuando una de las reglas es reconocida, el código provisto por el usuario para esa regla (una acción) es invocado.

Las acciones son fragmentos de código C, que pueden retornar valores y usar los valores retornados por otras acciones.

Page 5: Fundamentos de Yacc

ESCRIBIENDO UNA ESPECIFICACIÓN YACC

 Una especificación yacc describe una gramática libre de contexto que puede ser usada para generar un parser. Esta gramática tiene cuatro clases de elementos:

Tokens, que son un conjunto de símbolos terminales

Elementos sintácticos, que son un conjunto de símbolos no terminales

Reglas de producción que definen un símbolo no terminal (el lado izq.) en términos de una secuencia de no terminales y terminales (lado derecho)

Una regla start que reduce todos los elementos de la gramática a una sola regla.

Page 6: Fundamentos de Yacc

ALGUNAS ESPECIFICACIONES…

El nombre de un símbolo puede ser de cualquier longitud, consistiendo en letras, punto, underscore, y dígitos (en cualquier lugar excepto en la primera posición). Se distingue entre mayúsculas y minúsculas. Los nombres de símbolos no terminales van en minúsculas y los tokens en mayúsculas por convención.

Si la entrada no responde a la gramática, entonces el parser imprimirá el mensaje ¨syntax error¨. Este mensaje emitido por la rutina yyerror, que puede ser redefinida por el programador para proveer más información.

Page 7: Fundamentos de Yacc

EL FORMATO COMPLETO TIENE LOS SIGUIENTES ELEMENTOS:

%token nom_1_token_terminal..%start token_no_terminal_que_empieza_gramatica%%

%%void main(){if yyparse()==0println("Sin errores...")}void yyerror(char * m){println("Error",m)}

Sección De

declaraciones

Sección De

reglas

Sección De

código

Page 8: Fundamentos de Yacc

SECCIÓN DE DECLARACIONES:

La sección de declaraciones contiene información que afecta la operación de yacc. Esta sección usa varias palabras claves para definir tokens y sus características. Cada una de estas palabras claves es seguida por una lista de tokens o caracteres literales entre apóstrofes.

Page 9: Fundamentos de Yacc

SECCIÓN DE REGLAS:

La sección de reglas contiene las reglas de producción que describen la gramática. En general una regla consiste de uno o más conjuntos de tokens y no terminales con una acción opcional para cada conjunto de tokens.

Page 10: Fundamentos de Yacc

SECCIÓN DE CÓDIGO:

La sección de código C es opcional, pero puede contener cualquier código C provisto por el usuario. Allí se pueden especificar la rutina de análisis léxico yylex, una rutina main, o subrutinas usadas por acciones de la sección de reglas.

Tres rutinas son requeridas: main, yylex, y yyerror, aunque estas también pueden ser vinculadas externamente.

Se pueden usar comentarios como en C (/* ... */). Blancos, tabs, y newlines se ignoran.