Analizador sintáctico BISON

11
Analizador sintáctico BISON Laboratorio de Compiladores 1 Universidad de San Carlos de Guatemala.

description

manual de bison analizador sintactico, muytux.blogspot se encuentra ejemplos en el area de compiladores.

Transcript of Analizador sintáctico BISON

Page 1: Analizador sintáctico BISON

Analizador sintáctico BISON

Laboratorio de Compiladores 1

Universidad de San Carlos de Guatemala.

Page 2: Analizador sintáctico BISON

Historia de Bison Bison es un generador de analizadores

sintácticos de propósito general que convierte una descripción gramatical para una gramática independiente del contexto LALR(1) en un programa en C que analice esa gramática.

Bison fue escrito originalmente por Robert Corbett; Richard Stallman lo hizo compatible con Yacc.

Page 3: Analizador sintáctico BISON

El analizador de Bison lee una secuencia de tokens como entrada, y agrupa los tokens utilizando las reglas gramaticales. Si la entrada es válida, el resultado final es que la secuencia de tokens entera se reduce a una sola agrupación cuyo símbolo es el símbolo de arranque de la gramática. Si usamos una gramática para C, la entrada completa debe ser una `secuencia de definiciones y declaraciones'. Si no, el analizador informa de un error de sintaxis.

Page 4: Analizador sintáctico BISON

Un símbolo no terminal en la gramática formal se representa en la entrada de Bison como un identificador, similar a un identificador en C. Por convención, deberían estar en minúsculas, tales como ##expr##, ##stmt## o ##declaracion##.

La representación en Bison para un símbolo terminal se llama también un tipo de token. Los tipos de tokens también se pueden representar como identificadores al estilo de C. Por convención, estos identificadores deberían estar en mayúsculas para distinguirlos de los no terminales: por ejemplo, ##INTEGER##, ##IDENTIFICADOR##, ##IF## o ##RETURN##. 

El símbolo terminal ##error## se reserva para la recuperación de errores.

Page 5: Analizador sintáctico BISON

Para que sea útil, un programa debe hacer algo más que analizar la entrada; este debe producir también alguna salida basada en la entrada. En una gramática de Bison, una regla gramatical puede tener una acción compuesta de sentencias en C. Cada vez que el analizador reconozca una correspondencia para esa regla, se ejecuta la acción.

Cuando ejecuta Bison, usted le da un archivo de gramática de Bison como entrada. La salida es un programa fuente en C que analiza el lenguaje descrito por la gramática. Este archivo se denomina un analizador de Bison.

Page 6: Analizador sintáctico BISON

A parte de los nombres de tipo de token y los símbolos en las acciones que escriba, todos los nombres de variable y funciones usados en el archivo del analizador de Bison comienzan con `yy' o `YY'. Esto incluye las funciones de interfaz tales como la función del analizador léxico ##yylex##, la función de informe de errores ##yyerror## y la propia función del analizador ##yyparse##. Esto también incluye un gran número de identificadores utilizados para uso interno.

Page 7: Analizador sintáctico BISON

El fichero de entrada para la utilidad Bison es un archivo de gramática de Bison. La forma general de una gramática de Bison es la siguiente:

%{declaraciones en C%}

Declaraciones de Bison

%%Reglas gramaticales%%Código C adicional

Los `%%', `%{' y `%}' son signos de puntuación que aparecen en todo archivo de gramática de Bison para separar las secciones.

Page 8: Analizador sintáctico BISON

Las declaraciones en C podrían definir tipos y variables utilizadas en las acciones. Puede también usar comandos del preprocesador para definir macros que se utilicen ahí, y utilizar ###include## para incluir archivos de cabecera que realicen cualquiera de estas cosas.

%{#include "scanner.h"#include <iostream>#include <QString>#include <QTextEdit>extern int yylineno;extern int columna;extern char *yytext;%}

Page 9: Analizador sintáctico BISON

Las declaraciones de Bison declaran los nombres de los símbolos terminales y no terminales, y también podrían describir la precedencia de operadores y los tipos de datos.

……struct STRING{QString val;};%}%union{ char STR [256]; int * NUM; struct INT* ENTERO; struct STRING* STR2;}%token<STR> Niden%token Ncorchete%type<STR2> LISTA%left Nmas Nmenos%left Npor Ndiv

Page 10: Analizador sintáctico BISON

Las reglas gramaticales definen cómo construir cada símbolo no terminal a partir de sus partes.

%%K : K Npor K { $$=$1; $$->val=$$->val*$3->val; }|K Ndiv K { $$=$1; $$->val=$$->val/$3->val; }|K Nmenos K { $$=$1; $$->val=$$->val-$3->val; }|K Nmas K { $$=$1; $$->val=$$->val+$3->val; }|Nnum {$$=new INT; $$->val=$1; }%%

Page 11: Analizador sintáctico BISON

El código C adicional puede contener cualquier código C que desee utilizar. A menudo suele ir más subrutinas invocadas por las acciones en la reglas gramaticales. En un programa simple, todo el resto del programa puede ir aquí.