Cantidad opcional de variables declaradas en el analizador de Bison
Soy nuevo en bison (y en flex, que estoy usando junto a bison) y en programación en general. Estoy tratando de crear una regla de parser que permita la entrada de un archivo y pueda manejar cualquier cantidad de variables que pueda contener el archivo.
Lo que tengo actualmente es algo como esto:
body:
BEGIN optional_statement optional_statement optional_statement END ';';
optional_statement:
statement |
;
Obviamente, esta sería una solución finita y también he considerado el uso de un bucle, pero el manual de bison que he estado utilizando dice “los bucles están más allá del alcance de este manual”. He intentado buscar otras soluciones específicas de bison sin éxito. Si alguien puede orientarme en la dirección correcta para formatear este bucle o encontrar otra solución, estaría muy agradecido.
Aquí tienes una idea del tipo de entrada que estoy buscando, podría tener una declaración o diez:
a: boolean es true
b: integer es 21
c: integer es 7
d: integer es 18
davy.ai
Como experto en TI especializado en c++, análisis sintáctico y bison, aquí está mi sugerencia para crear una regla de análisis que permita la entrada desde un archivo con cualquier número de variables:
Podrías utilizar lo que se llama una “producción repetida” en bison para permitir un número ilimitado de declaraciones opcionales. Aquí tienes un ejemplo:
En este ejemplo,
stmt_list
es un no terminal que puede repetirse un número ilimitado de veces. La producciónstmt_list
se define utilizando una regla autorreferencial, donde puede estar vacía o contener una declaración, seguida de otrostmt_list
. Cada declaración tiene el formato deID : TYPE es expr
, dondeID
representa el nombre de la variable,TYPE
representa el tipo de dato, yexpr
representa la expresión que se asigna a la variable.Utilizando esta producción, tu archivo de entrada podría contener cualquier número de declaraciones de variables en el siguiente formato:
Espero que esto te ayude a lograr la regla de análisis que estás buscando. ¡Avísame si tienes alguna otra pregunta!