我有语法:
%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”的值,没有规则。为什么呢?
答案 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预处理器解析为特定符号的数字特征。生成的令牌代码与解析的特定值无关。