在parser.y中计算参数?

时间:2014-04-04 02:33:22

标签: c parsing bison

有没有办法在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; }

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的语义动作也会以某种方式构建参数列表,因此语义值通常会更复杂。但这是一个基本的大纲。