PostgreSQL词法语法解析器与dblink简易实现的关联

昨天有人说没明白那个Op是怎么回事,我们再仔细捋捋。代码在 src/backend/parser 下边,打开他们细细品味,非常简单。

scan.l与gram.y是截然不同的,当然是这样,前者是flex脚本,而后者是yacc脚本;前者是词法分析,而后者是语法分析。

来看scan.l中的操作符定义,它是由一个或者多个如下字符组成:~!@#^&`?+-*/%<>=,所以我们才说table_remote@dblink 要用操作符来定义,其它字符则可以直接使用,例如:name_list ',' name,这里逗号可以作为一个语法元素,因为它并没有出现在词法引擎定义的字符列表中。

op_chars		[\~\!\@\#\^\&\|\`\?\+\-\*\/\%\<\>\=]
operator		{op_chars}+

 继续往下看,scan.l里针对 operator 的代码:

{operator}		{
(……中略)
					yylval->str = pstrdup(yytext);
					return Op;
				}

这里决定字符序列是否是Op,如果是,gram.y就会得到指示:下个token是Op。

Op在gram.y生成的gram.h里边可以找到定义:

#define Op 263

gram里边还能够知道这个token是不是 @ ,字符串比较就可以,因为它在gram.y里就是这么定义的:

%token <str>	IDENT FCONST SCONST BCONST XCONST Op

更多文章:
IBM《Yacc 与 Lex 快速入门》
谷歌、必应

书籍
《lex与yacc》

我不知道还能怎么更详细,多看多悟,自然就知道。

转载于:https://my.oschina.net/quanzl/blog/3070853

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值