当前位置:网站首页>A brief introduction to the lexical analysis of PostgreSQL
A brief introduction to the lexical analysis of PostgreSQL
2022-06-24 14:27:00 【happytree001】
One 、 Lexical file structure
flex Lexical input file for .l Structure through %% Divided into three parts
Statement
The rules
c Code
In the statement %{ C Code declaration %} The contents of the package in will be copied directly to the generated C In the code ,
The last segment is also copied directly to the generated C In the code ,
The middle rule segment , Each rule consists of Pattern + action form , Patterns are usually written in regular expressions .
Two 、pg Lexical analysis file in
2.1 Declaration paragraph
src/backend/parser/scan.l
%{
/* LCOV_EXCL_START */
/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
#undef fprintf
#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
static void
fprintf_to_ereport(const char *fmt, const char *msg)
{
ereport(ERROR, (errmsg_internal("%s", msg)));
}
/*
* GUC variables. This is a DIRECT violation of the warning given at the
* head of gram.y, ie flex/bison code must not depend on any GUC variables;
* as such, changing their values can induce very unintuitive behavior.
* But we shall have to live with it until we can remove these variables.
*/
int backslash_quote = BACKSLASH_QUOTE_SAFE_ENCODING;
bool escape_string_warning = true;
bool standard_conforming_strings = true;
...
%}
...
%option nodefault
%option noinput
%option nounput
%option noyywrap
%option noyyalloc
%option noyyrealloc
%option noyyfree
%option warn
%option prefix="core_yy"
...
%%
2.2 Rule segment
{whitespace} {
/* ignore */
}
{xcstart} {
/* Set location in case of syntax error in comment */
SET_YYLLOC();
yyextra->xcdepth = 0;
BEGIN(xc);
/* Put back any characters past slash-star; see above */
yyless(2);
}
<xc>{
{xcstart} {
(yyextra->xcdepth)++;
/* Put back any characters past slash-star; see above */
yyless(2);
}
...
%%
/* LCOV_EXCL_STOP */
2.3 C code paragraph
/* * Arrange access to yyextra for subroutines of the main yylex() function. * We expect each subroutine to have a yyscanner parameter. Rather than * use the yyget_xxx functions, which might or might not get inlined by the * compiler, we cheat just a bit and cast yyscanner to the right type. */
#undef yyextra
#define yyextra (((struct yyguts_t *) yyscanner)->yyextra_r)
/* Likewise for a couple of other things we need. */
#undef yylloc
#define yylloc (((struct yyguts_t *) yyscanner)->yylloc_r)
#undef yyleng
#define yyleng (((struct yyguts_t *) yyscanner)->yyleng_r)
/* * scanner_errposition * Report a lexer or grammar error cursor position, if possible. * * This is expected to be used within an ereport() call, or via an error * callback such as setup_scanner_errposition_callback(). The return value * is a dummy (always 0, in fact). * * Note that this can only be used for messages emitted during raw parsing * (essentially, scan.l, parser.c, and gram.y), since it requires the * yyscanner struct to still be available. */
int
scanner_errposition(int location, core_yyscan_t yyscanner)
{
int pos;
if (location < 0)
return 0; /* no-op if location is unknown */
/* Convert byte offset to character number */
pos = pg_mbstrlen_with_len(yyextra->scanbuf, location) + 1;
/* And pass it to the ereport mechanism */
return errposition(pos);
}
...
2.4 Final generated lexical analysis file
src/backend/parser/scan.c
adopt flex Tools , Yes scan.l Document processing , It will eventually generate scan.c Code , Used for subsequent pairs of sql Lexical analysis of language .
边栏推荐
- PgSQL queries the largest or smallest data of a field in a group
- ESP32系列--ESP32各个系列对比
- c语言---18 函数(自定义函数)
- IDEA 插件 Material Theme UI收费后的办法
- Keyword of ES mapping; Term query add keyword query; Change mapping keyword type
- 常见的单例模式&简单工厂
- 09_ An efficient memory method
- 缓存使用中Redis,Memcached的共性和差异分析
- The difference between V-IF and v-show
- 在同花顺开户证券安全吗,需要什么准备
猜你喜欢
随机推荐
10 Ces autographes très stylisés.
Go language - use of goroutine coroutine
IDEA 插件 Material Theme UI收费后的办法
左手代码,右手开源,开源路上的一份子
简谈企业Power BI CI /CD 实施框架
laravel 8 实现Auth登录
15 differences between MES in process and discrete manufacturing enterprises (Part 2)
个人如何开户炒股 炒股开户安全吗
Preliminary study on AQS
实战 | 记一次曲折的钓鱼溯源反制
GO语言并发模型-MPG模型
如何避免下重复订单
R语言实战应用精讲50篇(二十三)-贝叶斯理论重要概念: 可信度Credibility, 模型Models, 和参数Parameters
Jupiter notebook operation
日常知识科普
How to avoid placing duplicate orders
Application of motion capture system in positioning and mapping of mobile robot in underground tunnel
Halcon draw area into picture
PgSQL queries the largest or smallest data of a field in a group
ESP32系列--ESP32各个系列对比








