野牛:为什么在动作中打印常量时结果是错误的?

时间:2013-10-13 08:38:12

标签: c bison

我有语法:

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

功能打印是:     void print(int arg)     {       printf(“%d \ n”,arg);     }

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

1 个答案:

答案 0 :(得分:0)

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

如果您要打印与规则中的符号关联的语义值,则语法的格式为 $ n ,其中美元符号后面的数字是所需符号的数字因此,在“评论”规则中,与T_STRING符号关联的语义值可以引用为$3。例如:

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

原始令牌的语义值必须由词法分析器设置为可用;非终端的语义值必须由语法中的动作设置。另请注意,中间规则操作包含在计数中。

虽然您的T_COMMENT等令牌符号可以直接用于操作,但通常不会这样做。这些符号将由C预处理器解析为特定符号的数字特征。生成的令牌代码与解析的特定值无关。