Flex Bison Daten mit verwalteten Klassen einlesen

dertobian

Mitglied
Hallo,

ich habe mir einen Scanner / Parser mit Flex und Bison geschrieben. Bis jetzt sagt mir der Parser einfach nur, ob meine Query valide ist oder Fehler enthält.
Nun stellt sich mir aber die Frage, wie ich die Daten des Scanners und Parsers mit verwalteten Klassen / Variablen außerhalb der y- und l-Dateien weiterverarbeiten kann.
Dabei soll der Scanner die Token und die Zeichen zusammen mit Zeile und Spalte in einer Liste speichern, die ich dann mit dem Parser weiterverarbeiten kann. Anschließend sollen die Daten in der Klassen ANAquery zur Verfügung stehen.
Leider habe ich es noch nicht geschafft...

Kann mir da jemand Starthilfe geben?

Aufruf des Parsers:
Code:
bool ANAquery::isValid(String^ query_string)
{
	ANAqueryParser^ parser = gcnew ANAqueryParser();
	parser->setInput(query_string);
	
	if(1 == parser->process()) {
		parser->~ANAqueryParser();
		return false;
	}

	parser->~ANAqueryParser();
	return true;
}

So sehen die eben aufgerufenen Methoden aus:

Code:
#include "stdafx.h"

extern int yyparse();
extern FILE *yyin;

void ANAqueryParser::setInput(System::String ^query_string){
	//
	// write query string into file
	// it was done in this way, because of too difficult conversions between System::String and other types for further steps
	//
	StreamWriter sw(TMP_QUERY_STRING_FILE);
	sw.Write(query_string);
	sw.Close();
	
	//
	// read query string from file into standard input
	//
	fopen_s(&yyin, TMP_QUERY_STRING_FILE, "r");
}

ANAqueryParser::t_error_code ANAqueryParser::process(){
	lex_fac = gcnew LexValueFactory();
	return yyparse();
}

ANAqueryParser::~ANAqueryParser(){
	fclose(yyin);
}
 
Ich habe den Scanner jetzt auch schon so weit erweitert, dass er jetzt auszugsweise so aussieht:

Code:
{query_start} {
     inputcol+=yyleng;
     yylval = ANAqueryParser::lex_value_factory->createLexValue(yytext, tok_QUERY_START, yylineno, inputcol);
					
     return(tok_QUERY_START);
}

(query_start ist dabei einfach nur ein "[")

Nun muss aber yylval vom Typ LexValue sein. Die Klasse ist aber managed. Wie krieg ich das in der y-Datei dem YYSTYPE beigebracht? So gehts nicht:

Code:
#define YYSTYPE LexValue^

Gruß Tobian.
 
Hi.
Nun muss aber yylval vom Typ LexValue sein. Die Klasse ist aber managed. Wie krieg ich das in der y-Datei dem YYSTYPE beigebracht? So gehts nicht:

Code:
#define YYSTYPE LexValue^
Sollte eigentlich so gehen. Hast du auch den entsprechenden Header eingebunden?

Gibt es eigentlich einen besonderen Grund, das du bison+flex nicht wie üblich miteinander kombinierst, sondern diesen Zwischenschritt mit dem Speichern der Rückgabewerte von flex machst?

Gruß
 
Ich bekomme im Scanner an der Stelle, wie vorhin geschrieben, einen Fehler:

Fehler 1 error C2440: '=': 'LexValue ^' kann nicht in 'YYSTYPE' konvertiert werden ANA\anaqueryscanner.l 67

Das wird aber wohl eher daher kommen, dass das mit dem define gar nicht klappt.

Da bekomme ich die Fehler:

Fehler 2 error C3265: Ein verwalteter 'yyvs' kann nicht in einem nicht verwalteten 'yyalloc' deklariert werden ANA\anaqueryparser.y.cpp 333

Fehler 3 error C2848: 'yyalloc::yyvs': Ein verwalteter Typ kann kein Element einer Union sein ANA\anaqueryparser.y.cpp 333

Fehler 4 error C3145: "yylval": Eine globale oder statische Variable darf nicht den verwalteten Typ "LexValue ^" aufweisen. ANA\anaqueryparser.y.cpp 1145

Was meinst du mit dem üblichen Weg? Ich habe von meinem Betreuer so eine Vorlage bekommen. Man hat halt zu jedem Match Zeilen und Spalten dabei. Aber wenns einfacher geht?
 
Zuletzt bearbeitet:
Das Problem habe ich leider immer noch nicht lösen können? Wie kann ich ein define mit einer Managed Class machen?

Gibt es eigentlich einen besonderen Grund, das du bison+flex nicht wie üblich miteinander kombinierst, sondern diesen Zwischenschritt mit dem Speichern der Rückgabewerte von flex machst?

Ich habe mir die Klassen von meinem Betreuer noch mal angeschaut. Wenn ich nicht allein den "üblichen Weg" gehe, habe ich so die Möglichkeit, jedes Token schon vor dem Parser zu bearbeiten. Ich kann sie umwandeln oder bspw. einem von Anführungszeichen eingeschlossenen String von diesen Anführungszeichen befreien, ... Also würde ich ungern auf die LexValue / LexValueFactory verzichten.

Vielleicht kann doch noch mal jemand drüber nachdenken?

Danke, Tobian.
 
Zurück