2010-11-26 11 views
3

Hallo ich bin verwirrend über, wie man ein char * wenn ich ein bestimmtes Token ... Ich schaue in verschiedenen Websites und sie bieten Vorschläge, aber nicht vollständig, ich meine, zum Beispiel yylval und yytext deklaration fehlt oder wie die typen zu transformieren, etc.Yylval in Bison verwenden, um eine Zeichenfolge wiederherzustellen

Was ist in .l datei brauchen? Was ist in .y Datei erforderlich?

Was ich habe

in der Datei .L:

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

in der .y-Datei:

%union{ 
    char *str; 
} 

%token<str> T_ValidWord 

%% 

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

Der Fehler:

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

Andere Sache mehr Das verwirrte mich:iAn einigen Stellen sehen

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

Im Handbuch des Bisons sagt, dass yylval ein Makro ist, verstehe ich, dass ein Makrotext für anderen Text ersetzt ist, aber in dieser Situation ich es wirklich nicht bekommen.

Antwort

9

Yylval ist eine Union Typ YYSTYPE. Ändern Sie Ihre Zuordnung im Scanner zu yylval.str = strdup(yytext).

yylval ist eine Union, die Sie entweder deklarieren können oder die der Bison automatisch deklariert. Bisons Standard Yylval ist im Grunde nutzlos. Sie deklarieren yylval mit %union { ... } in Ihrem Parser, da Sie möglicherweise andere Werte vom Scanner an den Parser zurückgeben müssen. Wenn Sie beispielsweise eine Nummer in Ihrem Scanner zuordnen, möchten Sie möglicherweise ein Token wie T_NUM zurückgeben. Aber Sie wollen wahrscheinlich auch den Wert dieser Zahl, wo yylval nützlich ist. Wenn Sie yylval verwenden, können Sie, wenn Sie ein Integer-Feld haben, einfach yylval.num = atoi(yytext) in Ihrem Scanner verwenden und dann dieses num-Feld im Parser verwenden.

yytext ist ein Array von Zeichen, das als Puffer für die Eingabe dient, die gerade analysiert wird. Du kannst yytext nicht deklarieren, und das solltest du auch nicht.

Wenn Sie Bison verwenden, um den Parser in eine TAB-Datei zu kompilieren, verwenden Sie die Flags bison -d -t zum Debuggen von Symbolen und der Header-Datei. Die Headerdatei wird als * .tab.h bezeichnet. Schließen Sie das in Ihren Scanner ein, so dass Sie nur einmal Token-Namen deklarieren müssen und yylval korrekt verwenden müssen.

+0

ouyea, vielen Dank, was für eine gute Antwort :) – mjsr

Verwandte Themen