7 Stimmen

yylval in Bison verwenden, um eine Zeichenkette wiederherzustellen

Hallo, ich bin verwirrt darüber, wie ich ein Zeichen* bekomme, wenn ich ein bestimmtes Token lese... Ich schaue in verschiedenen Websites und sie bieten Vorschläge, aber nicht vollständig, ich meine, zum Beispiel yylval und yytext Erklärung fehlt oder wie die Typen zu transformieren, etc.

Was wird in einer .l-Datei benötigt? Was wird in einer .y-Datei benötigt?

Was ich habe

in der .l-Datei:

{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 *’

Eine andere Sache, die mich mehr verwirrt hat: An einigen Stellen sehe ich

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

Im Handbuch von Bison steht, dass yylval ein Makro ist, ich verstehe, dass ein Makro Text für anderen Text ersetzt, aber in dieser Situation verstehe ich es wirklich nicht.

16voto

Kizaru Punkte 2393

Yylval ist ein Vereinigungstyp YYSTYPE. Ändern Sie Ihre Zuordnung im Scanner in yylval.str = strdup(yytext) .

yylval ist eine Gewerkschaft, die Sie entweder deklarieren können oder die Bison automatisch deklariert. Bison's Standard yylval ist im Wesentlichen nutzlos. Sie deklarieren yylval mit %union { ... } in Ihrem Parser, weil Sie möglicherweise andere Werte vom Scanner an den Parser zurückgeben müssen. Wenn Sie zum Beispiel eine Zahl in Ihrem Scanner abgleichen, wollen Sie ein Token zurückgeben wie T_NUM . Wahrscheinlich wollen Sie aber auch den Wert dieser Zahl wissen, und da kommt yylval gerade recht. Mit yylval können Sie, wenn Sie ein Integer-Feld haben, einfach Folgendes tun yylval.num = atoi(yytext) in Ihrem Scanner, und verwenden Sie dann dieses numerische Feld im Parser.

yytext ist ein Array von Zeichen, das als Puffer für die Eingabe dient, die gerade geparst wird. Sie können yytext nicht deklarieren, und das sollten Sie auch nicht.

Wenn Sie bison verwenden, um den Parser in eine .tab.c-Datei zu kompilieren, verwenden Sie die Flags bison -d -t für Debugging-Symbole und die Header-Datei. Die Header-Datei wird *.tab.h heißen. Fügen Sie diese in Ihren Scanner ein, damit Sie Token-Namen nur einmal deklarieren müssen und yylval korrekt verwenden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X