BBT BNF Parser - 基于BNF的通用解析器

由标准C++编写并且可转换到Dot语言的BNF语法分析器 用于将BNF转换成Graphviz代码,内部构建了一个完整的BNF词法语法分析器,会对BNF范式进行检测,有问题将会报详细错误 阅读详情

这是一个通用的文本解析器. 他的使用类似于正则表达式, 但比正则表达式更复杂, 可以用来解析更复杂的文本.
所谓"通用", 指的是只要你能用BNF按照一定的规则正确的将你要解析的内容描述出来, 那么就可以使用这个解析器来解析对应的文本.

举个例子说, 我现在想要解析MS SQL Server所使用的TSQL语言定义的查询语句, 那么比较直接的办法就是找来MSDN, 研究其中的SQL各种Statement的定义, 然后按部就班的写一个复杂的程序来解析. 显然, 要做这样一个解析器还是相当复杂和花时间的.

那我的这个BNFParser可以帮你作那些事呢?你可以这么做: 1.研究MSDN中关于TSQL的语法(这个步骤是不能省的, 要有这个知识储备); 2.将MSDN中相关的TSQL用BNF描述出来(事实上MSDN就是用类似BNF的语法来描述的, 只是细节表述不同罢了);3.将得到的BNF作为BNFParser的输入参数, 就行了.只要有了正确的BNF, 我的通用解析器就可以工作了, 你可以试着解析一些SQL语句, 然后会得到一个结果树, 这棵树的结构和你的BNF定义的结构一致, 你可以根据你的需要进行处理了.

在我的安装包中我就包含了一个这样的TSQL的解析器, 有兴趣的朋友可以试试.

要注意的是: 请勿将这个安装包作商业用途, 本软件的一切权利除明确声明外均由原作者保留.

若发现有什么问题, 可以发Email联系:bbtsoft@gmail.com

 示例中的代码片段
     //创建Parser
     GeneralBNFBasedParser bnfSyntaxParser = new GeneralBNFBasedParser();
     //提供准备好的BNF语法
     bnfSyntaxParser.BNFSyntaxScript = strSyntax;
     //解析一段SQL语句
     ParsingResult result=null;
     string strParsingContent=“Select Col1, Col2, Col3*Col4-5 as Col0 From TableA t0 join TableB t1 on t0.Col1=t1.xx where t1.yy='55-66-77'";
     try
     {
            result = bnfSyntaxParser.PareseContent("SQL_Statement", strParsingContent);
     }
     catch (Exception ex0)
     {
            Console.WriteLine("Failed to parsing the sql statement, error message=" + ex0.Message);
            return;
     }
     //根据需求处理结果
     ...

BBT BNFParser 1.0
 
使用 Python 开发一个 Python 解释器 t.value = int(t.value)return tdef t_error(t):print(f"keyword not found: {t.value[0]}\nline {t.lineno}")t.lexer.skip(1)def t_newline(t):r"“”\n+“”"t.lexer.lineno += t.value.count(“\n”)为导入词法分析器,我们将使用:import ply.lex as lext_ 是一个特殊的前缀,表示定义标记的规则。每条词法规则都是用正则表达式制作 阅读详情

相关推荐

【游戏编程扯淡精粹】解析器实现模式

【游戏编程扯淡精粹】解析器实现模式 2020年1月7日 我已经写了几个parser了,parser是有标准实现模式,以及测试方法 如何解析一门语言? 在开始动手之前: 先简单学习这门语言 然后获取语言的ANTLR语法,没有的话可以参考BNF自己翻译成ANTLR语法 输入之前学习时的语言代码到ANTLR来查看AST,相当于测试语法,确保自己写的语法正确 这个过程需要熟悉语法规格(syntax specification),对语义有一个初步认识 Lexer做什么 lexer也就是一个tokenizer,将原

游戏编程扯淡精粹 552

BNF范式查看器

