Wie zu verwenden yylval mit strings in yacc -
Möchte ich weitergeben der eigentliche string des Tokens. Wenn ich ein token namens ID, dann will ich meine yacc-Datei, um tatsächlich zu wissen, welche ID aufgerufen wird. Ich Sache, die ich haben, um einen string in yylval den yacc-Datei aus der flex-Datei. Wie mache ich das?
Bitte, mindestens Blick in die Dokumentation, bevor Sie eine Frage stellen hier.
InformationsquelleAutor neuromancer | 2009-12-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen die Flex-Handbuch Abschnitt auf die Verknüpfung mit YACC.
InformationsquelleAutor
Den Schlüssel zum zurückgeben einer Zeichenfolge oder einer beliebigen komplexen Typ über yylval ist die YYSTYPE union erstellt yacc in der y -.tab.h-Datei. Die YYSTYPE ist eine union mit einem Mitglied für jede Art von token definiert, das yacc-Quelldatei. Zum Beispiel auf den string, verbunden mit einem SYMBOL token in den yacc-Quelldatei, die Sie erklären, dass diese YYSTYPE union mit %union in den yacc-Quelldatei:
Dann in der LEX-Quelldatei gibt es ein Muster, das entspricht dem SYMBOL token. Es liegt in der Verantwortung der code zugeordnet ist, die Regel zurück die tatsächliche Zeichenfolge repräsentiert das SYMBOL. Sie können nicht nur übergeben Sie einen Zeiger auf die yytext Puffer, weil es einen statischen Puffer, der wiederverwendet wird für jedes token entspricht. Die Rückkehr der übereinstimmende text der statischen yytext Puffer muss repliziert werden auf dem heap mit _strdup() und einem Zeiger auf diesen string übergeben über yyval.str. Es ist dann die yacc-Regel, entspricht der SYMBOL-token in der Verantwortung frei heap zugewiesene Zeichenfolge, wenn es fertig ist.
InformationsquelleAutor JonN
Einrichten Kontext
Syntax-Analyse (um zu überprüfen ob ein input-text folgt einer festgelegten Grammatik) bestehen aus zwei Phasen:
Während phase 1, gegeben einen input-stream, für jeden Aufruf von yylex() gibt ein token (char string) und yytext Punkte, um zum ersten Zeichen dieses Strings.Zum Beispiel: Bei einem input-stream von "int x = 10;" und mit lex-Regeln für die übersetzung in Token gemäß C-Sprache, die dann die ersten 5 Aufrufe yylex() erkennen Sie die folgenden 5 Token "int", "x", "=", "10", ";" und jedes mal, wenn die yytext zeigt auf das erste Zeichen der Rückkehr token.
Phase 2, Der parser (die du erwähnt hast wie yacc ) ist ein Programm, welches beim aufrufen dieser Funktion yylex jeder Zeit zu bekommen ein token und nutzt diese Token, um zu sehen, wenn es passt, die Regeln einer Grammatik. Diese Aufrufe yylex zurück tokens, da einige integer-codes. Zum Beispiel in dem vorherigen Beispiel, die ersten 5 Aufrufe yylex() zurückkehren können, die folgenden zahlen der parser: TYP, ID, EQ_OPERATOR und INTEGER ( deren eigentliche integer-Werte sind definiert in einigen header-Datei).
Nun alle parser sehen kann, ist diese integer-codes, die möglicherweise nicht nützlich sein, zu Zeiten. Zum Beispiel, in dem Beispiel können Sie zuordnen möchten, GEBEN Sie int ID, um einige Symboltabelle Zeiger und GANZZAHL dezimal 10. Um das zu erleichtern, jedes token zurückgegeben yylex mit im Zusammenhang mit einem anderen WERT, dessen Standard-Typ int, aber Sie können benutzerdefinierte Typen. In der lex Umgebung dieser WERT wird zugegriffen, als yylval.
Beispielsweise wieder als pro der Beispiel, yylex kann die folgende Regel zur Identifikation 10
und nach zu identifizieren, x
Beachten Sie, dass hier habe ich definiert, wird der WERT ( oder yylval) geben Sie als union mit einer int (intval) und ein int* - Zeiger (sym_tab_ptr).
Aber in der yacc-Welt, ist dieser WERT identifiziert /abgerufen als $n. Betrachten Sie beispielsweise das folgende yacc-Regel zum identifizieren einer bestimmten Zuordnung Anweisung
, Deine Frage zu beantworten
Wenn Sie möchten, um Zugriff auf die yytext Wert einer bestimmten token (die mit lex Welt) in yacc Welt, Nutzung, Alter Freund WERT wie folgende:
InformationsquelleAutor Sandeep Dasgupta