scala 实现表达式解析
表达式解析
import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource = "source_1"private val saleChannel = "saleChannel"val datas = new mutable.HashMap[String, String]();// p1, source1, sale1, source_1 & ( sale_channel_1 | sq )"datas.put("source_1", "source_1");datas.put("saleChannel", "saleChannel");datas.put("orderSource", "orderSource");val expr = s"orderSource:source_1 & ( saleChannel:saleChannel | orderSource:orderSource )"private val tokens: Array[String] = expr.split("\\s+")private val optStack = new mutable.ArrayStack[String]()private val memberStatck = new mutable.ArrayStack[String]()private var flag = false;def matchFiled(fieldName: String): String = {fieldName match {case "orderSource" => orderSourcecase "saleChannel" => saleChannelcase _ => throw new IllegalArgumentException(s"unknown filed name: ${fieldName}, it's can only be 'orderSource' or 'saleChannel'")}}@Testdef expParseTestCase() = {var opt = ""def exprProcess = {if (opt == "" || opt == "(") opt = optStack.pop()while (opt != null && opt != "(" && memberStatck.nonEmpty) {opt match {case "|" => {if(memberStatck.size > 1) {val m1 = memberStatck.pop().split(":")val m2 = memberStatck.pop().split(":")flag = datas.getOrElse(m2(1), "N").eq(matchFiled(m2(0))) || datas.getOrElse(m1(1), "N").eq(matchFiled(m1(0)))println(s"""[&]: ${datas.getOrElse(m2(1), "N")}.eq("${matchFiled(m2(0))}") || ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}")""")} else {val m1 = memberStatck.pop().split(":")flag = flag || datas.getOrElse(m1(1), "N").eq(matchFiled(m1(0)))println(s"""[&]: ${flag} || ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}""")}}case "&" => {if (memberStatck.size > 1) {val m1 = memberStatck.pop().split(":")val m2 = memberStatck.pop().split(":")flag = datas.getOrElse(m1(1), "N").equals(matchFiled(m1(0))) && datas.getOrElse(m2(1), "N").equals(matchFiled(m2(0)))println(s"""[&]: ${datas.getOrElse(m1(1), "N")}.eq("${matchFiled(m1(0))}") && ${datas.getOrElse(m2(1), "N")}.eq("${matchFiled(m2(0))}")""")} else {val m1 = memberStatck.pop().split(":")flag = flag && datas.getOrElse(m1(1), "N").equals(matchFiled(m1(0)))println(s"""[&]: ${false} && ${datas.get(m1(1))}.eq("$saleChannel")}.eq("${matchFiled(m1(0))}")""")}}}if (optStack.nonEmpty) opt = optStack.pop()}}tokens.foreach {case ")" => {exprProcess}case token@("|" | "&" | "(") => {optStack.push(token)}case token => {memberStatck.push(token)}}println("expr match complete :) ")if(memberStatck.nonEmpty) {exprProcess}println(flag)println(optStack)println(memberStatck)}}
输出
[&]: saleChannel.eq("saleChannel") || orderSource.eq("source_1")expr match complete :) [&]: false && Some(source_1).eq("saleChannel")}.eq("source_1")true
ArrayStack()
ArrayStack()
相关文章:
scala 实现表达式解析
表达式解析 import org.junit.Testimport scala.collection.mutableclass ExprTestCase {private val orderSource "source_1"private val saleChannel "saleChannel"val datas new mutable.HashMap[String, String]();// p1, source1, sale1, source…...
分布式事务seata的AT模式介绍
分布式事务seata的AT模式介绍 seata是阿里开源的一款分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,本文主要介绍AT模式的使用。 seata安装 下载seata服务,官方地址…...
初识Linux(1),看了这篇文章,妈妈再也不用担心我Linux找不到门了。
文章目录 前言1. ls 指令例如:只显示文件名属性ls显示文件详细属性 ls - l 该操作可以简写成ll查看隐藏文件ls -l -a 2.pwd例如:显示当前目录所处的路径类似于windows如下操作: 3.cd 指令例如:改变工作目录相当于windows如下操作 4.whoami 指…...
甲烷产生及氧化
温室气体排放被认为是加速气候变化的重要因素,甲烷(CH4)是仅次于二氧化碳(CO2)的重要温室气体,其百年温室效应潜势是CO2的28倍[1-2]。湿地中的CH4由产甲烷古菌在水体底部或沉积层严格厌氧环境下产生并释放进入水体,产生的CH4向上覆水运输过程…...
Javascript的form表单校验输入框
以下是HTML代码: <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名:</label><input type"text" id"name" name"name"><br><l…...
大数据-之LibrA数据库系统告警处理(ALM-37003 GTM主备不同步或者GTM主备断连)
告警解释 当GTM主实例与GTM备实例连接异常或者GTM主实例未处于同步状态时,产生该告警。 告警属性 告警ID 告警级别 可自动清除 37003 严重 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务名称 RoleName 产生告警的角色名称 HostName 产…...
python每日一题——4移动0
题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0]…...
CAN实验
CAN 寄存器 HAL库函数 代码 #include "./BSP/CAN/can.h"CAN_HandleTypeDef g_can1_handle; CAN_TxHeaderTypeDef g_can1_txheader; CAN_RxHeaderTypeDef g_can1_rxheader;/* STM32F103 TS1 8 TS2 7 BRP 3 波特率:36000 / [(9 8 1) * 4] 500Kbps …...
(一)pytest自动化测试框架之生成测试报告(mac系统)
前言 我们可以通过pytest-html插件来生成测试报告,但是pytest-html插件生成的测试报告不够美观,逼格也不够高,通过allure生成的测试报告是比较美观的,花里胡哨的,能够提升一个level。 allure官网: Allure…...
微服务实战系列之Nginx
前言 Nginx?写了那么多文章,为什么今天才轮到它的表演?那是因为它实在太重要了,值得大书特书,特别对待。 当我们遇到单点瓶颈,第一个idea是?Nginx; 当我们需要反向代理,…...
使用rsync从OpenShift的pod复制文件
环境 Red Hat Enterprise Linux release 8.6 (Ootpa)OCP 4.12.22 准备 安装rsync: yum install rsync 查看pod: [rootapi.kai1123.cp.fyre.ibm.com ~]# oc get pod -n cpd-instance | grep dmc ...... ibm-dmc-1700727413211000-monitor-0 …...
解决Activiti5.22流程图部署在Windows上正常,但在linux上部署后出现中文变方块的问题
总结/朱季谦 楼主最近在做公司的工作流平台,发现一个很无语的事情,Activiti5.22的流程图在Windows环境上部署,是可以正常查看的,但发布到公司的Linux服务器上后,在上面进行流程图在线部署时,发现中文都变成…...
EMG肌肉电信号处理合集(三)
本文主要展示常见的肌电信号预处理的实现,开发环境为matlab。 目录 1 肌电信号低通,高通,带通滤波 2 去除DC 0阶偏置,1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通…...
GitHub桌面版
GitHub桌面版 一、GitHub 桌面版二、clone 仓库三、更新仓库 一、GitHub 桌面版 二、clone 仓库 三、更新仓库...
【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界
在这个充满科技魅力的时代,我们可以通过各种方式去了解和探索自然界的奥秘。而昆虫作为地球上最为丰富多样的生物群体之一,其独特的生活习性和形态特征一直吸引着人们的目光。 由广州华锐互动开发的昆虫3D虚拟动态展示系统,成为了一种全新的科…...
《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
功能: 1、可以在收缩栏插件中添加界面 2、可以把界面展开或收缩 3、可以用鼠标拖动界面改变界面的排放顺序 源码放在最下方 1、可以在收缩栏插件中添加界面 virtual void addWidget(QWidget* widget, const QString& label, const QIcon& icon QIcon())…...
运行软件报错找不到vcruntime140.dll无法继续执行代码怎么办-6个解决方法
vcruntime140.dll是一个由Microsoft Visual C提供的运行时库文件,它为许多Microsoft Visual Studio开发的应用程序提供了必要的支持。这个文件对于许多Windows应用程序的正常运行至关重要。然而,有时会出现vcruntime140.dll缺失的问题,导致应…...
从Discord的做法中学习 — 使用Golang进行请求合并
正如你可能之前看到的,Discord去年发布了一篇有价值的文章,讨论了他们成功存储了数万亿条消息。虽然有很多关于这篇文章的YouTube视频和文章,但我认为这篇文章中一个名为“数据服务为数据服务”的部分没有得到足够的关注。在这篇文章中&#…...
【教3妹学编程-算法题】统计和小于目标的下标对数目
2哥 : 3妹,OpenAI的宫斗剧迎来了大结局!OpenAI宣布阿尔特曼复职CEO,董事会重组 3妹:啊?到底谁才是幕后操纵者啊,有咩有揪出来 2哥 : 也不是很清楚,据说在被开除的几周前,前CEO曾谴责…...
OSG粒子系统与阴影-雾效模拟(1)
虚拟现实中有很多效果,如雨效、雪效、雾效等,这些都可以通过粒子系统来实现。一个真实的粒子系统的模式能使三维场景达到更好的效果。 本章对OSG粒子系统的使用以及生成自定义粒子系统的方法进行了详细介绍最后还附带说明了阴影的使用方法。在实时的场景…...
OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 ‘enu/neu‘ 之谜
OpenLayers 加载天地图服务踩坑记:手把手解决 EPSG:4490 坐标系与 axisOrientation 的 enu/neu 之谜 作为一名长期与 WebGIS 打交道的开发者,最近在对接国内天地图服务时,遇到了一个令人抓狂的问题:明明已经按照标准流程注册了 CG…...
手把手教你用MBR2GPT无损转换系统盘,告别BIOS拥抱UEFI(附VMware虚拟机设置)
手把手教你用MBR2GPT无损转换系统盘,告别BIOS拥抱UEFI(附VMware虚拟机设置) 在个人电脑和虚拟化环境中,许多用户仍在使用传统的MBR分区方案,却不知这已成为性能和安全性的隐形瓶颈。想象一下,当你新购一块4…...
盟接之桥®电子数据交换EDI,如何用一套“数字桥梁”,让全球巨头主动为你敞开大门?
在全球经济一体化的宏大叙事下,中国制造业正站在历史的十字路口。从“中国制造”到“中国智造”,这不仅仅是称谓的更迭,更是产业链地位的跃迁。然而,在这条通往全球价值链高端的道路上,无数制造企业面临着同一个隐秘而…...
别再傻傻分不清了!Unity里Animation和Animator到底怎么选?附DoTween插件对比
Unity动画系统深度对比:Animation、Animator与DoTween的实战选择指南 当Unity开发者面对动画需求时,常常陷入选择困境:是用简单的Animation组件快速实现,还是构建复杂的Animator状态机?第三方插件DoTween是否更适合当前…...
规培生/医学研究生看过来:从Zotero到Scholaread,哪款工具最适合临床场景?
📌 核心要点: 白天查房12小时,晚上拖着疲惫的身体想读文献,却发现Zotero在手机上根本打不开、PDF翻译要来回切换、专业术语看得头大?开题前2周还剩20篇必读文献没消化,导师催进度,你却连文献管理…...
告别手动点选!用CAPL函数canActivateTxSelfAck实现CANoe硬件配置自动化
告别手动点选!用CAPL函数canActivateTxSelfAck实现CANoe硬件配置自动化 在汽车电子测试领域,效率与标准化是衡量测试团队成熟度的关键指标。每当看到工程师们反复点击"Hardware -> Network -> Setup"菜单进行相同的硬件配置时࿰…...
终极Windows激活指南:KMS_VL_ALL_AIO智能激活脚本完全解析
终极Windows激活指南:KMS_VL_ALL_AIO智能激活脚本完全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 在Windows系统管理和批量部署领域,系统激活一直是技术人员面临…...
Visual C++运行库终极解决方案:告别繁琐安装的一站式指南
Visual C运行库终极解决方案:告别繁琐安装的一站式指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 您是否曾经因为"缺少VC运行库"的错…...
零信任医疗容器网络配置:用eBPF+Docker Compose实现手术机器人通信链路100%加密(实测延迟<8.3ms)
第一章:零信任医疗容器网络配置:用eBPFDocker Compose实现手术机器人通信链路100%加密(实测延迟<8.3ms)在高可靠性手术机器人系统中,控制指令与实时影像流的传输必须满足毫秒级确定性、端到端不可篡改性及最小化信任…...
NCMconverter完整指南:3步解锁网易云音乐加密格式
NCMconverter完整指南:3步解锁网易云音乐加密格式 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter NCMconverter是一个强大的开源工具,专门用于将网易云音…...