巴科斯范式(BNF)查看器,可查看BNF范式生成的First集,Follow集,Select集和预测分析表,是学习编译原理的好工具。 附带标准c的bnf范式文件。

Python 文本解析器

首先我们需要有一个文本块生成器把纯文本分成一个一个的文本块,以便接下来对每一个文本快进行解析,util.py 代码如下:#!/usr/bin/pythondef lines(file):“”"生成器,在文本最后加一空行“”"for line in file: yield lineyield ‘\n’def blocks(file):“”"生成器,生成单独的文本块“”"block = []for line in lines(file):if line.strip():block.append(line)eli

2401_89317622的博客 1104

bnf2xml:简单的BNF解析器使xml标记匹配-开源

bnf2xml是一个简单的BNF解析器,它将文本作为输入,根据BNF查询文件进行搜索,并输出由显示上下文的xml标签标记的文本。 bnf2xml与任何文本二进制文件(即awk(1)grep(1))一样使用简单。 bnf2xml不需要C API,因为它输出简单的xml标签。 自述文件在文件dl页面上可见。 示例:$ echo“ hi” | bnf2xml模式文件H 一世或者碘化氢patternfile表示如何在大海捞针中查找针头以及如何显示,即: :: = a | b | c | d ... :: = + bnf2xml是自上而下的递归解析器。 与gcc(1)或一些自上而下的高级解析器不同,bnf2xml完全明确/可以解决所有冲突。 在ave上变慢。 解析C或sed(1)进行简单搜索。 比使用flex / C创建解析器容易得多。 需要注意的是:我不建议使用bnf2xml创建一个新的gcc(1)。 bnf2xml第n个BETA版本,但还没有抱怨。

一个非常好的ABNF免费解析器

记下来,以后留做它用: http://www.goldparser.org/index.htm 维基百科关于BNF的介绍和相关链接: http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form 另外一个BNF解析器: http://bnfparser2.sourceforge.net/download.html

娃娃鱼的专栏 1094

谈谈Parser

一直很了解人们对于parser的误解,可是一直都提不起兴趣来阐述对它的观点。然而我觉得是有必要解释一下这个问题的时候了。我感觉得到大部分人对于parser的误解之深,再不澄清一下,恐怕这些谬误就要写进歪曲的历史教科书,到时候就没有人知道真相了。 什么是Parser首先来科普一下。所谓parser,一般是指把某种格式的文本(字符串)转换成某种数据结构的过程。最常见的parser,是把程序文本转换成编

00的专栏 1956

深入浅出数据库 parser

本文将主要讨论 SQL 是如果被解析成抽象语法树的。简单来说,就是如何将 SQL 字符串如果解析成相应数据库语言的结构体。

MatrixOrigin的博客 785

基于Predictive Parsing的ABNF语法分析器(十一)——AbnfParser文法解析器之重复文法(repetition)

