Bison解析sql

2023-11-19

 

Bison文件组成,主要分为3部分

%{
1. 序言 (Prologue)
   声明全局标识符,定义数据类型、变量和宏,包含头文件,等。
%}

   声明 (declarations)
   声明终结符,非终结符,运算符的优先级,符号语义值的各种类型。

%%

2. 语法 (Grammar rules)
   定义每一非终结符的语法规则。

%%

3. 结言 (Epilogue)
   定义序言中声明的函数,以及剩余的所有程序。开发者定义自己的函数 ,格式与 C语言定义函数相同。

第一部分:

序言:

%{

#include <stdlib.h>

#include <stdarg.h>

#include <string.h>

#include <stdio.h>

#include <malloc.h>

char * parsetreeroot=NULL;

extern "C" int yylex();

extern "C" int yyparse();

extern "C" void yyerror(const char *s, ...);

char globalInputText[10000];

int globalReadOffset;

%}

声明

%union {

    int intval;    

    double floatval;   

    char* strval;

    int subtok;

}

union就是把所有使用到的数据类型、变量声明在一起,然后供%type 和%token 来具体声明每个标记对应的变量类型。

%token <strval> NAME

%token <strval> STRING

%token <strval> INTNUM

token声明终结符的类型,终结符 (Terminal symbol)不可再分的符号,类似数据库中的关键字

%type <strval> stmt_root  create_stmt para_list definition  data_type pro_block pro_parameters declare_list set_list

%type <strval> assign_var  pro_body pro_stmt_list sql_stmt expr

type用于声明非终结符的类型,非终结符 (Nonterminal symbol)可以展开为更小的结构。每一非终结符用一条规则来定义。

优先级定义:

为了避免过多的语法冲突,在这里定义一些语法优先级,从上到下优先级依次递增

%left           OR
%left           AND
%right          NOT
%nonassoc       IS ISNULL NOTNULL       /* IS sets precedence for IS NULL, etc */
%nonassoc       '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS

left左结合,right右结合

第二部分

所有规则的定义

bison语法是由一系列的规则组成。每个规则由非终结符开始,然后是“:”和可能为空的符号、文字记号和动作的列表。 例如:

simple_select:
                        SELECT opt_all_clause opt_target_list
                        into_clause from_clause where_clause
                        group_clause having_clause window_clause
                                {
                                        SelectStmt *n = makeNode(SelectStmt);
                                        n->targetList = $3;
                                        n->intoClause = $4;
                                        n->fromClause = $5;
                                        n->whereClause = $6;
                                        n->groupClause = $7;
                                        n->havingClause = $8;
                                        n->windowClause = $9;
                                        $$ = (Node *)n;
                                }
                        |
                        ……
                        ……
                        ……
                        ;
  1. “:”左边为非终结符。
  2. “:”右边为规则,由一系列的终结符或非终结符构成。
  3. “$$”,表示simple_select。
  4. “$number”,表示“:”右边符号,数字为几,则表示第几个符号。
  5. “|”,表示或,“simple_select”其他规则。
  6. { }是具体每项展开对应的用户编程 内容 ,然后以分号结束 。

移进与归约(压栈和出栈操作)

shift  移进
    把输入流中的下一个 token 移入分析栈。

reduce  归约
    归约分析栈顶中已识别的规则。当分析栈顶的符号序列匹配某规则右端时,用该规则的左端替换之。

当bison处理一个语法分析树时,会创建一组状态,每个状态对应一个或者多个分析过的规则中的可能的位置。当读到的记号不足以结束一条规则的时候,就会把这个记号压入一个内部堆栈,然后切换到新状态,这个过程叫做移进。当压入栈内的所有的语法符号已经等价于一个规则的右部时,就把这些符号全部弹出,把规则的左部压入栈。这个过程叫做规约。

例如:

statement :NAME '=' expression

expression :NUMBER '+' NUMBER

      |NUMBER '-' NUMBER

具体例子:

fred=12+13

语法分析器一次移进一个记号。

堆栈:

fred

fred =

fred =12

fred=12 +

fred =12+13                 把12+13 规约成expression,12+13弹出,expression压入

fred = expression     把fred = expression规约成statement   fred = expression弹出,statement压入

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bison解析sql 的相关文章

