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

Kyl*_*ndt 2 c yacc bison

有了Bison,我想出了如何将所有内容整合成一个长字符串,如下所示:

arg_list:
    WORD arg_list { strcat( $1, "IFS" ); $$ = strcat($1, $2); }  |
    WORD
    ;
Run Code Online (Sandbox Code Playgroud)

和:

WORD arg_list { printf("%s, %s\n", $1, $2); }
Run Code Online (Sandbox Code Playgroud)

但问题是,我将不得不再次在第二条规则中拆分$ 2来解析它.有没有办法填充数组而不只是使用连接?我是以错误的方式来做这件事的吗?

如果我需要构建像链接列表那样有意义的东西,只是不确定绑定到arg_list的正确方法是什么,然后清理内存.

Chr*_*odd 6

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

arg_list:
    WORD arg_list { $$ = $2.push_front($1); }
    WORD { $$ = new Array<string>($1); }
Run Code Online (Sandbox Code Playgroud)

没有它,它需要更多的工作.您可以使用向量并在末尾添加字符串(将按相反的顺序).或者您可以使用链接列表(如果您使用直接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; }
Run Code Online (Sandbox Code Playgroud)