2009-11-22 2 views
5

J'ai besoin d'utiliser flex et bison pour analyser du code.bison YYSTYPE: Essayer d'utiliser char *

Le type par défaut de YYSTYPE est int, même si je ne l'ai jamais déclaré comme tel. Est-ce un défaut de Bison?

Cela m'aiderait beaucoup à retransmettre des chaînes. Je lis ceci: How to solve Bison warning "... has no declared type" Cela ressemble à une bonne approche. (Je n'ai pas encore besoin de toute la puissance d'un syndicat, juste la partie char *, mais je pourrais aussi bien utiliser le syndicat car cela pourrait être utile plus tard.)

Ça ne marche pas pour moi. Je reçois ces erreurs:

y:111.37-38: $1 of `ConstExpression' has no declared type 
y:113.34-35: $1 of `ConstFactor' has no declared type 
y:114.35-36: $1 of `ConstFactor' has no declared type 
y:119.34-35: $1 of `Type' has no declared type 
y:109.23-48: warning: type clash on default action: <str> != <> 
y:115.23-27: warning: type clash on default action: <str> != <> 
[...more of the same snipped...] 

Voici les déclarations de mon dossier de grammaire y:

%union { 
    char *str; 
} 

%type<str> ConstExpression ConstFactor Type 

Voici une ligne de mon fichier .l:

[a-zA-Z]+[a-zA-Z0-9]* { yylval.str = strdup(yytext); return yident;} 

Que dois-je besoin faire pour résoudre les erreurs?

+1

pensez-vous sérieusement les gens peuvent déboguer votre fichier de grammaire sans le voir ? –

+6

@Kinopiko, avez-vous sérieusement critiqué cela parce qu'il ne s'est pas contenté de coller tous ses devoirs et de dire «Montrez-moi le codez»? Est-ce que ça t'aurait tué, juste pour avoir dit "j'ai besoin de plus d'informations, s'il te plaît, affiche le dossier complet de la grammaire" ou quelque chose du genre? – steveha

+1

@Kinopiko, quand il affichera les informations que vous avez demandées, allez-vous annuler votre downvote? Cela semble juste dur. – steveha

Répondre

6

En fait, je suis sûr que je sais ce qui ne va pas sans voir la grammaire.

Il est également nécessaire de déclarer les types de symboles de terminal, car ils peuvent renvoyer une valeur sémantique et la retournent souvent. Pensez à des choses comme ID et NUMBER, qui ont des données yyval. Mais yacc n'a aucun moyen de savoir si c'est juste un 'x' ou quelque chose de plus, et l'action par défaut dans une règle est: $$ = $1

Par exemple, la grammaire suivante passe très bien par yacc, mais essayez de supprimer une plus plus des symboles de l'%type ci-dessous:

%union { 
    char *s; 
} 

%type <s> r1 r2 'x' 

%% 

r1: r2; 

r2: 'x' { printf("%s\n", $1); }; 
3

vous avez probablement besoin juste de définir des types pour vos jetons dans le fichier yacc

%token<str> yident 
+0

Je pense que c'est correct - Si vous renvoyez un char * dans le fichier lex, vous n'utilisez pas% type, qui est pour bison les types... – alternative