记录bison解析时的shift/reduce步骤

本文详细描述了如何使用Bison解析器在PostgreSQL中启用trace功能,跟踪SQL语法解析过程,并展示了生成的pgbison.trace文件中记录的解析步骤实例。
摘要由CSDN通过智能技术生成

发现一篇分析bison解析步骤的博文,分享一下:[postgresql] trace parsing steps of bison - winter-loo - 博客园 (cnblogs.com)

试用一下:

1、gram.y中c代码区添加博文提供的如下代码

#ifdef YYDEBUG
#undef YYDEBUG
#endif
#define YYDEBUG 1
int base_yydebug = 1;
/* for pl_gram.y */
int plpgsql_yydebug = 1;
#define YYFPRINTF trace_parser
#include <stdio.h>
#include "utils/guc.h"
void trace_parser(FILE* stderr, const char* fmt, ...) __attribute__((format (printf, 2, 3)));

void trace_parser(FILE* stderr, const char* fmt, ...) {
  StringInfoData buf;
  va_list   ap;
  int     needed;
  char trace_file[1024];
  FILE* trace_fd;

  if (client_min_messages != LOG)
  	return;

  initStringInfo(&buf);
  for (;;)
  {
    va_start(ap, fmt);
    needed = appendStringInfoVA(&buf, fmt, ap);
    va_end(ap);
    if (needed == 0)
      break;
    enlargeStringInfo(&buf, needed);
  }

  strcpy(trace_file, getenv("HOME"));
  strcat(trace_file, "/pgbison.trace");
  trace_fd = fopen(trace_file, "a+");
  if (!trace_fd)
    elog(ERROR, "cannot open file %s", trace_file);

  fwrite(buf.data, sizeof(char), buf.len, trace_fd);
  fclose(trace_fd);

  ereport(LOG, (errmsg_internal("'%s'", buf.data)));
  pfree(buf.data);
}

2、make && make install &&重启数据库服务器

3、设置client_min_messages参数为log,发起sql,查询~/pgbison.trace文件

lightdb@oracle=# set client_min_messages to 'log';
SET
lightdb@oracle=# create table tab1(a int);

生成的pgbison.trace文件如下,从文件末尾往前看,可以清晰获知语法解析的整个流程:

Starting parse
Entering state 0
Stack now 0
Reading a token
Next token is token CREATE (: )
Shifting token CREATE (: )
Entering state 13
Stack now 0 13
Reading a token
Next token is token TABLE (: )
Reducing stack by rule 597 (line 5759):
-> $$ = nterm OptTemp (: )
Entering state 779
Stack now 0 13 779
Next token is token TABLE (: )
Shifting token TABLE (: )
Entering state 1301
Stack now 0 13 779 1301
Reading a token
Next token is token IDENT (: )
Shifting token IDENT (: )
Entering state 733
Stack now 0 13 779 1301 733
Reducing stack by rule 3058 (line 23643):
   $1 = token IDENT (: )
-> $$ = nterm ColId (: )
Entering state 963
Stack now 0 13 779 1301 963
Reading a token
Next token is token '(' (: )
Reducing stack by rule 3007 (line 23104):
   $1 = nterm ColId (: )
-> $$ = nterm qualified_name (: )
Entering state 2221
Stack now 0 13 779 1301 2221
Next token is token '(' (: )
Shifting token '(' (: )
Entering state 3631
Stack now 0 13 779 1301 2221 3631
Reading a token
Next token is token IDENT (: )
Shifting token IDENT (: )
Entering state 733
Stack now 0 13 779 1301 2221 3631 733
Reducing stack by rule 3058 (line 23643):
   $1 = token IDENT (: )
-> $$ = nterm ColId (: )
Entering state 4834
Stack now 0 13 779 1301 2221 3631 4834
Reading a token
Next token is token INT_P (: )
Shifting token INT_P (: )
Entering state 997
Stack now 0 13 779 1301 2221 3631 4834 997
Reading a token
Next token is token ')' (: )
Reducing stack by rule 2555 (line 20158):
-> $$ = nterm opt_varying (: )
Entering state 1677
Stack now 0 13 779 1301 2221 3631 4834 997 1677
Next token is token ')' (: )
Reducing stack by rule 2518 (line 19864):
-> $$ = nterm opt_type_modifiers (: )
Entering state 2599
Stack now 0 13 779 1301 2221 3631 4834 997 1677 2599
Reducing stack by rule 2519 (line 19870):
   $1 = token INT_P (: )
   $2 = nterm opt_varying (: )
   $3 = nterm opt_type_modifiers (: )
-> $$ = nterm Numeric (: )
Entering state 1014
Stack now 0 13 779 1301 2221 3631 4834 1014
Reducing stack by rule 2505 (line 19806):
   $1 = nterm Numeric (: )
-> $$ = nterm SimpleTypename (: )
Entering state 1012
Stack now 0 13 779 1301 2221 3631 4834 1012
Next token is token ')' (: )
Reducing stack by rule 2503 (line 19801):
-> $$ = nterm opt_array_bounds (: )
Entering state 1693
Stack now 0 13 779 1301 2221 3631 4834 1012 1693
Next token is token ')' (: )
Reducing stack by rule 2495 (line 19759):
   $1 = nterm SimpleTypename (: )
   $2 = nterm opt_array_bounds (: )
