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

时间:2009-09-15 21:44:53

标签: c yacc bison

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

2 个答案:

答案 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;
    }
  ;
%%