关系表达式的计算

近期在做一个项目,涉及到一些简单的规则匹配。规则的判定条件可以用关系表达式描述,形如(P1|P2)&(P3|P4)。其中&是与,|是或,P1-P4是Pattern,具体的匹配条件,返回值是True或者False。为计算此表达式的值,采用中序转后序再计算表达式的值。

1. 后序表达式的生成

中序表达式转后序表达式算法:

1. 用&|()对原表达式进行拆分,得到List<String>。
2. 从前往后遍历该List:
    (1)如果是一个pattern,则入栈。
    (2)如果是左括号(,也入栈。
    (3)如果是右括号:
        (a)如果此时栈为空,则表示表达式解析异常,报警并退出。
        (b)如果栈不为空,则依次pop栈顶元素,直到匹配到左括号(。如果没有左括号(的匹配,则表达式依次,报警并退出。
    (4)如果是&和|:
        (a)如果栈为空,直接入栈。
        (b)如果栈不为空,依次出栈直到匹配左括号(左括号不出栈)。再把操作符入栈。
3、所有的pattern和操作符都入栈以后,把栈中所有元素依次出栈,就得到后序表达式。

参考代码:

List<String> postfix = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
String delims = "&|()"; // 支持的操作符
StringTokenizer st = new StringTokenizer(rule, delims, true);
while (st.hasMoreTokens()) {String tk = st.nextToken();if (!delims.contains(tk)) {// pattern,直接入栈
        postfix.add(tk);} else if (tk.equals("(")) {// 左括号,入栈
        stack.push(tk);} else if (tk.equals(")")) {if (stack.empty()) {// 碰到右括号,如果栈为空,解析异常throw new RuleException("parseRule Error!");}String val = stack.pop();// 如果栈不为空,依次出栈直到匹配左括号while (!val.equals("(")) {postfix.add(val);if (!stack.empty()) {val = stack.pop();} elsebreak;}if (stack.empty() && !val.equals("(")) {// 如果匹配不到左括号,解析异常throw new RuleException("parseRule Error!");}} else if (tk.equals("&") || tk.equals("|")) {if (stack.empty()) {// 碰到操作符,如果栈空,则直接入栈
            stack.push(tk);} else {// 如果栈不为空,依次出栈直到匹配左括号while (!stack.empty() && !stack.lastElement().equals("(")) {postfix.add(stack.pop());}// 操作符入栈
            stack.push(tk);}}
}// 所有的pattern和操作符匹配完毕,把堆栈中还有的数据依次出栈
while (!stack.empty()) {postfix.add(stack.pop());
}System.out.println("Original Rule:" + rule);
System.out.println("Postfix Rule: " + postfix.toString());

 

2. 后序表达式的计算

后序表达式的计算算法:

1. 从前往后遍历中序表达式:
    (1)如果是&|操作符,则pop两个字段r1和r2,计算r1&r2或r1|r2的值r3,并将r3入栈。
    (2)如果是pattern,则计算pattern的匹配结果True Or False,并将结果入栈。
2、中序表达式便利完毕,栈中只有1个元素,即为表达式结果。

 参考代码:

Stack<Boolean> stack = new Stack<Boolean>();
for (String str : this.postfix) {if (str.equals("&")) {// pop两个pattern,计算boolean r1 = stack.pop();boolean r2 = stack.pop();stack.push(r1 && r2);} else if (str.equals("|")) {// pop两个pattern,计算boolean r1 = stack.pop();boolean r2 = stack.pop();stack.push(r1 || r2);} else {// 计算pattern的值,并push到stackPattern ptn = this.patterns.get(str);stack.push(ptn.judge(fact));}
}if (stack.size() == 1) {return stack.pop();
} else {throw new RuleException("judge failed: postfix error!");
}

 

转载于:https://www.cnblogs.com/simplestupid/p/4771892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow下安装matplotlib模块

如果运行TensorFlow时报错“no module named matplotlib ”&#xff0c;这是因为未安装matplotlib&#xff0c;打开命令提示符小黑框&#xff0c;输入 pip install matplotlib 等待安装即可 安装完后&#xff0c;我兴高采烈在TensorFlow环境中的编辑器中试一试&#xff0c;发…

windows7 安装MySQL 解决报错 服务没有响应控制功能

windows7 安装MySQL 1. 下载MySQL 官网&#xff1a;https://dev.mysql.com/downloads/installer/ 下载想要的版本。 下载的是压缩文件&#xff0c;解压到安装目录。 2. 准备 2.1 my.ini 文件设置 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld…

谁在引领中国制造?中国智能制造发展解析

来源&#xff1a;亿欧智库导读&#xff1a;技术和行业需求的不断融合引领我国智能制造快速发展&#xff0c;随着政策、技术和产品的不断落地&#xff0c;智能化进程在我国制造业各子行业将呈现出不同的面貌。全球制造的未来&#xff1f;制造强国一直是全世界各国发展的目标。随…

qemu-kvm磁盘读写的缓冲(cache)的五种模式

qemu-kvm磁盘读写的缓冲(cache)模式一共有五种&#xff0c;分别是writethrough, wirteback, none, unsafe, directsync当你对VM读写磁盘的性能有不同的要求的时候&#xff0c;你可以在其启动的参数(cachexxxx)里面进行一个合理的选择. 现在来简单说一说这五种模式的各自的特点(…

Windows下安装Tensorflow

安装TensorFlow 步骤一&#xff1a; 从官方网站下载Anacondahttps://www.anaconda.com/download/ 步骤二&#xff1a; 安装软件&#xff08;和普通的安装软件没什么区别&#xff09; 注意一点&#xff1a; 步骤三&#xff1a; 安装完成Anaconda之后进行环境变量的测试 进…

人工智能正在向具有“高情商”发展

来源&#xff1a;网络大数据目前机器智能领域的成功主要依赖于计算能力&#xff0c;为了做出最佳决策可能搜索数十亿次。如果决策成功的话&#xff0c;往往表明计算能力已经赶上甚至超过人类的智力。人类智能是高度概括的、自适应的和健壮的&#xff0c;即使当前最先进的机器智…

postman测试 上传下载文件

postman测试 上传下载文件 1 测试上传文件 选择 Body选择 form-data参数 key 值 填写后 在后面下拉选择 filevalue 点击 Select Files 选择需要上传的文件 2 测试下载文件 请求方式请求地址和接口Send 按钮下拉选择 Send and Download &#xff0c;点击即可弹出窗口选择保存文…

.net学习笔记----WebConfig常用配置节点介绍

一、配置文件入门 .Net提供了一种保存项目配置信息的办法&#xff0c;就是利用配置文件&#xff0c;配置文件的后缀一般是.config。在WinForm程序中配置文件一般是App.config。在Asp.net中一般默认是web.config。 一个.config配置文件都是基于XML的文本文件&#xff0c;并且可以…

AttributeError: module 'tensorflow' has no attribute 'FIFOQueue'

今天在学习队列时按照书里写了一段代码&#xff0c;但是运行时却报错了 import tensorflow as tfq tf.FIFOQueue(2, "int32") init q.enqueue_many(([0, 10],)) x q.dequeue() y x 1 q_inc q.enqueue([y])with tf.Session() as sess:init.run()for _ in range…

对话微软黄学东:语音语言技术是镶在 AI 皇冠上的明珠

来源&#xff1a;AI科技评论AI 科技评论按&#xff1a;上一次你和你的电脑进行有意义的对话&#xff0c;并感受到它能真正地理解你&#xff0c;是什么时候&#xff1f;如果微软技术研究员、微软的语言语音小组组长黄学东博士做到了的话&#xff0c;那么你也将可以做到。并且&am…

权限列表(包字典)递归成树状结构

权限列表(包字典)递归成树状结构 def per_data(permission_list, parent_id):tree []for per in permission_list:if per[per_moudel_id] parent_id:per[children] per_data(permission_list, per[per_id])tree.append(per)return treeif __name__ __main__:dict [{per_i…

tf.data.TextLineDataset()

dataset tf.data.TextLineDataset(file_path) 生成一个dataset&#xff0c;dataset中的每一个元素就对应了文件中的一行

兴起与繁荣,那些正在启航的行业

来源&#xff1a;前瞻产业研究院任何一个行业都依附于时代大势生存&#xff0c;只有跟着高速发展的时代脚步&#xff0c;行业才能有所发展。一旦经济大势散去&#xff0c;任何行业或企业就会陷入低利润的危机甚至被淘汰。未来智能实验室是人工智能学家与科学院相关机构联合成立…

Django 应用分库,数据迁移成功,数据库没有生成表

Django 应用分库&#xff0c;数据迁移成功&#xff0c;数据库没有生成表 背景&#xff1a;不同应用对应不同数据库&#xff0c;在迁移数据成功后&#xff0c;数据库没有生成表 Django 官网&#xff1a;https://docs.djangoproject.com/ko/1.11/topics/db/multi-db/#allow_mig…

dataset.filter

dataset dataset.filter(Func) filter接收一个函数Func并将该函数作用于dataset的每个元素&#xff0c;根据返回值True或False保留或丢弃该元素&#xff0c;True保留该元素&#xff0c;False丢弃该元素

JQuery中的DOM操作

jQuery 中的 DOM 操作 一.介绍 1.概念&#xff1a;  •DOM(Document Object Model—文档对象模型)&#xff1a;一种与浏览器, 平台, 语言无关的接口, 使用该接口可以轻松地访问页面中所有的标准组件。2.DOM操作的分类&#xff1a;–DOM Core: DOM Core 并不专属于 JavaScript…

Django——多个数据库

Django——多个数据库 官方文档&#xff1a;https://docs.djangoproject.com/en/3.2/topics/db/multi-db/ 主要介绍Django 对与多个数据库交互的支持。 1. 数据库服务器 DATABASES 在Django中使用多个数据库的第一步是告诉Django将要使用的数据库服务器。 这是通过使用 DAT…

聚焦第三届世界智能大会|大佬们讲了哪些干货?

文章来源&#xff1a;天津广播今天第三届世界智能大会举办两场主论坛高峰会柳传志、周鸿祎、王传福等各界大咖悉数亮相嘉宾围绕智能科技产业发展进行深层次探讨展开深度思想碰撞分享创新经验演讲的干货信息都在这了 ▼万钢&#xff1a;人工智能遇到“成长的烦恼”全国政协副主席…

tf.nn.embedding_lookup

用法&#xff1a; a1 tf.nn.embedding_lookup(a, index) index是索引&#xff0c;a是输入&#xff0c;通过index来选取a中对应的元素返回给a1&#xff0c;注意index是从0开始算起 例子&#xff1a; import tensorflow as tfa tf.constant([5, 6, 7, 8, 9]) index tf.con…

mac下配置eclipse的maven环境

转自&#xff1a;http://www.cnblogs.com/yqskj/archive/2013/03/30/2990292.html 1、下载maven的bin包&#xff0c;解压&#xff0c;配置到环境变量里面去 1&#xff09;、首先到Maven官网下载安装文件&#xff0c;比如 &#xff0c;下载文件为apache-maven-3.0.3-bin.tar.gz2…