Hier ist der Teil ich spreche:Wie deklariert man eine persistente Variable bei der Verwendung der linken Rekursion in bison/flex?
block : statement
{
NBlock* myBlock = new NBlock();
myBlock->AddStatement($1);
}
| block statement
{
std::cout << "More than one statement" << std::endl;
myBlock->AddStatement($2);
}
;
Hier ist ein Auszug aus den Anweisungen für diese Aufgabe:
Die Mehrheit der Grammatik Aktionen werden nur $$ auf eine neue Einstellung erfordern Instanz des Knotens, wie mit NRotate. Aber es gibt ein paar spezielle Fälle, auf die man achten sollte.
Die Aktion main_loop muss einfach den Block, den sie hat, erfassen und den globalen Zeiger g_MainBlock darauf setzen. Für diesen globalen Block sollte dann auch SetMainBlock aufgerufen werden.
Der andere Sonderfall sind die Aktionen für Block. Wenn die erste Anweisung übereinstimmt, müssen Sie einen neuen NBlock erstellen und die Anweisung der neuen Anweisungsliste dieses NBlocks hinzufügen. Aber wenn aufeinander folgende Anweisungen übereinstimmen, anstatt einen neuen NBlock zu erstellen, sollten Sie einfach die neue Anweisung zu dem bereits vorhandenen NBlock hinzufügen.
Wie erreiche ich das?
ETA:
/* Add one union member for each Node* type */
%union {
Node* node;
NBlock* block;
NStatement* statement;
NNumeric* numeric;
NBoolean* boolean;
std::string* string;
int token;
}
%error-verbose
/* Terminal symbols */
%token <string> TINTEGER
%token <token> TLBRACE TRBRACE TSEMI TLPAREN TRPAREN
%token <token> TMAIN TROTATE TFORWARD TISHUMAN TATTACK TISPASSABLE TISRANDOM TISZOMBIE TRANGED
%token <token> TIF TELSE
/* Statements */
%type <block> main_loop block
%type <statement> statement rotate forward is_human is_passable is_random is_zombie ranged
/* Expressions */
%type <numeric> numeric
Wenn Sie sagen "finde das Originalobjekt in $ 1", bin ich mir nicht sicher, was du meinst. Ich verstehe, dass 41 der erste Block sein wird, in dem myBlock deklariert wäre, aber wie kann ich darauf zugreifen? Vielen Dank! –
Ich weiß nicht, was du mit "41" meinst. –
@SamVarshavchik - Wahrscheinlich ein Tippfehler. Das OP bedeutete "$ 1". – owacoder