随机推荐

  • SonarQube集成golang检测(10)

    sonar集成golang的检测工具 sonar中的插件SonarGo自带一些检测规则 但sonar想要集成golang的覆盖率 单元测试报告 和更多的代码规则 需要集成其他golang的检测工具 单元测试 通过golang的单元测试工具g
  • mysql8.0以上初始化以及忘记密码的方法

    Mysql8 0以上忘记初始密码时重置的方法 摘要 第一步 关闭Mysql服务 第二步 跳过Mysql密码验证 第三步 无密码方式进入Mysql 第四步 将登陆密码设置为空 第五步 更改自己的登陆密码 最后一步 验证密码是否修改成功 摘要
  • 网络收集的逻辑思维题

    一个有意思的逻辑训练题目 题目如下 有两个大于1小于100的自然数x y 老师告诉小明两个数的和 告诉小强两个数的积 已知小明和小强足够聪明 下面是两个人的对话 小强 我不知道这两个数是多少 lt 沉默中 gt 小明 我知道你不知道 我不知
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • Spring-OSGI 1.0 M3 中文手册(Spring Dynamic Modules Reference Guide for OSGi(tm) Service Platforms)

    Spring OSGI 1 0 M3 中文手册 Spring Dynamic Modules Reference Guide for OSGi tm Service Platforms Spring Dynamic Modules Refe
  • scrapy-单线程爬取并存入mwsql

    scrapy基本结构 爬取流程 定义随机请求头 抓取异步网页请参考 scrapy框架 基础结构加爬取异步加载数据的网址项目完整实例 items py class BooksItem scrapy Item define the fields
  • 任务五:使用LightGBM对数据进行分类并评估

    1 对前几部得到的特征进行分类 主要用到sklearn中的LightGBM进行评估 并用网格搜索进行参数调优 2 Lightgbm是2017年在当时的NeurIPS 当时为NIPS 上发表的论文 文中主要是相比于XGBoost LightG
  • 前端面试的话术集锦第 18 篇博文——高频考点(HTTP协议 & TLS协议)

    这是记录前端面试的话术集锦第十八篇博文 高频考点 HTTP协议 TLS协议 我会不断更新该博文 1 HTTP 请求中的内容 HTTP请求由三部分构成 分别为 请求行 首部 实体 请求行大概长这样GET images logo gif HTT
  • 基于QT学习,小部件自适应QMainWindow窗口的大小

    基于QT学习 小部件自适应QMainWindow窗口的大小 使用QT Creator创建桌面QT应用 QT5 网上找了许多资源发现都不是自己想要的效果 本文的方法是使用纯代码写的 未使用mainwindow ui画的 第一次写博客 直接贴代
  • 文心一言与GPT-4比对测试!

    Waitlist了三个星期 今天下午终于拿到了百度文心一言的体验资格 于是立刻展开测试 根据文心一言网页端信息显示 目前最新发版是4月1号的版本 版本号是v1 0 3 应该是从上个月16号发布会以后又做了两版迭代 根据文心一言自己的回答 可
  • OkHttp工具类在微服高并发场景中问题实践总结

    OkHttp工具类在微服高并发场景中问题实践总结 问题场景 我的应用是一个中间业务应用XXApp 一个交易请求进来需要依赖下游应用 采用http协议通讯方式 需要调用3 4次下游请求 老XXApp在生产上有大量Close wait问题 可以
  • 怎么用python画sin函数图像_如何使用python的matplotlib模块画正弦函数图像

    python是一个很有趣的语言 可以在命令行窗口运行 python中有很多功能强大的模块 这篇经验告诉你 如何利用python的matplotlib模块 绘制正弦函数y sin x 的图像 工具 原料 windows系统电脑一台 pytho
  • Android 实战项目分享(一)用Android Studio绘制贝塞尔曲线的艺术之旅

    一 项目概述 欢迎来到创意之源 我们精心打造的绘图应用程序将带你进入一个充满艺术和技术的奇妙世界 通过使用Android Studio 我们实现了绘制贝塞尔曲线的功能 让你能够轻松创作出令人惊叹的艺术作品 不论你是热爱绘画的大学生还是渴望学
  • SyntaxError: can't assign to operator

    变量名不能有
  • 计算机图像视频处理

    计算机图像视频处理 计算机视觉概论 计算机视觉概念 计算机图像处理 也即数字图像处理 Digital Image Processing 是指将图像信号转换成数字信号并利用计算机对其进行处理的过程 是通过计算机对图像进行去除噪声 增强 复原
  • CVPR 2018

    感谢阅读腾讯 AI Lab 微信号第 32 篇文章 CVPR 2018上涌现出非常多的优秀论文 腾讯 AI Lab 对其中精华文章归类与摘要 根据受关注程度 对生成对抗网络 视频分析与理解和三维视觉三大类论文进行综述 第一部分 生成对抗网络
  • 强网杯 2019]随便注 【SQL注入】四种解法

    题目简介 题目名称 强网杯 2019 随便注 1 题目平台 BUUCTF 题目类型 Web 考察知识点 SQL注入 解题步骤 方法一 首先启动并访问靶机 有一个输入框 随便输入1 or 1 1 测试一下是否存在sql注入 提交后提示erro
  • 前端八股文-Nodejs介绍,组成,架构和依赖,特点,运行环境安装,包和NPM,NPM包的版本管理,V8 引擎 和 libuv 库,BFF 中间层,服务端渲染,

    01 Node js介绍 前言 Node 的重要性已经不言而喻 很多互联网公司都已经有大量的高性能系统运行在 Node 之上 Node 凭借其单线程 异步等举措实现了极高的性能基准 此外 目前最为流行的 Web 开发模式是前后端分离的形式
  • 一文搞定Mysql+Navicat16长期免费直连数据库安装教程

    一 Mysql安装包的下载 这里下载的是mysql8版本 第一个安装包比较小 第二个安装包比较大 因为包含调试工具 我这里下载的是第一个 二 解压并配置安装目录 这里浏览器默认的下载路径是TempEdgeDownload 把解压后的文件夹移
  • Bison解析sql

    Bison文件组成 主要分为3部分 1 序言 Prologue 声明全局标识符 定义数据类型 变量和宏 包含头文件 等 声明 declarations 声明终结符 非终结符 运算符的优先级 符号语义值的各种类型 2 语法 Grammar r