返回顶部
首页 > 资讯 > 后端开发 > GO >golang怎么整合antlr语法校验
  • 262
分享到

golang怎么整合antlr语法校验

2023-07-05 07:07:59 262人浏览 八月长安
摘要

本篇内容介绍了“golang怎么整合antlr语法校验”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 背景在项目中我们可能会遇到表达式检

本篇内容介绍了“golang怎么整合antlr语法校验”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 背景

项目中我们可能会遇到表达式检索的场景,例如,输入以下表达式检索,需要解析表达式并得到检索结果。

ip="192.168.1.3" && (port="80" || protocol="Http")

此时,我们需要对语法进行校验、解析,应当如何做呢?

下面给大家推荐一种使用语法校验工具Antlr

Antlr是一个语法分析器,本身是用java实现的,然是Runtime的库也支持Golang、Java、python等。

2. goland安装antlr插件

打开goland,File --> Settings --> Plugins, 搜索antlr,安装 antlr4

golang怎么整合antlr语法校验

插件安装完成后,可以看到ANTLR Preview窗口,一会我们可以在这个窗口进行简单的语法校验。

golang怎么整合antlr语法校验

3. 编写语法校验规则

创建工程,引入包

go get -u GitHub.com/antlr/antlr4/runtime/Go/antlr/v4

在工程中新建一个antlr目录,创建一个后缀名为 .g4 的文件,作为规则文件。此处我们创建Rule.g4

// 定义语法名称,需要和文件名匹配grammar Rule;// DECIMAL, IDENTIFIER, COMMENTS, WS are set using regular expressions// key 为表达式中可支持的检索字段,可以是固定值(每个值中间用 | 隔开,是”或“的意思),也可以是正则表达式// value 使用正则表达式KEY : 'ip' | 'port' | 'protocol';//VALUE :'"' ( '""' | ~["\r\n] )* '"' ;//KEY : ('A' .. 'Z' | 'a' .. 'z' |  '_') + ;VALUE :'"' ( '\\"' | ~["] )* '"' ;// COMMENT and WS are stripped from the output token stream by sending// to a different channel 'skip'COMMENT : '//' .+? ('\n'|EOF) -> skip ;WS : [ \r\t\u000C\n]+ -> skip ;// 语法校验的入口start : logicalExpr* EOF;// 语法支持的结构logicalExpr    : comparisonExpr // 示例: key == value 表示支持 == 和 != 的表达式    | logicalExpr operator logicalExpr // 示例: key1 == value1 && key2 != value2 表示支持 && 和 || 运算符连接表达式    | lparen logicalExpr rparen // 示例: (key1 == value1 && key2 != value2) 表示支持 () 连接表达式    ;comparisonExpr    : KEY compare VALUE    ;compare    : '='    | '!='    ;operator    : '&&'    | '||'    ;lparen    :  '('    ;rparen    :  ')'    ;

初始化校验语法

选中Rule.g4 文件,鼠标右键,选择 Configure ANTLR Tool…

配置输出路径,和Rule.g4 同目录;配置语言,使用Go

golang怎么整合antlr语法校验

选中Rule.g4 文件,鼠标右键,选择 Generate ANTLR Recognizer,完成规则初始化

golang怎么整合antlr语法校验

树状图校验

golang怎么整合antlr语法校验

4. 语法校验

自定义listener

