mexicano latifrons extinto europeo caracteristicas bonasus bisonte americano bison

latifrons - Cómo resolver la advertencia de Bison "... no tiene un tipo declarado"



bisonte extinto (2)

Como reflexión adicional, si quieres ser más explícito con tus reducciones (si estás haciendo una anotación de AST, esto puede ser útil) entonces puedes hacer tus punteros de valores de pila y luego manejar los valores de tipo por ti mismo. Al igual que los tipos escalares con:

struct myScalar { union { int num; char *id; char *float_lexeme; }payload; enum { TYPE_NUM, TYPE_IDENTIFIER, TYPE_FLOAT_CHAR } type; char *orig_lexeme; };

Y tiene un typedef y un valor scalar_val *val para la pila.

Cuando se mueve hacia front-ends de compiladores más complejos, puede ayudar a construir su AST así para que cuando recorra el árbol tenga mejores metadatos y también pueda aumentar la traducción con traducciones para tipos pre-semánticos. Luego se reduce a las producciones de su hoja como ID para mezclar el lexema en la carga útil escalar correcta.

No es una explicación completa, pero entiendes la idea.

Espero que esto ayude con sus futuros frontales de Bison / Lex y ...

Buena suerte

Ejecutando Bison en este archivo:

%{ #include <iostream> int yylex(); void yyerror(const char*); %} %union { char name[100]; int val; } %token NUM ID %right ''='' %left ''+'' ''-'' %left ''*'' %% exp : NUM {$$.val = $1.val;} | ID {$$.val = vars[$1.name];} | exp ''+'' exp {$$.val = $1.val + $3.val;} | ID ''='' exp {$$.val = vars[$1.name] = $3.val;} ; %%

Lleva a advertencias del tipo de:

advertencia: $$ de ''exp'' no tiene un tipo declarado.

¿Qué significa y cómo lo resuelvo?


La unión (% union) definida no está destinada a ser utilizada directamente. Por el contrario, debe decirle a Bison qué miembro de la unión se utiliza con qué expresión.

Esto se hace con la directiva% type .

Una versión fija del código es:

%{ #include <iostream> int yylex(); void yyerror(const char*); %} %union { char name[100]; int val; } %token NUM ID %right ''='' %left ''+'' ''-'' %left ''*'' %type<val> exp NUM %type<name> ID %% exp : NUM {$$ = $1;} | ID {$$ = vars[$1];} | exp ''+'' exp {$$ = $1 + $3;} | ID ''='' exp {$$ = vars[$1] = $3;} ; %%