如何使用Bison / Yacc和递归规则构建数组

有了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的正确方法,然后清理内存。

如果你有一个带有push_front操作的数组类型,这很简单:

 arg_list: WORD arg_list { $$ = $2.push_front($1); } WORD { $$ = new Array($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; } 
 %union { char *char_ptr; } %token STRING %type  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; } ; %%