有什么方法可以计算parser.y中的参数吗?我正在尝试一些递归的东西,我觉得这可能因为yyparse()的工作方式而无法工作。以下是我在我的聚会中所尝试的:
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它是否成为了我的语义价值。我不匹配?
哦,这里有错误代码:
error: $1 of ‘arg_list’ has no declared type
| arg ',' arg_list { $$ = $1 + 1; }发布于 2014-04-04 02:53:46
在OP中编写的内容不会编译。在C中,函数定义只能出现在顶层,不能出现在大括号内,而bison操作不能出现在顶层。(它们在case语句中,而且在任何情况下,每个动作都保留它们的大括号。)
在bison中,每个非终端(以及每个终端)都有一个语义值,其类型特定于非终端。因此,如果您希望arg_list的语义类型包含参数计数,就没有问题。只需声明一个适当的类型并将其添加到您的%union中即可。作为一个非常简单的例子,这里有一个arg_list,其语义类型恰好是参数的计数:(编辑,@Chris多德指出了原始的缺陷)
%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 */ }
;通常,arg_list的语义操作也会以某种方式建立一个参数列表,因此语义值通常会更复杂。但这是一个基本的轮廓。
https://stackoverflow.com/questions/22852473
复制相似问题