有了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的正确方法,然后清理内存。
答案 0 :(得分: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; }
答案 1 :(得分: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;
}
;
%%