有没有办法在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
它是否成为lexer中的语义值.l不匹配?
哦,这里有错误代码:
error: $1 of ‘arg_list’ has no declared type
| arg ',' arg_list { $$ = $1 + 1; }
答案 0 :(得分:1)
OP中写的内容不会编译。在C中,函数定义只能出现在顶层,而不是在大括号内,而野牛行为不在顶层。 (它们属于案例陈述,无论如何,个别行为都会保留其大括号。)
在野牛中,每个非终端(以及每个终端)都具有特定于非终端的类型的语义值。因此,如果您希望arg_list
的语义类型包含参数计数,则没有问题。只需声明一个合适的类型并将其添加到%union
即可。作为一个非常简单的例子,这里有arg_list
,其语义类型恰好是参数的计数:(编辑,@ ChrisDodd指出原文中的缺陷)
%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的语义动作也会以某种方式构建参数列表,因此语义值通常会更复杂。但这是一个基本的大纲。