【问题标题】:bison:why do the result is wrong when print a constant in a action?野牛:为什么在动作中打印常量时结果是错误的?
【发布时间】:2013-10-21 00:27:23
【问题描述】:

我有语法:

%token T_SHARE
%token T_COMMENT T_PUBLIC T_WRITEABLE T_PATH T_GUESTOK T_VALID_USERS
       T_WRITE_LIST T_CREATE_MODE T_DIRECTORY_MODE
%union
{
    int number;
    char *string;
}

%token <string> T_STRING
%token <number> T_NUMBER T_STATE

%%

parameters:
   |parameters parameter
       ;
parameter:
   section_share
       |comment
....
section_share:
       '[' T_SHARE ']' {section_print(T_SHARE);}
   ;
comment:
   T_COMMENT '=' T_STRING {print(2);parameter_print(T_COMMENT);}
       ;

函数打印是: 无效打印(int arg) { printf("%d\n", arg); }

但它会将 print 的参数“2”打印为其他值,例如“8508438”,没有规则。为什么?

【问题讨论】:

  • 你的问题不够清楚,没有人可以为你提供相关的答案。您需要提供更多详细信息。另外,看看 Bison 的调试模式。

标签: c bison


【解决方案1】:

很难理解您要问什么,但我认为您将令牌的数字代码与其语义值混淆了。特别是,与您的“评论”规则相关联的操作中的 print(2) 调用没有什么特别之处。它按字面意思复制到生成的解析器,因此,给定print() 函数的定义,每次触发该规则时都应打印文字“2”。我想这就是你所说的你观察到的。

如果您想打印与规​​则中的符号关联的语义值,则语法格式为 $n,其中美元符号后面的数字是所需符号的编号在规则中,从 1 开始计数。因此,在“注释”规则中,与 T_STRING 符号关联的语义值可以引用为$3。例如:

comment:
    T_COMMENT '=' T_STRING { printf("The string is %s\n", $3); }
;

原始标记的语义值必须由您的词法分析器设置才能可用;非终结符的语义值必须由语法中的动作设置。另请注意,计算中包含规则中的操作。

尽管可以在操作中直接使用诸如 T_COMMENT 之类的标记符号,但这样做通常没有用处。这些符号将由 C 预处理器解析为特定符号的数字特征。生成的令牌代码与解析的具体值无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多