今天写的是关于重复文法的解析,ABNFBNF相比,一个明显的差异就是引入了重复语法,使得我们可以方便的让一个文法元素重复若干次。 例如30"B"表示30个字母B,30*60表示最少30个,最多60个字母B,等等。 先来看看解析部分的代码: /* This file is one of the component a Context-free Grammar Parser Gen

码农的理想国 1955

基于BNF范式的M3中Schema板架语言的解析

基于BNF范式的M3中Schema板架语言的解析 by eattonton 摘要:M3系统中提供了一套完整的板架参数化建模系统,基于这套系统为设计员提供了建立船体结构的基础。随着M3在我国造船工业中的广泛应用,理解M3这套参数化系统的建模系统变得很有必要。参数化建模中除了提供了界面输入参数外,还提供了Schema语句的方式。这篇文章将对Schema(Sch)语句进行语义的解析。 关键字: M

TriWeb_Ton的博客 1365

刀:刀是Java自上而下的解析器生成器,用于根据BNF格式的语法构建解析器

刀 Knife是一种工具,可读取输入语法规范并将其转换为可以通过简单接口解析给定语法的几个Java类。 刀不需要任何外部库或依赖项。 所有生成都提前完成。 生成解析类后,您可以将它们复制到您的项目中。 另外,与其他优秀的解析器生成工具一样,S刀使用自身来读取输入语法。 目录 :glowing_star: 刀vs JavaCC 是生成Java解析器的最受欢迎的工具之一。 但是,已经开发了刀来消除JavaCC的某些缺点。 这是一个比较表: 特征 刀 JavaCC LL(1)解析器生成 :check_mark: :check_mark: Lexer一代 :cross_mark: :check_mark: 下推式自动解析 :check_mark: :cross_mark: 递归下降解析 :cross_mark: :check_mark: 等效语法生成用于左递归语法 :check_mark: :cross_mark: 错误恢复 :check_mark: :check_mark: 没有运行时依赖 :check_mark: :che

BNF 和EBNF的含义与用法

BNF 和EBNF的含义与用法(感谢译者:Sunnybill)By: Lars Marius Garshol 原文参见:http://www.garshol.priv.no/download/text/bnf.html(本文是上述作者文章的翻译,原文版权归作者所有)(译者:Sunnybill)BNF 和EBNF的含义与用法 1简介       关于本文      

石头记 7454

BNF的使用及示例

BNF & Augmented BNF 巴科斯范式 确切地说,早在UNESCO(联合国教科文组织)关于ALGOL 58的会议上提出的一篇报告中,Backus就引入了大部分BNF符号。虽然没有什么人读过这篇报告,但是在Peter Naur读这篇报告时,他发现Backus对ALGOL 58的解释方式和他的解释方式有一些不同之处,这使他感到很惊奇。首次设计ALGOL的所有参与者都开始发现了他的...

lak的专栏 8786

Scala词法文法解析器 (一)解析SparkSQLBNF文法

平台公式及翻译后的SparkSQL 平台公式的样子如下所示: if(XX1_m001[D003]="邢おb7肮α䵵薇"||XX1_m001[H003]<"2") && XX1_m001[D005]!="wed"thenXX1_m001[H022,COUNT] 这里面字段值"邢おb7肮α䵵薇"为这个的目的是为了测试各种字符集是否都能匹配满足。那么对应的SparkS...

weixin_30595035的博客 283

语法格式描述规范BNF、EBNF、ABNF

1. 简介 BNF 是最原始,最简单的方法,主要用于理论背景的学术论文中,以与人类进行交流。(与在编译器/解析器中使用相反)。BNF 没有确切的规范。 EBNF 是 Extended BNF (扩展的BNF)的缩写。没有一个标准的 EBNF,因为每个作者或程序都定义了自己的稍有不同的 EBNF 变体。 ABNF 是 augmented BNF(增强型BNF)的缩写,ABNF 的语法 与 BNF 完全不同,但是更加标准化,利于解析器的翻译,但不利于阅读; BNF、EBNF、ABNF 这三者的表达能力是等效

君一席 8397

DBeaver AI智能分类:数据库错误诊断的革命性突破

你是否曾在数据库管理工作中被各种复杂的错误信息困扰?当DBeaver插件出现问题时,面对满屏的技术术语和堆栈跟踪,你是否感到无从下手?今天,我们将一起探索DBeaver如何通过AI智能分类技术彻底改变错误诊断体验,让智能故障排查成为现实。 ## 从手动排查到AI智能诊断的演变 在传统的数据库管理工具中,错误处理往往是一个令人头疼的过程。想象一下这样的场景:你在使用DBeaver连接MySQL

gitblog_00044的博客 595

一个例子通俗理解Java中正则表达式用法

java.util.regex.Pattern; java.util.regex.Matcher;

asdfg1258963的博客 187
bbtsoft
博客等级 码龄20年 0粉丝 1原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值