27.08.2013 Views

documentación

documentación

documentación

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.

variedad de tareas, incluyendo producir salidas o alterar variables externas. Frecuentemente, la<br />

acción actúa sobre el valor de los tokens de la construcción.<br />

El analizador léxico asigna el valor de cada token a la variable externa yylval. Yacc provee<br />

una notación posicional, $n, para acceder al valor del enésimo token en una expresión:<br />

expr: NUM ´+´ NUM { printf (¨%d¨, $1 + $3); }<br />

En este caso, la acción imprime la suma del valor del primero y tercer token. El valor<br />

retornado por una acción puede ser asignado a la variable ¨$$¨. Veamos el siguiente ejemplo:<br />

expr: ID { $$ = $1; }<br />

| ´(´ expr ´)´ { $$ = $2; }<br />

;<br />

La primera acción es invocada cuando se reconoce ¨ID¨, y retorna el valor del token ID<br />

como el valor de la regla expr. Realmente, esta el la acción por defecto, y puede ser omitida<br />

opcionalmente. La segunda acción selecciona el valor de expr que es el segundo elemento en la<br />

construcción.<br />

Tokens<br />

La función básica de la rutina léxica es detectar un token y retornar un número de token a la<br />

rutina del parser que llamó a aquélla. El número de token es definido por un símbolo que el<br />

parser usa para identificar un token. Además, la rutina léxica puede pasar el valor real del token<br />

mismo.<br />

Las acciones de la especificación Lex consiste de sentencias C que retornan el número de<br />

token y su valor. Los números de token son definidos por Yacc cuando éste procesa los tokens<br />

declarados en la especificación Yacc. La sentencia #define es usada para definir los números de<br />

tokens:<br />

#define NUMERO 257<br />

Estas definiciones son ubicadas en el archivo y_tab.c, junto con la rutina yyparse. (Cada<br />

carácter ASCII es definido como un token cuyo número es su valor ASCII (0 a 256); así, los<br />

tokens definidos por el usuario comienzan en 257). El parser y el léxico deben usar el mismo<br />

conjunto de símbolos para identificar tokens; por lo tanto el léxico debe tener acceso a los<br />

símbolos definidos por el parser. Una forma de hacer esto es decir a Yacc, mediante la opción<br />

–d) que cree el archivo de encabezamiento y_tab.h que puede ser incluido en la especificación<br />

Lex. Por supuesto, se podría definir explícitamente estos símbolos en la especificación Lex,<br />

asegurándose que se correspondan con los números de tokens asignados en Yacc.<br />

Para retornar el número de token en una acción, se debe usar la sentencia return. Por<br />

ejemplo, la siguiente regla que aparea cualquier número y la acción retorna el token NUMERO:<br />

[0-9] + { return NUMERO; }<br />

Para pasar el valor del token al parser, Lex crea una variable externa llamada yytext que<br />

contiene la cadena de caracteres que son reconocidas por la expresión regular. Una variable<br />

externa llamada yylval es seteada por Yacc para pasar el valor del token desde el analizador<br />

léxico al parser. El tipo de yylval es int, por defecto. Por lo tanto, para asignar el valor de yytext<br />

a yylval, se debe convertir el valor desde una string a un int. Se puede cambiar el tipo de yylval<br />

o, como se verá, definir una unión de tipos de datos múltiples para yylval.<br />

4

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

Saved successfully!

Ooh no, something went wrong!