2010-11-26 12 views
3

salut im confus sur la façon d'obtenir un char * quand je lis un jeton spécifique ... je regarde dans différents sites et ils fournissent des suggestions, mais pas complète, je veux dire, par exemple yylval et la déclaration yytext est manquant ou comment transformer les types, etcutilisation yylval dans le bison pour récupérer une chaîne

Qu'est-ce que le besoin dans le fichier. De quoi a besoin le fichier .y?

Ce que je

dans le fichier .L:

{WORD}  { yylval = strdup(yytext);return T_ValidWord;} 

dans le fichier .y:

%union{ 
    char *str; 
} 

%token<str> T_ValidWord 

%% 

element: 
T_OpenTag T_ValidWord ele1 {printf("%s", $2);} 
; 

L'erreur:

xml.lex: In function ‘yylex’: 
xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’ 

Autre chose plus cela m'a troublé: Dans certains endroits que je vois dans le manuel du bison

yylval->something = yytext 
yylval.something = yytext 
yylval = yytext 

dire que yylval est une macro, je comprends qu'une macro est un texte remplacé par un autre texte, mais dans cette situation, je ne comprends vraiment pas.

Répondre

9

yylval est une union de type YYSTYPE. Modifiez votre affectation dans le scanner à yylval.str = strdup(yytext).

yylval est une union que vous pouvez déclarer ou que le bison déclarera automatiquement. Le yylval par défaut de Bison est essentiellement inutile. Vous déclarez yylval en utilisant %union { ... } dans votre analyseur, car vous devrez peut-être renvoyer d'autres valeurs du scanner à l'analyseur. Par exemple, lorsque vous faites correspondre un numéro dans votre scanner, vous devez renvoyer un jeton comme T_NUM. Mais vous avez probablement aussi besoin de la valeur de ce nombre, qui est là où yylval est utile. En utilisant yylval, si vous avez un champ entier, vous pouvez simplement faire yylval.num = atoi(yytext) à l'intérieur de votre scanner, puis utiliser ce champ num dans l'analyseur. Yytext est un tableau de caractères qui agit comme un tampon pour l'entrée en cours d'analyse. Vous ne pouvez pas déclarer yytext, et vous non plus. Lorsque vous utilisez bison pour compiler l'analyseur dans un fichier .tab.c, utilisez les indicateurs bison -d -t pour les symboles de débogage et le fichier d'en-tête. Le fichier d'en-tête s'appellera * .tab.h. Incluez-le dans votre scanner, vous n'avez donc qu'à déclarer les noms de jetons une seule fois et utiliser correctement yylval.

+0

ouyea, merci beaucoup, quelle bonne réponse :) – mjsr