首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用parser.y数论点?

用parser.y数论点?
EN

Stack Overflow用户
提问于 2014-04-04 02:33:22
回答 1查看 100关注 0票数 0

有什么方法可以计算parser.y中的参数吗?我正在尝试一些递归的东西,我觉得这可能因为yyparse()的工作方式而无法工作。以下是我在我的聚会中所尝试的:

代码语言:javascript
复制
arg_list:
     | arg ',' arg_list { 
          int func_arg_list_count(){ int argCount = 0; return argCount+1; } 

**

编辑

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

代码语言:javascript
复制
%union {
int val;
int count;
char *funcName;
}

%token <funcName> ID

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

它是否成为了我的语义价值。我不匹配?

哦,这里有错误代码:

代码语言:javascript
复制
error: $1 of ‘arg_list’ has no declared type
 | arg ',' arg_list { $$ = $1 + 1; }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-04 02:53:46

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

在bison中,每个非终端(以及每个终端)都有一个语义值,其类型特定于非终端。因此,如果您希望arg_list的语义类型包含参数计数,就没有问题。只需声明一个适当的类型并将其添加到您的%union中即可。作为一个非常简单的例子,这里有一个arg_list,其语义类型恰好是参数的计数:(编辑,@Chris多德指出了原始的缺陷)

代码语言:javascript
复制
%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的语义操作也会以某种方式建立一个参数列表,因此语义值通常会更复杂。但这是一个基本的轮廓。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22852473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档