Uso de yacc

Solo disponible en BuenasTareas
  • Páginas : 11 (2588 palabras )
  • Descarga(s) : 0
  • Publicado : 17 de febrero de 2011
Leer documento completo
Vista previa del texto
Tema

8

YACC (Generador de analizadores sintácticos)

8.1 Generadores de analizadores sintácticos. 8.2 Utilización de YACC. 8.3 Especificación YACC. 8.3.1 Declaración de símbolos. 8.3.2 Reglas gramaticales. 8.3.3 Tratamiento de la ambigüedad. 8.3.4 Tratamiento de errores.

Bibliografía básica Alfred V. Aho, Ravi Sethi, Jffrey D. Ullman Compiladores. Principios, técnicas y herramientas.Addison-Wesley Iberoamericana 1990. [Levi92] J.R. Levine, T. Manson, D. Brown Lex & Yacc. O’Reilly & Associates, Inc. 1992. [Benn90] J.P. Bennet Introduction to compiliing techniques: A first course using ANSI C, LEX and YACC. Mc Graw-Hill 1990. [Aho90]

1

Generadores de analizadores sintácticos.

Gramática independiente del contexto

Analizador sintáctico dirigido por tabla (LL, LR)Especificación de la gramática

Generador de analizadores sintácticos

Programa de control Tabla de análisis sintáctico

Generador de analizadores sintácticos: YACC
• Análisis sintáctico ascendente, basado en gramáticas LALR.

• Necesita una rutina léxica (yylex obtenido medianta LEX).

2

YACC
(Yet Another Compilers-Compiler)
Generador de analizadores sintácticos

Estructura delfichero de especificaciones para el Yacc:

{Declaraciones de los símbolos} %% Reglas gramaticales + {Acciones} %% {Procedimientos del usuario}

Se pueden incluir comentarios con el siguiente formato:

/* cero o más caracteres */

3

Declaraciones de símbolos En esta zona tenemos:
• Código en C, opcional (Ejemplo: declaraciones de variables e

inclusión de ficheros).
%{ %} /* códigoC */

• Definición del símbolo (no terminal) inicial de la gramática: %start nombre_del_simbolo_inicial • Declaraciones de todos los nombres de símbolos (terminales) que utiliza el lenguaje, para ello podemos usar: a) Para todos los nombres de los símbolos (terminales): %token nombre_simbolo1 nombre_simbolo2... Ejemplo 1.
%token NUMERO DIGITO %token ‘+’ ‘-‘ ‘*’ ‘&’ ‘|’ ‘%’ ‘/’

b) Para losnombres de los símbolos que representan operadores:
%left op: asociatividad a la izquierda (Ej. [X op Y] op Z). %right op: asociatividad a la derecha (Ej. X op [Y op Z]). %nonassoc op: sin asociatividad (Ej. Lo anterior sería error). %prec simbolo: cambio de precedencia. Usado en símbolos que pueden disponer de una doble precedencia según el contexto.

4

Reglas gramaticales El formato generalde una regla gramatical es: A : CUERPO ; Donde A es el nombre de un símbolo no terminal (o estructura sintáctica), CUERPO es una secuencia de nombres de símbolos y/o nombres de símbolos no terminales y/o literales, que indican la estructura sintáctica del símbolo no terminal A. Ejemplo 2.
A A A : : : B C D ; E F ; G ;

Cuando un mismo símbolo no terminal tiene varias reglas podemos usar ‘|’para separar las distintas alternativas y representarlas en una sola regla. Ejemplo 3.
A : | | B C D E F G ;

5

ENTORNO DEL YACC. Especificación Yacc

YACC

Función de análisis sintáctico. Y_TAB.C (Byacc) y.tab.c (Yacc de UNIX) Define una función yyparse() 0 si el análisis es correcto. 1 si existe un error. Para el analizador sintáctico hemos de añadir las funciones: main(), yylex() yyyerror() Por ejemplo: main () { yyparse();}

void yyerror (char *s) { printf ("%s\n", s); }
6

Opciones en la llamada del Yacc BYACC [opciones] nombre_del_fichero_de_especificaciones. -v genera la tabla de análisis sintáctico en el fichero y.out.

-b prefijo

permite cambiar el prefijo y del nombre del fichero de salida por el especificado.

-t

permite realizar un "debugging" delanálisis sintáctico.

-d

genera el fichero de cabecera y_tab.h, que contiene la definición de los símbolos (tokens).

-r

genera dos ficheros de salida, y_code.c que contiene el código y y_tab.c que contiene la tabla de análisis.

7

Analizador de léxico Para realizar la función del analizador de léxico, el YACC utiliza una función que devuelve un entero denominada yylex(), cuyo valor...
tracking img