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 />

expseq1: exp<br />

| expseq1 ‘,’ exp<br />

;<br />

Es habitual escribir el comentario ‘/* vacío */’ en cada regla sin componentes.<br />

Una regla se dice recursiva cuando su no-terminal resultado aparezca también en su<br />

lado <strong>de</strong>recho. Casi todas las gramáticas <strong>de</strong> <strong>Bison</strong> hacen uso <strong>de</strong> la recursión, ya que es la<br />

única manera <strong>de</strong> <strong>de</strong>finir una secuencia <strong>de</strong> cualquier número <strong>de</strong> cosas. Consi<strong>de</strong>re esta<br />

<strong>de</strong>finición recursiva <strong>de</strong> una secuencia <strong>de</strong> una o más expresiones:<br />

expseq1: exp<br />

| expseq1 ‘,’ exp<br />

;<br />

Puesto que en el uso recursivo <strong>de</strong> expseq1 este es el símbolo situado más a la izquierda<br />

<strong>de</strong>l lado <strong>de</strong>recho, llamaremos a esto recursión por la izquierda. Por contraste, aquí se<br />

<strong>de</strong>fine la misma construcción utilizando recursión por la <strong>de</strong>recha:<br />

expseq1: exp<br />

| exp ‘,’ expseq1<br />

;<br />

Cualquier tipo <strong>de</strong> secuencia se pue<strong>de</strong> <strong>de</strong>finir utilizando ya sea la recursión por la<br />

izquierda o recursión por la <strong>de</strong>recha, pero <strong>de</strong>bería utilizar siempre recursión por la<br />

izquierda, porque pue<strong>de</strong> analizar una secuencia <strong>de</strong> elementos sin ocupar espacio <strong>de</strong> pila<br />

(es <strong>de</strong>cir, <strong>de</strong> forma mucho más eficiente en memoria). La recursión indirecta o mutua<br />

suce<strong>de</strong> cuando el resultado <strong>de</strong> la regla no aparece directamente en su lado <strong>de</strong>recho, pero<br />

aparece en las reglas <strong>de</strong> otros no terminales que aparecen en su lado <strong>de</strong>recho.<br />

Por ejemplo:<br />

expr: primario<br />

| primario ‘+’ primario<br />

;<br />

primario: constante<br />

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

;<br />

<strong>de</strong>fine dos no-terminales recursivos mutuamente, ya que cada uno hace referencia al<br />

otro.<br />

Semántica <strong>de</strong>l lenguaje<br />

Las reglas gramaticales para un lenguaje <strong>de</strong>terminan únicamente la sintaxis. La<br />

semántica viene <strong>de</strong>terminada por los valores semánticos asociados con varios tokens y<br />

agrupaciones, y por las acciones tomadas cuando varias agrupaciones son reconocidas.<br />

En un programa sencillo podría ser suficiente con utilizar el mismo tipo <strong>de</strong> datos para<br />

los valores semánticos <strong>de</strong> todas las construcciones <strong>de</strong>l lenguaje. Por <strong>de</strong>fecto <strong>Bison</strong><br />

utiliza el tipo int para todos los valores semánticos. Para especificar algún otro tipo,<br />

<strong>de</strong>fina YYSTYPE como una macro, <strong>de</strong> esta manera:<br />

#<strong>de</strong>fine YYSTYPE double<br />

Esta <strong>de</strong>finición <strong>de</strong> la macro <strong>de</strong>be ir en la sección <strong>de</strong> <strong>de</strong>claraciones en C <strong>de</strong>l fichero <strong>de</strong> la<br />

gramática.<br />

12

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

Saved successfully!

Ooh no, something went wrong!