3

Bison を使用して、次のようにすべてを 1 つの長い文字列にまとめる方法を見つけました。

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

と:

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

しかし、問題は、2 番目のルールで $2 を再度分割して解析する必要があることです。連結を使用する代わりに配列を設定する方法はありますか? 私はこれについて間違った方法で進んでいますか?

理にかなっているリンクされたリストのようなものを構築する必要がある場合は、arg_list にバインドしてメモリをクリーンアップする適切な方法がわからないだけです。

4

2 に答える 2

6

push_front 操作を使用する配列型がある場合、これは自明です。

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

それがなければ、より多くの作業が必要になります。ベクトルを使用して、最後に文字列を追加できます (逆の順序になります)。または、リンクされたリストを使用できます (ストレート C を使用している場合は簡単です)。

arg_list:
    WORD arg_list { $$ = malloc(sizeof(struct list_elem));
                    $$->next = $2;
                    $$->val = $1; }
    WORD          { $$ = malloc(sizeof(struct list_elem));
                    $$->next = 0;
                    $$->val = $1; }
于 2009-09-15T21:52:42.313 に答える
2
%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;
    }
  ;
%%
于 2011-04-24T12:39:28.600 に答える