YACC函数中@符号的含义解析(基于PostgreSQL源码示例)
关于PostgreSQL pl_gram.y中
@2符号的含义解释 在YACC(或其兼容实现Bison,PostgreSQL使用的是Bison)的语法规则代码块里,@N是位置标记变量,用来获取语法规则中第N个语法单元的源文件位置信息(通常包含起始、结束的字符偏移量)。
对应你贴出的pl_block语法规则:
pl_block : decl_sect K_BEGIN proc_sect exception_sect K_END opt_label
这里的@2就对应规则里的第2个语法单元——K_BEGIN(也就是PL/pgSQL代码里的BEGIN关键字)。代码里调用plpgsql_location_to_lineno(@2),就是把BEGIN关键字所在的字符位置转换成源文件的行号,最终赋值给块语句的lineno字段,用于后续的错误提示、调试信息输出等场景。
类似的,代码里的@6对应规则里的第6个单元opt_label(块结尾的可选标签),check_labels函数用它来获取标签的位置,用于校验标签是否匹配。
补充说明:和@N对应的是$N,$N用来获取第N个语法单元的语义值(比如$1.label就是取第一个单元decl_sect的label属性),而@N专注于位置信息,二者是YACC/Bison里成对的内置变量。
内容的提问来源于stack exchange,提问作者IsaIkari
相关产品推荐
相关产品推荐