package parserimport ("github.com/antlr/antlr4/runtime/Go/antlr/v4""strings")type MyRuleListener struct {*BaseRuleListenerQueue    []interface{}QueueStr []string}// 注意:方法名必须是这个名字func (s *MyRuleListener) EnterComparisonExpr(ctx *ComparisonExprContext) {key := ctx.GetChild(0).(antlr.ParseTree).GetText()operator := ctx.GetChild(1).(antlr.ParseTree).GetText()value := ctx.GetChild(2).(antlr.ParseTree).GetText()if strings.HasPrefix(value, "\"") {value = value[1:]}if strings.HasSuffix(value, "\"") {value = value[:len(value)-1]}keyValue := map[string]string{}keyValue["key"] = keykeyValue["operator"] = operatorkeyValue["value"] = values.PushStr(ctx.GetText())s.Push(keyValue)}// EnterKeyValue is called when production KeyValue is entered.func (s *MyRuleListener) ExitOperator(ctx *OperatorContext) {s.Push(ctx.GetText())s.PushStr(ctx.GetText())}// EnterKeyValue is called when production KeyValue is entered.func (s *MyRuleListener) ExitLparen(ctx *LparenContext) {s.Push(ctx.GetText())s.PushStr(ctx.GetText())}// EnterKeyValue is called when production KeyValue is entered.func (s *MyRuleListener) ExitRparen(ctx *RparenContext) {s.Push(ctx.GetText())s.PushStr(ctx.GetText())}func (s *MyRuleListener) Push(i interface{}) {s.Queue = append(s.Queue, i)}func (s *MyRuleListener) PushStr(i string) {s.QueueStr = append(s.QueueStr, i)}

获取解析异常的错误信息

package parserimport "github.com/antlr/antlr4/runtime/Go/antlr/v4"type RuleErrorListener struct {antlr.ErrorListenerMsg string}func (l *RuleErrorListener) SyntaxError(recognizer antlr.Recognizer, offendingSymbol interface{}, line, column int, msg string, e antlr.RecognitionException) {l.Msg = msg}

校验

package mainimport (parser "antlr-demo/antlr""errors""fmt""github.com/antlr/antlr4/runtime/Go/antlr/v4")func main() {expre := "ip=\"192.168.1.3\" && (port=\"80\" || protocol=\"http\")"err := checkExpre(expre)if err != nil {fmt.Println(err)}}func checkExpre(expre string) error {input := antlr.NewInputStream(expre)var lexerErr parser.RuleErrorListenerlexer := parser.NewRuleLexer(input)lexer.AddErrorListener(&lexerErr)stream := antlr.NewCommonTokenStream(lexer, 0)ruleParser := parser.NewRuleParser(stream)ruleParser.BuildParseTrees = truevar ruleErr parser.RuleErrorListenerruleParser.AddErrorListener(&ruleErr)tree := ruleParser.Start()listener := new(parser.MyRuleListener)antlr.ParseTreeWalkerDefault.Walk(listener, tree)if lexerErr.Msg != "" || ruleErr.Msg != "" {return errors.New("输入的语法不正确")}expreList := listener.QueueStrfmt.Println("expreList--->", expreList)expreMap := listener.Queuefmt.Println("expreMap--->", expreMap)return nil}

结果验证

正确表达式

golang怎么整合antlr语法校验

key不在支持的语法内

golang怎么整合antlr语法校验

缺少key

golang怎么整合antlr语法校验

运算符不在支持的语法内

golang怎么整合antlr语法校验

缺少括号

golang怎么整合antlr语法校验

“golang怎么整合antlr语法校验”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: golang怎么整合antlr语法校验

