当前位置: 首页 > news >正文

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()
http://www.lryc.cn/news/242163.html

相关文章:

  • 分布式事务seata的AT模式介绍
  • 初识Linux(1),看了这篇文章,妈妈再也不用担心我Linux找不到门了。
  • 甲烷产生及氧化
  • Javascript的form表单校验输入框
  • 大数据-之LibrA数据库系统告警处理(ALM-37003 GTM主备不同步或者GTM主备断连)
  • python每日一题——4移动0
  • CAN实验
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • 微服务实战系列之Nginx
  • 使用rsync从OpenShift的pod复制文件
  • 解决Activiti5.22流程图部署在Windows上正常,但在linux上部署后出现中文变方块的问题
  • EMG肌肉电信号处理合集(三)
  • GitHub桌面版
  • 【广州华锐互动】昆虫3D虚拟动态展示:探索神奇的微观世界
  • 《QT从基础到进阶·三十六》QWidget实现收缩栏的效果
  • 运行软件报错找不到vcruntime140.dll无法继续执行代码怎么办-6个解决方法
  • 从Discord的做法中学习 — 使用Golang进行请求合并
  • 【教3妹学编程-算法题】统计和小于目标的下标对数目
  • OSG粒子系统与阴影-雾效模拟(1)
  • Windows power shell for循环
  • GIT实践与常用命令---回退
  • Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解
  • C现代方法(第23章)笔记——库对数值和字符数据的支持
  • NSGA-II求解微电网多目标优化调度(MATLAB)
  • 7-9 jmu-python-班级人员信息统计
  • Doris分区与分桶(八)
  • mac VScode 添加PHP debug
  • 53.最大子数组和
  • 455.分发饼干
  • 浏览器缓存控制讲解