yacc/bison栈元素默认数据类型是什么?$$、$1等符号类型咨询
Yacc/Bison 中
$$/$1/$2符号的对应数据类型说明 Yacc/Bison 中$$、$n这类语义值引用的实际类型,由语义栈的类型定义决定,规则如下:
- 未做任何自定义类型声明时,所有语义栈元素的默认类型为C语言
int,对应所有$$、$n的类型都是int - 如果你通过
%union指令自定义了语义值联合,需要为每个文法符号(终结符/非终结符)绑定联合中的成员类型,$$、$n的类型就等于其所属文法符号绑定的联合成员类型
举个实际配置示例:
第一步声明语义值联合:
第二步为不同文法符号绑定对应联合成员:%union { int num_int; char* str_ptr; double num_float; }
对应规则中的类型映射:%token <num_int> INT_LITERAL %token <str_ptr> STR_LITERAL %type <num_float> calc_expr- 终结符
INT_LITERAL对应的$n类型为int - 终结符
STR_LITERAL对应的$n类型为char* - 非终结符
calc_expr对应的$$和$n类型为double
- 终结符
- 特殊场景下你可以手动指定要访问的联合成员,语法为
$<成员名>$、$<成员名>n,比如$<str_ptr>2就代表取第二个栈元素的str_ptr成员,类型为char*,无需提前给符号绑定类型
Bison生成代码阶段会自动把
$$、$n替换为语义栈对应位置的元素访问语句,无需开发者手动处理栈偏移计算。
内容的提问来源于stack exchange,提问作者Pratik Bedre
相关产品推荐
相关产品推荐

