【问题标题】:What is the scope of yacc/bison actions?yacc/bison 动作的范围是什么?
【发布时间】:2011-02-23 22:18:16
【问题描述】:

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

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

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

sec 不应该在以后的语法规则中使用吗?当我稍后尝试再次将其称为参数时,我得到了error: 'sec' undeclared。谁能赐教?

【问题讨论】:

  • 我应该寻找什么?不确定我是否理解。
  • 请不要编辑问题的答案。对答案进行投票和您接受答案的权力相结合,可以更好地为后来的人分类。

标签: c parsing yacc bison lex


【解决方案1】:

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

【讨论】:

  • 谢谢!这完美地回答了我的问题。感谢您包括解决方法。
【解决方案2】:

通常通过将types 分配给令牌和规则来解决此问题。您也可以将自己的parameters 附加到解析器函数中。

%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);}
          ;

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多