Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
yacc/bison行动的范围是什么?_C_Parsing_Yacc_Bison_Lex - Fatal编程技术网

yacc/bison行动的范围是什么?

yacc/bison行动的范围是什么?,c,parsing,yacc,bison,lex,C,Parsing,Yacc,Bison,Lex,我正试图在flex/bison中编写一个(相对)简单的配置文件解析器。基本思想是,我的bison语法使用一些C函数将解析的数据组织成一系列C结构。如果有人认为有必要回答这个问题,我很乐意发布我的代码,只需发表评论即可 我遇到的问题涉及bison操作中的程序范围。例如,如果我有类似于: set : NTOK name { section *sec init_s(sec,

我正试图在
flex
/
bison
中编写一个(相对)简单的配置文件解析器。基本思想是,我的
bison
语法使用一些C函数将解析的数据组织成一系列C结构。如果有人认为有必要回答这个问题,我很乐意发布我的代码,只需发表评论即可

我遇到的问题涉及
bison
操作中的程序范围。例如,如果我有类似于:

set
          : NTOK name    {
                          section *sec
                          init_s(sec, $2);
                          add_s(cf, sec);
                         }

sec
不应该在以后的语法规则中使用吗?当我稍后再次尝试将其作为参数调用时,出现了未声明的
错误:“sec”。有人能告诉我吗?

为bison
中的操作生成的所有代码都在它自己的范围内(IIRC,生成的代码用大括号将其包装以强制执行)。如果要使数据对其他操作全局可用,则需要在某处显式声明一个全局变量(可能在
flex
bison
脚本的顶部),然后写入该变量。这背后的基本原理是,如果一个操作中的每个变量都是隐式全局变量,或者至少可以被其他操作读取,那么当您打算创建新数据时,很容易意外地回收垃圾数据。

bison中为操作生成的所有代码都在其自己的范围内(IIRC,生成的代码将其用大括号括起来以强制执行此操作)。如果要使数据对其他操作全局可用,则需要在某处显式声明全局变量(可能在
flex
bison
脚本的顶部?),然后写入该变量。其基本原理是,如果一个操作中的每个变量都是隐式全局变量,或者至少可以被其他操作读取,那么当您打算创建新数据时,很容易意外地回收垃圾数据。

此问题通常通过分配令牌和规则来解决。您可以还将own附加到解析器函数

%union {
  char* name;
  section* sec;
}

%parse-param {whatever_type cf}

%token <name> name
%type <sec> set

%%

set      : NTOK name    {
                          init_s(&$$, $2);
                          add_s(cf, $$);
                         }
         ;

other_rule: set name {do_something_other($1 $2);}
          ;
%union{
字符*名称;
第*节;
}
%解析参数{任何类型的cf}
%令牌名
%类型集
%%
集合:NTOK名称{
初始值(&$$,2美元);
添加_s(cf,$$);
}
;
其他规则:设置名称{do_something_other($1$2);}
;

此问题通常通过分配令牌和规则来解决。您还可以将own附加到解析器函数

%union {
  char* name;
  section* sec;
}

%parse-param {whatever_type cf}

%token <name> name
%type <sec> set

%%

set      : NTOK name    {
                          init_s(&$$, $2);
                          add_s(cf, $$);
                         }
         ;

other_rule: set name {do_something_other($1 $2);}
          ;
%union{
字符*名称;
第*节;
}
%解析参数{任何类型的cf}
%令牌名
%类型集
%%
集合:NTOK名称{
初始值(&$$,2美元);
添加_s(cf,$$);
}
;
其他规则:设置名称{do_something_other($1$2);}
;

我应该寻找什么?我不确定我是否理解。请不要将答案编辑到问题中。对答案的投票权和你接受答案的权力相结合,可以更好地为后来的人排序。我应该寻找什么?我不确定我是否理解。请不要将答案编辑到问题中。以下组合对答案和你接受答案的能力进行投票可以更好地为后来的人分类。谢谢!这完美地回答了我的问题。感谢你也提供了一个变通方案。谢谢!这完美地回答了我的问题。感谢你也提供了一个变通方案。