0

我想将对象添加到表示 Yacc/Bison 中的参数列表的向量中。我有以下语法规则:

argument_list:  expression 
                {
                 //push back object representing expression onto arglist vector
                }

                |
                expression ',' argument_list
                {
                 //same here
                };

我不知道该怎么做,因为你不能在类型声明中将 argument_list 声明为向量。我想通过这样的规则将此向量传递给一个方法,该方法创建一个表示方法的 AST 节点:

arg_method_invocation: IDENT PERIOD IDENT LPAR argument_list RPAR 
              { 
              $$=new MethodCallStatement(yylineno,new MethodCallExpression(yylineno,$1,$3, $5 ));
                     if ($$==NULL)
                     fatal("method stmt: ", "error method stmt call");
              }

这甚至可能吗?我是编译器设计的新手,这种方法可能不可行。欢迎任何建议。

4

1 回答 1

0

只需使其左递归:

argument_list:  expression 
            {
              $$ = new vector();
              $$.add($1); // or whatever the API is
            }

            |
            argument_list ',' expression
            {
             $1.add($3); // ditto
            };

我不明白你为什么不能声明argument_listvector. 我假设您在这里指的是 %type 和 %union 指令?如果你不是,那你就是这样做的。

于 2012-04-10T01:12:53.130 回答