本文链接: https://lsjlt.com/news/350286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang怎么整合antlr语法校验
    本篇内容介绍了“golang怎么整合antlr语法校验”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 背景在项目中我们可能会遇到表达式检...
    99+
    2023-07-05
  • golang整合antlr语法校验解析
    目录1. 背景2. goland安装antlr插件3. 编写语法校验规则4. 语法校验1. 背景 在项目中我们可能会遇到表达式检索的场景,例如,输入以下表达式检索,需要解析表达式并得...
    99+
    2023-02-28
    go antlr语法校验 go antlr antlr语法校验
  • 怎么使用Java校验SQL语句的合法性
    这篇文章主要介绍“怎么使用Java校验SQL语句的合法性”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Java校验SQL语句的合法性”文章能帮助大家解决问题。方案一:使用JDBC API中提...
    99+
    2023-07-05
  • Springboot整合Shiro怎么实现登录与权限校验
    这篇文章主要介绍“Springboot整合Shiro怎么实现登录与权限校验”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Springboot整合Shiro怎么实现登录与权限校验”文章能帮助大家解决问...
    99+
    2023-06-30
  • 怎么校验MD5值校验MD5值方法
    要校验一个MD5值是否有效,可以按照以下步骤进行:1. 获取原始数据的MD5值。可以使用MD5算法对原始数据进行计算,得到一个MD5...
    99+
    2023-09-17
    MD5
  • springboot整合JSR303参数校验与全局异常处理的方法
    目录一、前言二、JSR303简介三、导入依赖四、常用注解五、@Validated、@Valid区别六、常用使用测试1. 实体类添加校验2. 统一返回类型3. 测试类4. 普通测试结果...
    99+
    2024-04-02
  • 使用Java校验SQL语句的合法性五种解决方案
    方案一:使用JDBC API中提供的Statement接口的execute()方法 要在Java中校验SQL语句的合法性,可以使用JDBC API中提供的Statement接口的ex...
    99+
    2023-05-14
    java校验sql语句 java校验sql java校验
  • 怎么通过自定义spring invalidator注解校验数据合法性
    今天小编给大家分享一下怎么通过自定义spring invalidator注解校验数据合法性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
    99+
    2023-07-02
  • SpringBoot怎么整合Redis缓存验证码
    今天小编给大家分享一下SpringBoot怎么整合Redis缓存验证码的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、简介...
    99+
    2023-07-02
  • 如何用Java校验SQL语句的合法性?有这5种解决方案
    方案一:使用JDBC API中提供的Statement接口的execute()方法 要在Java中校验SQL语句的合法性,可以使用JDBC API中提供的Statement接口的execute()方法。这个方法会尝试执行给定的SQL语句,如...
    99+
    2023-10-02
    java sql python
  • Go怎么整合captcha实现验证码功能
    这篇“Go怎么整合captcha实现验证码功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go怎么整合captcha实现验...
    99+
    2023-07-05
  • SpringBoot怎么整合Canal方法
    这篇“SpringBoot怎么整合Canal方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎么整合C...
    99+
    2023-07-04
  • Linux系统中校验下载文件的完整性方法是怎样的
    本篇文章给大家分享的是有关Linux系统中校验下载文件的完整性方法是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Linux下的学习开始总是艰难的,但有的时候,却发现Li...
    99+
    2023-06-13
  • CRC校验原理及C语言实现的方法是什么
    这篇“CRC校验原理及C语言实现的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CRC校验原理及C语言实现的方法是...
    99+
    2023-07-05
  • python银行卡号码校验Luhn算法怎么用
    今天小编给大家分享一下python银行卡号码校验Luhn算法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、银行卡号...
    99+
    2023-06-30
  • springboot怎么整合shiro实现多验证登录功能
    这篇“springboot怎么整合shiro实现多验证登录功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“springbo...
    99+
    2023-06-08
  • 在Go语言中如何解决并发网络请求的请求参数校验和合法性问题?
    在Go语言中进行并发网络请求时,我们经常需要对请求参数进行校验和合法性检查。本文将介绍如何使用Go语言的并发特性来解决这些问题,并提供具体的代码示例。首先,我们需要使用Go语言的协程来同时发送多个网络请求。Go语言提供了goroutine来...
    99+
    2023-10-22
    并发(Concurrency) 请求参数校验(parameter validation) 合法性问题(validity
  • deepin20时间显示不准确怎么调整?deepin时间校正方法
    deepin20时间显示不准确怎么办?下面我们就来看看deepin20设置时间的技巧。 首先点任务栏上的【设置】。 在【设置】中点【时间日期】。 时间显示不准确是时区没设置好,这里点【修改系统时区】。 点击搜索框,输入...
    99+
    2022-05-26
    deepin 时间
  • Golang方法的语法是什么和怎么调用
    本篇内容主要讲解“Golang方法的语法是什么和怎么调用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang方法的语法是什么和怎么调用”吧!一、方法定义Golang中可以为任何类型定义方法...
    99+
    2023-07-05
  • 怎么利用ApiPost接口管理工具校验/测试接口返回结果是否符合预期?
    本文主要讲解接口管理工具ApiPost的预执行脚本和后执行脚本里,怎么校验/测试接口返回结果是否符合预期? ApiPost简介: ApiPost是一个支持团队协作,并可直接生成文档的API调试、管理工具。它支持模拟POST、GET、PUT等...
    99+
    2018-07-25
    怎么利用ApiPost接口管理工具校验/测试接口返回结果是否符合预期?
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作