Frage

Mit Bison, habe ich herausgefunden, wie sich alles in eine lange Zeichenfolge zu erhalten, wie folgt:

arg_list:
    WORD arg_list { strcat( $1, "IFS" ); $$ = strcat($1, $2); }  |
    WORD
    ;

und

WORD arg_list { printf("%s, %s\n", $1, $2); }

Aber das Problem ist, dass ich dann 2 $ aufspalten muß in der zweiten Regel erneut zu analysieren. Gibt es eine Möglichkeit, ein Array statt nur mit Verkettung zu füllen? Bin ich über diese gehen in die falsche Richtung?

Wenn ich brauche so etwas wie eine verknüpfte Liste zu erstellen, die Sinn machen könnte, nur nicht sicher, was der richtige Weg, um arg_list zu binden würde, und dann den Speicher aufzuräumen.

War es hilfreich?

Lösung

Wenn Sie einen Array-Typen mit einem push_front Betrieb haben, ist dies trivial:

arg_list:
    WORD arg_list { $$ = $2.push_front($1); }
    WORD { $$ = new Array<string>($1); }

ohne dass es erfordert mehr Arbeit. Sie können einen Vektor verwenden und die Saiten am Ende hinzufügen (die in umgekehrter Reihenfolge sein wird). Oder Sie können eine verkettete Liste verwenden (was einfacher ist, wenn Sie gerade C verwenden):

arg_list:
    WORD arg_list { $$ = malloc(sizeof(struct list_elem));
                    $$->next = $2;
                    $$->val = $1; }
    WORD          { $$ = malloc(sizeof(struct list_elem));
                    $$->next = 0;
                    $$->val = $1; }

Andere Tipps

%union {
  char *char_ptr;
}
%token STRING
%type <char_ptr> STRING string
%%
...
string:
    STRING        /* Lexic analyzer return STRING and set yylval = yytext; */
  | string STRING
    { char *str = (char*) malloc(strlen($1) + strlen($2) + 1);
      strcpy(str, $1);
      strcat(str, $2);
      free($2);
      free($1);
      $$ = str;
    }
  ;
%%
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top