10.05.2013 Views

Introducción a Flex y Bison - Universidad de Zaragoza

Introducción a Flex y Bison - Universidad de Zaragoza

Introducción a Flex y Bison - Universidad de Zaragoza

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Introducción</strong> a <strong>Flex</strong> y <strong>Bison</strong><br />

La Colección <strong>de</strong> Tipos <strong>de</strong> Valores<br />

La <strong>de</strong>claración %union especifica la colección completa <strong>de</strong> posibles tipos <strong>de</strong> datos para<br />

los valores semánticos. La palabra clave %union viene seguida <strong>de</strong> un par <strong>de</strong> llaves<br />

conteniendo lo mismo que va <strong>de</strong>ntro <strong>de</strong> una union en C.<br />

Por ejemplo:<br />

%union {<br />

double val;<br />

int valInt;<br />

}<br />

Esto dice que los dos tipos <strong>de</strong> alternativas son double y int. Se les ha dado los<br />

nombres val y valInt; estos nombres se utilizan en las <strong>de</strong>claraciones <strong>de</strong> %token y<br />

%type para tomar uno <strong>de</strong> estos tipos para un símbolo terminal o no terminal.<br />

Note que, a diferencia <strong>de</strong> hacer una <strong>de</strong>claración <strong>de</strong> una union en C, no se escribe un<br />

punto y coma <strong>de</strong>spués <strong>de</strong> la llave que cierra.<br />

Símbolos No Terminales<br />

Cuando utilice %union para especificar varios tipos <strong>de</strong> valores, <strong>de</strong>be <strong>de</strong>clarar el tipo <strong>de</strong><br />

valor <strong>de</strong> cada símbolo no terminal para los valores que se utilicen. Esto se hace con una<br />

<strong>de</strong>claración %type, como esta:<br />

%type noterminal...<br />

Aquí noterminal es el nombre <strong>de</strong> un símbolo no terminal, y tipo es el nombre dado en la<br />

%union a la alternativa que <strong>de</strong>see. Pue<strong>de</strong> dar cualquier número <strong>de</strong> símbolos no<br />

terminales en la misma <strong>de</strong>claración %type, si tienen el mismo tipo <strong>de</strong> valor. Utilice<br />

espacios para separar los nombres <strong>de</strong> los símbolos.<br />

Pue<strong>de</strong> también <strong>de</strong>clarar el tipo <strong>de</strong> valor <strong>de</strong> un símbolo terminal. Para hacer esto, utilice<br />

la misma construcción en una <strong>de</strong>claración para el símbolo terminal. Todos las<br />

clases <strong>de</strong> <strong>de</strong>claraciones <strong>de</strong> tipos permiten .<br />

El Símbolo Inicial<br />

<strong>Bison</strong> asume por <strong>de</strong>fecto que el símbolo inicial para la gramática es el primer no<br />

terminal que se encuentra en la sección <strong>de</strong> especificación <strong>de</strong> la gramática. El<br />

programador podría anular esta restricción con la <strong>de</strong>claración %start así:<br />

%start símboloNoTerminal<br />

Prece<strong>de</strong>ncia <strong>de</strong> operadores<br />

Consi<strong>de</strong>re el siguiente fragmento <strong>de</strong> gramática ambigua (ambigua porque la entrada ‘1<br />

- 2 * 3’ pue<strong>de</strong> analizarse <strong>de</strong> dos maneras):<br />

expr: expr ‘-’ expr<br />

| expr ‘*’ expr<br />

| ‘(‘ expr ‘)’<br />

...<br />

;<br />

16

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!