有了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的正确方法是什么,然后清理内存.
如果你有一个带有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)