-> $$ = nterm Typename (: )
Entering state 4223
Stack now 0 13 779 1301 2221 3631 4834 4223
Next token is token ')' (: )
Reducing stack by rule 969 (line 8605):
-> $$ = nterm create_generic_options (: )
Entering state 5333
Stack now 0 13 779 1301 2221 3631 4834 4223 5333
Reducing stack by rule 619 (line 5976):
-> $$ = nterm ColQualList (: )
Entering state 6035
Stack now 0 13 779 1301 2221 3631 4834 4223 5333 6035
Next token is token ')' (: )
Reducing stack by rule 633 (line 6035):
-> $$ = nterm OptColCharset (: )
Entering state 6612
Stack now 0 13 779 1301 2221 3631 4834 4223 5333 6035 6612
Next token is token ')' (: )
Reducing stack by rule 629 (line 6026):
-> $$ = nterm opt_storage_encoding (: )
Entering state 6997
Stack now 0 13 779 1301 2221 3631 4834 4223 5333 6035 6612 6997
Reducing stack by rule 615 (line 5873):
   $1 = nterm ColId (: )
   $2 = nterm Typename (: )
   $3 = nterm create_generic_options (: )
   $4 = nterm ColQualList (: )
   $5 = nterm OptColCharset (: )
   $6 = nterm opt_storage_encoding (: )
-> $$ = nterm columnDef (: )
Entering state 4769
Stack now 0 13 779 1301 2221 3631 4769
Reducing stack by rule 606 (line 5795):
   $1 = nterm columnDef (: )
-> $$ = nterm TableElement (: )
Entering state 4767
Stack now 0 13 779 1301 2221 3631 4767
Reducing stack by rule 602 (line 5773):
   $1 = nterm TableElement (: )
-> $$ = nterm TableElementList (: )
Entering state 4766
Stack now 0 13 779 1301 2221 3631 4766
Next token is token ')' (: )
Reducing stack by rule 598 (line 5763):
   $1 = nterm TableElementList (: )
-> $$ = nterm OptTableElementList (: )
Entering state 4833
Stack now 0 13 779 1301 2221 3631 4833
Next token is token ')' (: )
Shifting token ')' (: )
Entering state 5641
Stack now 0 13 779 1301 2221 3631 4833 5641
Reading a token
Next token is token ';' (: )
Reducing stack by rule 707 (line 6510):
-> $$ = nterm OptInherit (: )
Entering state 6327
Stack now 0 13 779 1301 2221 3631 4833 5641 6327
Next token is token ';' (: )
Reducing stack by rule 709 (line 6521):
-> $$ = nterm OptPartitionSpec (: )
Entering state 6800
Stack now 0 13 779 1301 2221 3631 4833 5641 6327 6800
Next token is token ';' (: )
Reducing stack by rule 736 (line 6827):
-> $$ = nterm table_access_method_clause (: )
Entering state 7172
Stack now 0 13 779 1301 2221 3631 4833 5641 6327 6800 7172
Next token is token ';' (: )
Reducing stack by rule 739 (line 6834):
-> $$ = nterm OptWith (: )
Entering state 7468
Stack now 0 13 779 1301 2221 3631 4833 5641 6327 6800 7172 7468
Next token is token ';' (: )
Reducing stack by rule 751 (line 6933):
-> $$ = nterm OnCommitOption (: )
Entering state 7677
Stack now 0 13 779 1301 2221 3631 4833 5641 6327 6800 7172 7468 7677
Next token is token ';' (: )
Reducing stack by rule 524 (line 5139):
-> $$ = nterm create_table_options (: )
Entering state 7825
Stack now 0 13 779 1301 2221 3631 4833 5641 6327 6800 7172 7468 7677 7825
Next token is token ';' (: )
Reducing stack by rule 551 (line 5359):
   $1 = token CREATE (: )
   $2 = nterm OptTemp (: )
   $3 = token TABLE (: )
   $4 = nterm qualified_name (: )
   $5 = token '(' (: )
   $6 = nterm OptTableElementList (: )
   $7 = token ')' (: )
   $8 = nterm OptInherit (: )
   $9 = nterm OptPartitionSpec (: )
   $10 = nterm table_access_method_clause (: )
   $11 = nterm OptWith (: )
   $12 = nterm OnCommitOption (: )
   $13 = nterm create_table_options (: )
-> $$ = nterm CreateStmt (: )
Entering state 82
Stack now 0 82
Reducing stack by rule 73 (line 1935):
   $1 = nterm CreateStmt (: )
-> $$ = nterm stmt (: )
Entering state 62
Stack now 0 62
Reducing stack by rule 8 (line 1861):
   $1 = nterm stmt (: )
-> $$ = nterm stmtmulti (: )
Entering state 61
Stack now 0 61
Next token is token ';' (: )
Shifting token ';' (: )
Entering state 1042
Stack now 0 61 1042
Reading a token
Now at end of input.
Reducing stack by rule 139 (line 2002):
-> $$ = nterm stmt (: )
Entering state 1716
Stack now 0 61 1042 1716
Reducing stack by rule 7 (line 1849):
   $1 = nterm stmtmulti (: )
   $2 = token ';' (: )
   $3 = nterm stmt (: )
-> $$ = nterm stmtmulti (: )
Entering state 61
Stack now 0 61
Now at end of input.
Reducing stack by rule 1 (line 1791):
   $1 = nterm stmtmulti (: )
-> $$ = nterm parse_toplevel (: )
Entering state 60
Stack now 0 60
Now at end of input.
Shifting token "end of file" (: )
Entering state 1041
Stack now 0 60 1041
Stack now 0 60 1041
Cleanup: popping token "end of file" (: )
Cleanup: popping nterm parse_toplevel (: )

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值