3

使用 Bison,我想出了如何将所有内容放入一个长字符串中,如下所示:

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

和:

WORD arg_list { printf("%s, %s\n", $1, $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 回答