You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:45:38