C 在parser.y中计算参数?

C 在parser.y中计算参数?,c,parsing,bison,C,Parsing,Bison,有没有办法计算parser.y中的参数?我正在尝试一些递归的东西,我觉得这可能不起作用,因为yyparse()的工作方式。下面是我在解析器中尝试的内容。y: arg_list: | arg ',' arg_list { int func_arg_list_count(){ int argCount = 0; return argCount+1; } ** 编辑 **:一些更新,上面的代码是错误的,正如我指出的。这是我的工会,有一些更新的建议,尽管我仍然对1美元

有没有办法计算parser.y中的参数?我正在尝试一些递归的东西,我觉得这可能不起作用,因为yyparse()的工作方式。下面是我在解析器中尝试的内容。y:

arg_list:
     | arg ',' arg_list { 
          int func_arg_list_count(){ int argCount = 0; return argCount+1; } 
**

编辑

**:一些更新,上面的代码是错误的,正如我指出的。这是我的工会,有一些更新的建议,尽管我仍然对1美元有问题

%union {
int val;
int count;
char *funcName;
}

%token <funcName> ID

%type <val> exp prop
%type <count> arg_list

OP中编写的内容不会编译。在C语言中,函数定义只能出现在顶层,而不能出现在大括号内,野牛动作也不能出现在顶层。(它们位于case语句中,在任何情况下,单个操作都保留大括号。)

在bison中,每个非终端(以及每个终端)都有一个特定于非终端的类型的语义值。因此,如果您希望
arg_list
的语义类型包含参数计数,那么没有问题。只需声明一个适当的类型并将其添加到您的
%union
。作为一个非常简单的例子,这里有一个
arg_列表
,它的语义类型正是参数的计数:(经过编辑,@chrisdd指出了原文中的缺陷)

%union{
整数计数;
/*其他类型*/
}
%输入参数列表非空参数列表
%%
arg_list:/*空*/{$=0;/*空列表没有参数*/}
|非空参数列表{$$=$1;/*这是默认操作。*/}
非空参数列表:
arg{$$=1;/*以一个参数开始*/}
|非空参数列表','arg{$$=$1+1;/*现在它又有一个参数*/}
;

通常,arg_列表的语义操作也会以某种方式建立一个参数列表,因此语义值通常会更复杂。但这是一个基本的轮廓。

所以,我有一个具有int-val的并集;char*funcName,我应该加上count吗?@pmac89:这完全取决于您的arg_列表非终端的语义值实际需要什么。如果你的联盟中已经有了合适的类型,你也不需要使用单独的标签;这完全取决于你。所以,这有助于解决这个问题,而且完全有意义。我已经更新了上面的代码,我的想法正确吗?我只需要$#?@pmac:
$1
是该产品rhs中的第一个符号。如果更改右侧,还需要更改索引。我是否需要arg_列表的另一个并集中的计数?因为我还有%token ID%type exp prop的
error: $1 of ‘arg_list’ has no declared type
 | arg ',' arg_list { $$ = $1 + 1; }
%union {
   int count;
   /* other types */
}

%type <count> arg_list non_empty_arg_list

%%

arg_list: /* EMPTY */        { $$ = 0; /* An empty list has no arguments */ }
        | non_empty_arg_list { $$ = $1; /* This is the default action. */ }

non_empty_arg_list:
          arg                        { $$ = 1; /* Starts with one argument */ }
        | non_empty_arg_list ',' arg { $$ = $1 + 1; /* Now it has one more argument */ }
        ;