Bison - Interfaz del Analizador en Lenguaje C
Tutorial creado por Charles Donnelly y Richard Stallman. Extraido de: http://es.tldp.org/Manuales-LuCAS/guides/bison-guide/bison-es-1.27.html
01 de Marzo de 2006
Lenguaje C
9 - Interfaz del Analizador en Lenguaje C
El analizador de Bison es en realidad una función en C llamada yyparse. Aquí describimos las convenciones de interfaz de yyparse y las otras funciones que éste necesita usar.
Tenga en cuenta que el analizador utiliza muchos identificadores en C comenzando con `yy' e `YY' para propósito interno. Si utiliza tales identificadores (a parte de aquellos en este manual) en una acción o en codigo C adicional en el archivo de la gramática, es probable que se encuentre con problemas.
Se llama a la función yyparse para hacer que el análisis comience. Esta función lee tokens, ejecuta acciones, y por último retorna cuando se encuentre con el final del fichero o un error de sintaxis del que no puede recuperarse. Usted puede también escribir acciones que ordenen a yyparse retornar inmediatamente sin leer más allá.
El valor devuelto por yyparse es 0 si el análisis tuvo éxito (el retorno se debe al final del fichero).
El valor es 1 si el análisis falló (el retorno es debido a un error de sintaxis).
En una acción, puede provocar el retorno inmediato de yyparse utilizando estas macros:
YYACCEPT Retorna inmediatamente con el valor 0 (para indicar éxito). YYABORT Retorna inmediatamente con el valor 1 (para indicar fallo).
La función del analizador léxico, yylex, reconoce tokens desde el flujo de entrada y se los devuelve al analizador. Bison no crea esta función automáticamente; usted debe escribirla de manera que yyparse pueda llamarla. A veces se hace referencia a la función como el scanner léxico.
En programas simples, yylex se define a menudo al final del archivo de la gramática de Bison. Si yylex se define en un archivo fuente por separado, necesitará que las definiciones de las macros de tipos de tokens estén disponibles ahí. Para hecer esto, utilice la opción `-d' cuando ejecute Bison, de manera que éste escribirá esas definiciones de macros en un archivo de cabecera por separado `nombre.tab.h' que puede incluir en otros ficheros fuente que lo necesiten. See section Invocando a Bison.
El valor que yylex devuelve debe ser un código numérico para el tipo de token que se ha encontrado, o 0 para el final de la entrada.
Cuando se hace referencia a un token en las reglas gramaticales con un nombre, ese nombre en el archivo del analizador se convierte en una macro de C cuya definición es el valor numérico apropiado para ese tipo de token. De esta manera yylex puede utilizar el nombre para indicar ese tipo. See section Símbolos, Terminales y No Terminales.
Cuando se hace referencia a un token en las reglas gramaticales por un caracter literal, el código numérico para ese caracter también es el código para el tipo de token. Así yylex puede simplemente devolver ese código de caracer. El caracter nulo no debe utilizarse de esta manera, porque su código es el cero y eso es lo que simboliza el final de la entrada.
Aquí hay un ejemplo mostrando estas cosas:
yylex ()
{
...
if (c EOF) /* Detecta el fin de fichero. */
return 0;
'+' || c '-')
return c; /* Asume que el tipo de token para `+' es '+'. */
'"'
&& strncmp (yytname[i] + 1, token_buffer,
strlen (token_buffer))
&& yytname[i][strlen (token_buffer) + 1]
}
La tabla yytname se genera sólo si se utiliza la declaración %token_table. See section Sumario de Declaraciones de Bison.
En un analizador ordinario (no reentrante), los valores semánticos del token deben almacenarse en la variable global yylval. Cuando esté usando un solo tipo de valores semánticos, yylval tiene ese tipo. Así, si el tipo es int (por defecto), podría escribir esto en yylex:
...
yylval = valor; /* Pone valor en la pila de Bison. */
return INT; /* Devuelve el tipo del token. */
...
Cuando esté utilizando varios tipos de datos, el tipo de yylval es una union compuesta a partir de la declaración %union (see section La Colección de Tipos de Valores). Así cuando almacene un valor de token, debe utilizar el miembro apropiado de la union. Si la declaración %union tiene el siguiente aspecto:
%union {
int intval;
double val;
symrec *tptr;
}
entonces el código en yylex podría ser así:
...
yylval.intval = valor; /* Pone el valor en la pila de Bison. */
return INT; /* Devuelve el tipo del token. */
...
Si está usando la propiedad `@n' (see section Propiedades Especiales para su Uso en Acciones) en acciones para seguir la pista de las posiciones en el texto de los tokens y agrupaciones, entonces debe proveer esta información en yylex. La función yyparse espera encontrar la posición en el texto de un token que se acaba de analizar en la variable global yylloc. Por ello yylex debe almacenar el dato apropiado en esa variable. El valor de yylloc es una estructura y solo tiene que inicializar los miembros que vayan a ser utilizados por las acciones. Los cuatro miembros se denominan first_line, first_column, last_line y last_column (1). Note que el uso de estas características hacen al analizador notablemente más lento.
El tipo de dato de yylloc tiene el nombre YYLTYPE.
Cuando utilice la declaración %pure_parser para solicitar un analizador puro, reentrante, las variables globales de comunicación yylval y yylloc no pueden usarse. (See section Un Analizador Puro (Reentrante).) En tales analizadores las dos variables globales se reemplazan por punteros pasados como parámetros a yylex. Debe declararlos como se muestra aquí, y pasar la información de nuevo almacenándola a través de esos punteros.
yylex (lvalp, llocp)
YYSTYPE *lvalp;
YYLTYPE *llocp;
{
...
*lvalp = valor; /* Pone el valor en la pila de Bison. */
return INT; /* Devolver el tipo del token. */
...
}
Si el archivo de la gramática no utiliza la construcción `@' para hacer referencia a las posiciones del texto, entonces el tipo YYLTYPE no será definido. En este caso, omitir el segundo argumento; yylex será llamado con solo un argumento.
Si utiliza un analizador reentrante, puede opcionalmente pasar información de parámetros adicional de forma reentrante. Para hacerlo, defina la macro YYPARSE_PARAM como un nombre de variable. Esto modifica la función yyparse para que acepte un argumento, de tipo void *, con ese nombre.
Cuando llame a yyparse, pase la dirección de un objeto, haciendo una conversión de tipos de la dirección a void *. Las acciones gramaticales pueden hacer referencia al contenido del objeto haciendo una conversión del valor del puntero a su tipo apropiado y entonces derreferenciándolo. Aquí hay un ejemplo. Escriba esto en el analizador:
%{
struct parser_control
{
int nastiness;
int randomness;
};
#define YYPARSE_PARAM parm
%}
Entonces llame al analizador de esta manera:
struct parser_control
{
int nastiness;
int randomness;
};
...
{
struct parser_control foo;
... /* Almacena los datos apropiados en foo. */
value = yyparse ((void *) &foo);
...
}
En las acciones gramaticales, utilice expresiones como ésta para hacer referencia a los datos:
((struct parser_control *) parm)->randomness
Si desea pasar los datos de parámetros adicionales a yylex, defina la macro YYLEX_PARAM como YYPARSE_PARAM, tal como se muestra aquí:
%{
struct parser_control
{
int nastiness;
int randomness;
};
#define YYPARSE_PARAM parm
#define YYLEX_PARAM parm
%}
Debería entonces definir yylex para que acepte un argumento adicional--el valor de parm. (Este hace uno o tres argumentos en total, dependiendo de si se le pasa un argumento de tipo YYLTYPE.) Puede declarar el argumento como un puntero al tipo de objeto apropiado, o puede declararlo como void * y acceder al contenido como se mostró antes.
Puede utilizar `%pure_parser' para solicitar un analizador reentrante sin usar también YYPARSE_PARAM. Entonces debería llamar a yyparse sin argumentos, como es usual.
El analizador de Bison detecta un error de análisis o error de sintaxis siempre que lea un token que no puede satisfacer ninguna regla sintáctica. Una acción en la gramática puede también explícitamente declarar un error, utilizando la macro YYERROR (see section Propiedades Especiales para su Uso en Acciones).
El analizador de Bison espera advertir del error llamando a una función de informe de errores denominada yyerror, que se debe proveer. Esta es llamada por yyparse siempre que encuentre un error sintáctico, y ésta recibe un argumento. Para un error de análisis, la cadena normalmente es "parse error".
Si define la macro YYERROR_VERBOSE en la sección de declaraciones de Bison (see section La Sección de Declaraciones de Bison), entonces Bison facilita una cadena de mensaje de error mas locuaz y específica que el simple "parse error". No importa qué definiciones utilice para YYERROR_VERBOSE, si ya lo define.
El analizador puede detectar otro tipo de error: desbordamiento de pila. Esto sucede cuando la entrada contiene construcciones que son profundamente anidadas. No parece que vaya a encontrarse con esto, ya que el analizador de Bison extiende su pila automáticamente hasta un límite muy largo. Pero si el desbordamiento sucede, yyparse llama a yyerror de la manera usual, excepto que la cadena del argumento es "parser stack overflow".
La siguiente definición es suficiente para programas simples:
yyerror (s)
char *s;
{
fprintf (stderr, "%s\n", s);
}
Después yyerror retorna a yyparse, este último intentará la recuperación de errores si ha escrito reglas gramaticales de recuperación de errores apropiadas (see section Recuperación de Errores). Si la recuperación es imposible, yyparse devolverá inmediatamente un 1.
La variable yynerrs contiene el número de errores sintácticos hasta ahora. Normalmente esta variable es global; pero si solicita un analizador puro (see section Un Analizador Puro (Reentrante)) entonces es una variable local a la que sólo las acciones pueden acceder.
Aquí hay una tabla de construcciones, variables y macros que son útiles en las acciones.
`$$' Actúa como una variable que contiene el valor semántico para la agrupación construida por la regla actual. See section Acciones. `$n' Actúa como una variable que contiene el valor semántico para la componente n-ésima de la regla actual. See section Acciones. `$<alttipo>$' Como $$ pero especifica la alternativa alttipo en la union especificada por la declaración %union. See section Tipos de Datos de Valores en Acciones. `$<alttipo>n' Como $n pero especifica la alternativa alttipo en la union especificada por la declaración %union. See section Tipos de Datos de Valores en Acciones. `YYABORT;' Retorna inmediatamente desde yyparse, indicando fallo. See section La Función del Analizador yyparse. `YYACCEPT;' Retorna inmediatamente desde yyparse, indicando éxito. See section La Función del Analizador yyparse. `YYBACKUP (token, valor);' Deshace el desplazamiento de un token. Esta macro se permite únicamente para reglas que reducen un valor sencillo, y sólo donde no hay un token de preanálisis. Esta inserta un token de preanálisis con un tipo de token token y valor semántico valor; entonces se descarta el valor que iba a ser reducido por esta regla. Si la macro se utiliza cuando no es válida, tal como cuando ya hay un token de preanálisis, entonces se produce un error de sintaxis con el mensaje `cannot back up' y realiza la recuperación de errores ordinaria. En cualquier caso, el resto de la acción no se ejecuta. `YYEMPTY' El valor almacenado en yychar cuando no hay un token de preanálisis. `YYERROR;' Produce un error de sintaxis inmediatamente. Esta sentencia inicia la recuperación de errores como si el analizador hubiese detectado un error; sin embargo, no se llama a yyerror, y no imprime ningún mensaje. Si quiere que imprima un mensaje de error, llame a yyerror explícitamente antes de la sentencia `YYERROR'. See section Recuperación de Errores. `YYRECOVERING' Esta macro representa una expresión que tiene el valor 1 cuando el analizador se está recuperando de un error de sintaxis, y 0 durante el resto del tiempo. See section Recuperación de Errores. `yychar' Variable que contiene el token actual de preanálisis. (En un analizador puro, esto es realmente una variable local dentro de yyparse.) Cuando no hay un token de preanálisis, el valor de YYEMPTY se almacena en la variable. See section Tokens de Preanálisis. `yyclearin;' Descarta el token actual de preanálisis. Esto es útil principalmente en las reglas de error. See section Recuperación de Errores. `yyerrok;' Deja de generar mensajes de error inmediatamente para los errores de sintaxis subsecuentes. Esto es útil principalmente en las reglas de error. See section Recuperación de Errores. `@n' Actúa como una variable estructurada conteniendo información de los números de línea y columna de la componente n-ésima de la regla actual. La estructura tiene cuatro miembros, así: struct {
int first_line, last_line;
int first_column, last_column;
};
De esta manera, para obtener el número de línea de comienzo del tercer componente, utilizaría `@3.first_line'. Para que los miembros de esta estructura contengan información válida, debe hacer que yylex facilite esta información para cada token. Si solo necesita de ciertos miembros, entonces yylex necesita únicamente rellenar esos miembros. El uso de esta característica hace al analizador notablemente más lento.
Tenga en cuenta que el analizador utiliza muchos identificadores en C comenzando con `yy' e `YY' para propósito interno. Si utiliza tales identificadores (a parte de aquellos en este manual) en una acción o en codigo C adicional en el archivo de la gramática, es probable que se encuentre con problemas.
La Función del Analizador yyparse
Se llama a la función yyparse para hacer que el análisis comience. Esta función lee tokens, ejecuta acciones, y por último retorna cuando se encuentre con el final del fichero o un error de sintaxis del que no puede recuperarse. Usted puede también escribir acciones que ordenen a yyparse retornar inmediatamente sin leer más allá.
El valor devuelto por yyparse es 0 si el análisis tuvo éxito (el retorno se debe al final del fichero).
El valor es 1 si el análisis falló (el retorno es debido a un error de sintaxis).
En una acción, puede provocar el retorno inmediato de yyparse utilizando estas macros:
YYACCEPT Retorna inmediatamente con el valor 0 (para indicar éxito). YYABORT Retorna inmediatamente con el valor 1 (para indicar fallo).
La Funcion del Analizador Léxico yylex
La función del analizador léxico, yylex, reconoce tokens desde el flujo de entrada y se los devuelve al analizador. Bison no crea esta función automáticamente; usted debe escribirla de manera que yyparse pueda llamarla. A veces se hace referencia a la función como el scanner léxico.
En programas simples, yylex se define a menudo al final del archivo de la gramática de Bison. Si yylex se define en un archivo fuente por separado, necesitará que las definiciones de las macros de tipos de tokens estén disponibles ahí. Para hecer esto, utilice la opción `-d' cuando ejecute Bison, de manera que éste escribirá esas definiciones de macros en un archivo de cabecera por separado `nombre.tab.h' que puede incluir en otros ficheros fuente que lo necesiten. See section Invocando a Bison.
Convención de Llamada para yylex
El valor que yylex devuelve debe ser un código numérico para el tipo de token que se ha encontrado, o 0 para el final de la entrada.
Cuando se hace referencia a un token en las reglas gramaticales con un nombre, ese nombre en el archivo del analizador se convierte en una macro de C cuya definición es el valor numérico apropiado para ese tipo de token. De esta manera yylex puede utilizar el nombre para indicar ese tipo. See section Símbolos, Terminales y No Terminales.
Cuando se hace referencia a un token en las reglas gramaticales por un caracter literal, el código numérico para ese caracter también es el código para el tipo de token. Así yylex puede simplemente devolver ese código de caracer. El caracter nulo no debe utilizarse de esta manera, porque su código es el cero y eso es lo que simboliza el final de la entrada.
Aquí hay un ejemplo mostrando estas cosas:
yylex ()
{
...
if (c
EOF) /* Detecta el fin de fichero. */
return 0;
...
if (c
'+' || c '-')
return c; /* Asume que el tipo de token para `+' es '+'. */
...
return INT; /* Devuelve el tipo del token. */
...
}
Este interfaz se ha diseñado para que la salida de la utilidad lex pueda utilizarse sin cambios como definición de yylex.
Si la gramática utiliza tokens de cadena literal, hay dos maneras por las que yylex puede determianr los códigos de tipo de token para estos:
- Si la gramática define nombres de token simbólicos como alias para los tokens de cadena literal, yylex puede utilizar estos nombres simbólicos como los demás. En este caso, el uso de tokens de cadena literal en el archivo de la gramática no tiene efecto sobre yylex.
- yylex puede encontrar el token multi-caracter en la tabla yytname. El índice del token en la tabla es el código del tipo de token. El nombre de un token multi-caracter se almacena en yytname con una comilla doble, los caracteres del token, y otra comilla doble. Los caracteres del token no son traducidos de ninguna forma; ellos aparecen textualmente en el contenido de la cadena dentro de la tabla. Aquí está el código para localizar un token en yytname, asumiendo que los caracteres del token se almacenan en token_buffer. for (i = 0; i < YYNTOKENS; i++)
{
if (yytname[i] != 0
&& yytname[i][0]
'"'
&& strncmp (yytname[i] + 1, token_buffer,strlen (token_buffer))
&& yytname[i][strlen (token_buffer) + 1]
'"' && yytname[i][strlen (token_buffer) + 2]
0) break;}
La tabla yytname se genera sólo si se utiliza la declaración %token_table. See section Sumario de Declaraciones de Bison.
Valores Semánticos de los Tokens
En un analizador ordinario (no reentrante), los valores semánticos del token deben almacenarse en la variable global yylval. Cuando esté usando un solo tipo de valores semánticos, yylval tiene ese tipo. Así, si el tipo es int (por defecto), podría escribir esto en yylex:
...
yylval = valor; /* Pone valor en la pila de Bison. */
return INT; /* Devuelve el tipo del token. */
...
Cuando esté utilizando varios tipos de datos, el tipo de yylval es una union compuesta a partir de la declaración %union (see section La Colección de Tipos de Valores). Así cuando almacene un valor de token, debe utilizar el miembro apropiado de la union. Si la declaración %union tiene el siguiente aspecto:
%union {
int intval;
double val;
symrec *tptr;
}
entonces el código en yylex podría ser así:
...
yylval.intval = valor; /* Pone el valor en la pila de Bison. */
return INT; /* Devuelve el tipo del token. */
...
Posiciones en el Texto de los Tokens
Si está usando la propiedad `@n' (see section Propiedades Especiales para su Uso en Acciones) en acciones para seguir la pista de las posiciones en el texto de los tokens y agrupaciones, entonces debe proveer esta información en yylex. La función yyparse espera encontrar la posición en el texto de un token que se acaba de analizar en la variable global yylloc. Por ello yylex debe almacenar el dato apropiado en esa variable. El valor de yylloc es una estructura y solo tiene que inicializar los miembros que vayan a ser utilizados por las acciones. Los cuatro miembros se denominan first_line, first_column, last_line y last_column (1). Note que el uso de estas características hacen al analizador notablemente más lento.
El tipo de dato de yylloc tiene el nombre YYLTYPE.
Convenciones de Llamada para Analizadores Puros
Cuando utilice la declaración %pure_parser para solicitar un analizador puro, reentrante, las variables globales de comunicación yylval y yylloc no pueden usarse. (See section Un Analizador Puro (Reentrante).) En tales analizadores las dos variables globales se reemplazan por punteros pasados como parámetros a yylex. Debe declararlos como se muestra aquí, y pasar la información de nuevo almacenándola a través de esos punteros.
yylex (lvalp, llocp)
YYSTYPE *lvalp;
YYLTYPE *llocp;
{
...
*lvalp = valor; /* Pone el valor en la pila de Bison. */
return INT; /* Devolver el tipo del token. */
...
}
Si el archivo de la gramática no utiliza la construcción `@' para hacer referencia a las posiciones del texto, entonces el tipo YYLTYPE no será definido. En este caso, omitir el segundo argumento; yylex será llamado con solo un argumento.
Si utiliza un analizador reentrante, puede opcionalmente pasar información de parámetros adicional de forma reentrante. Para hacerlo, defina la macro YYPARSE_PARAM como un nombre de variable. Esto modifica la función yyparse para que acepte un argumento, de tipo void *, con ese nombre.
Cuando llame a yyparse, pase la dirección de un objeto, haciendo una conversión de tipos de la dirección a void *. Las acciones gramaticales pueden hacer referencia al contenido del objeto haciendo una conversión del valor del puntero a su tipo apropiado y entonces derreferenciándolo. Aquí hay un ejemplo. Escriba esto en el analizador:
%{
struct parser_control
{
int nastiness;
int randomness;
};
#define YYPARSE_PARAM parm
%}
Entonces llame al analizador de esta manera:
struct parser_control
{
int nastiness;
int randomness;
};
...
{
struct parser_control foo;
... /* Almacena los datos apropiados en foo. */
value = yyparse ((void *) &foo);
...
}
En las acciones gramaticales, utilice expresiones como ésta para hacer referencia a los datos:
((struct parser_control *) parm)->randomness
Si desea pasar los datos de parámetros adicionales a yylex, defina la macro YYLEX_PARAM como YYPARSE_PARAM, tal como se muestra aquí:
%{
struct parser_control
{
int nastiness;
int randomness;
};
#define YYPARSE_PARAM parm
#define YYLEX_PARAM parm
%}
Debería entonces definir yylex para que acepte un argumento adicional--el valor de parm. (Este hace uno o tres argumentos en total, dependiendo de si se le pasa un argumento de tipo YYLTYPE.) Puede declarar el argumento como un puntero al tipo de objeto apropiado, o puede declararlo como void * y acceder al contenido como se mostró antes.
Puede utilizar `%pure_parser' para solicitar un analizador reentrante sin usar también YYPARSE_PARAM. Entonces debería llamar a yyparse sin argumentos, como es usual.
La Función de Informe de Errores yyerror
El analizador de Bison detecta un error de análisis o error de sintaxis siempre que lea un token que no puede satisfacer ninguna regla sintáctica. Una acción en la gramática puede también explícitamente declarar un error, utilizando la macro YYERROR (see section Propiedades Especiales para su Uso en Acciones).
El analizador de Bison espera advertir del error llamando a una función de informe de errores denominada yyerror, que se debe proveer. Esta es llamada por yyparse siempre que encuentre un error sintáctico, y ésta recibe un argumento. Para un error de análisis, la cadena normalmente es "parse error".
Si define la macro YYERROR_VERBOSE en la sección de declaraciones de Bison (see section La Sección de Declaraciones de Bison), entonces Bison facilita una cadena de mensaje de error mas locuaz y específica que el simple "parse error". No importa qué definiciones utilice para YYERROR_VERBOSE, si ya lo define.
El analizador puede detectar otro tipo de error: desbordamiento de pila. Esto sucede cuando la entrada contiene construcciones que son profundamente anidadas. No parece que vaya a encontrarse con esto, ya que el analizador de Bison extiende su pila automáticamente hasta un límite muy largo. Pero si el desbordamiento sucede, yyparse llama a yyerror de la manera usual, excepto que la cadena del argumento es "parser stack overflow".
La siguiente definición es suficiente para programas simples:
yyerror (s)
char *s;
{
fprintf (stderr, "%s\n", s);
}
Después yyerror retorna a yyparse, este último intentará la recuperación de errores si ha escrito reglas gramaticales de recuperación de errores apropiadas (see section Recuperación de Errores). Si la recuperación es imposible, yyparse devolverá inmediatamente un 1.
La variable yynerrs contiene el número de errores sintácticos hasta ahora. Normalmente esta variable es global; pero si solicita un analizador puro (see section Un Analizador Puro (Reentrante)) entonces es una variable local a la que sólo las acciones pueden acceder.
Propiedades Especiales para su Uso en Acciones
Aquí hay una tabla de construcciones, variables y macros que son útiles en las acciones.
`$$' Actúa como una variable que contiene el valor semántico para la agrupación construida por la regla actual. See section Acciones. `$n' Actúa como una variable que contiene el valor semántico para la componente n-ésima de la regla actual. See section Acciones. `$<alttipo>$' Como $$ pero especifica la alternativa alttipo en la union especificada por la declaración %union. See section Tipos de Datos de Valores en Acciones. `$<alttipo>n' Como $n pero especifica la alternativa alttipo en la union especificada por la declaración %union. See section Tipos de Datos de Valores en Acciones. `YYABORT;' Retorna inmediatamente desde yyparse, indicando fallo. See section La Función del Analizador yyparse. `YYACCEPT;' Retorna inmediatamente desde yyparse, indicando éxito. See section La Función del Analizador yyparse. `YYBACKUP (token, valor);' Deshace el desplazamiento de un token. Esta macro se permite únicamente para reglas que reducen un valor sencillo, y sólo donde no hay un token de preanálisis. Esta inserta un token de preanálisis con un tipo de token token y valor semántico valor; entonces se descarta el valor que iba a ser reducido por esta regla. Si la macro se utiliza cuando no es válida, tal como cuando ya hay un token de preanálisis, entonces se produce un error de sintaxis con el mensaje `cannot back up' y realiza la recuperación de errores ordinaria. En cualquier caso, el resto de la acción no se ejecuta. `YYEMPTY' El valor almacenado en yychar cuando no hay un token de preanálisis. `YYERROR;' Produce un error de sintaxis inmediatamente. Esta sentencia inicia la recuperación de errores como si el analizador hubiese detectado un error; sin embargo, no se llama a yyerror, y no imprime ningún mensaje. Si quiere que imprima un mensaje de error, llame a yyerror explícitamente antes de la sentencia `YYERROR'. See section Recuperación de Errores. `YYRECOVERING' Esta macro representa una expresión que tiene el valor 1 cuando el analizador se está recuperando de un error de sintaxis, y 0 durante el resto del tiempo. See section Recuperación de Errores. `yychar' Variable que contiene el token actual de preanálisis. (En un analizador puro, esto es realmente una variable local dentro de yyparse.) Cuando no hay un token de preanálisis, el valor de YYEMPTY se almacena en la variable. See section Tokens de Preanálisis. `yyclearin;' Descarta el token actual de preanálisis. Esto es útil principalmente en las reglas de error. See section Recuperación de Errores. `yyerrok;' Deja de generar mensajes de error inmediatamente para los errores de sintaxis subsecuentes. Esto es útil principalmente en las reglas de error. See section Recuperación de Errores. `@n' Actúa como una variable estructurada conteniendo información de los números de línea y columna de la componente n-ésima de la regla actual. La estructura tiene cuatro miembros, así: struct {
int first_line, last_line;
int first_column, last_column;
};
De esta manera, para obtener el número de línea de comienzo del tercer componente, utilizaría `@3.first_line'. Para que los miembros de esta estructura contengan información válida, debe hacer que yylex facilite esta información para cada token. Si solo necesita de ciertos miembros, entonces yylex necesita únicamente rellenar esos miembros. El uso de esta característica hace al analizador notablemente más lento.
Valora este capítulo:
Autor y licencia de 'Bison - Interfaz del Analizador en Lenguaje C'
|
Opiniona sobre 'Bison - Interfaz del Analizador en Lenguaje C' (1)
Tu nombre debe tener tres caracteres como mínimo.
Es necesario que te des de alta con una cuenta de correo válida.
Es necesario que te des de alta con una cuenta de correo válida.
El contenido del título de tu opinión debe tener tres caracteres como mínimo.
Es obligatorio que selecciones una valoración del recurso.
El contenido del comentario de tu opinión debe tener tres caracteres como mínimo.
Opina sobre este tutorial |
Wikis relacionados con 'Bison - Interfaz del Analizador en Lenguaje C'
Bison es un generador de analizadores sintácticos de propósito general que convierte una descripción gramatical...
Más »
Este es el diario de Peter Class sobre sus dias aprendizaje de una disciplina de...
Más »
Como es sabido, el concepto de función metalingüística y su ámbito de aplicación han quedado...
Más »
En los años setenta convergen en España una serie de discursos vinculados a conceptos de...
Más »
XML es un metalenguaje, es decir, un lenguaje hecho para poder construir otros lenguajes con...
Más »

