当前位置:网站首页>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 .
边栏推荐
- Bert-whitening 向量降维及使用
- Go语言三个高效编程的技巧
- 15 differences between MES in process and discrete manufacturing enterprises (Part 2)
- [ansible problem processing] remote execution user environment variable loading problem
- Convolution kernel and characteristic graph visualization
- laravel下视图间共享数据
- Kunpeng arm server compilation and installation paddlepaddle
- 缓存使用中Redis,Memcached的共性和差异分析
- Keras deep learning practice (11) -- visual neural network middle layer output
- Some basic database operations (providing the original database information)
猜你喜欢

Go language concurrency model mpg model

v-for 中 key的作用和原理

c语言---18 函数(自定义函数)

Keras deep learning practice (11) -- visual neural network middle layer output

Common singleton mode & simple factory

Virtual machines on the same distributed port group but different hosts cannot communicate with each other

MySQL log management, backup and recovery

tongweb使用之端口冲突处理办法

laravel下视图间共享数据

探索云原生数据库,纵观未来科技发展
随机推荐
June training (day 23) - dictionary tree
左手代码,右手开源,开源路上的一份子
Database considerations
laravel 8 实现Auth登录
Development of B2B transaction collaborative management platform for kitchen and bathroom electrical appliance industry and optimization of enterprise inventory structure
laravel8使用faker调用工厂填充数据
Generate binary tree according to preorder & inorder traversal [partition / generation / splicing of left subtree | root | right subtree]
09_一种比较高效的记忆方法
R语言实战应用精讲50篇(二十三)-贝叶斯理论重要概念: 可信度Credibility, 模型Models, 和参数Parameters
Bert-whitening 向量降维及使用
在同花顺开户证券安全吗,需要什么准备
第八章 操作位和位串(四)
Laravel 8 realizes auth login
Py之toad:toad的简介、安装、使用方法之详细攻略
IList of PostgreSQL
leetcode.12 --- 整数转罗马数字
09_ An efficient memory method
Alibaba OSS object storage service
Jupiter notebook operation
3环杀掉360安全卫士进程