@org.junit.Test
public void testDemo() throws Exception{
String express = "10 * 10 + 1 + 2 * 3 + 5 * 2";
ExpressRunner runner = new ExpressRunner();
Object r = runner.execute(express,null, null, false,false);
Assert.assertTrue("表达式计算", r.toString().equalsIgnoreCase("117"));
System.out.println("表达式计算:" + express + " = " + r);
}
安装好maven 执行eclipse命令,导入eclipse 之后,运行 com.ql.util.express.test.ExpressTest 单元测试
可以运行处结果:
表达式计算:10 * 10 + 1 + 2 * 3 + 5 * 2 = 117
/**
* 执行一段文本
* @param expressString 程序文本
* @param context 执行上下文
* @param errorList 输出的错误信息List
* @param isCache 是否使用Cache中的指令集
* @param isTrace 是否输出详细的执行指令信息
* @return
* @throws Exception
*/
public Object execute(String expressString, IExpressContext<String,Object> context,
List<String> errorList, boolean isCache, boolean isTrace) throws Exception ;
我们为了要看到运行的过程,修改把ExpressRunner的构造函数,以及execute的参数中: isTrace =true,重新执行下这个单元测试。
@org.junit.Test
public void testDemo() throws Exception{
String express = "10 * 10 + 1 + 2 * 3 + 5 * 2";
ExpressRunner runner = new ExpressRunner(false,true); // 显示执行编译过程
Object r = runner.execute(express,null, null, false,true); // 显示指令执行过程
Assert.assertTrue("表达式计算", r.toString().equalsIgnoreCase("117"));
System.out.println("表达式计算:" + express + " = " + r);
}
日志信息:
[2012-02-20 22:07:07,844] [main] (ExpressParse.java:486) DEBUG com.ql.util.express.parse.ExpressParse -
执行的表达式:10 * 10 + 1 + 2 * 3 + 5 * 2
[2012-02-20 22:07:07,844] [main] (ExpressParse.java:487) DEBUG com.ql.util.express.parse.ExpressParse -
单词分解结果:{10},{*},{10},{+},{1},{+},{2},{*},{3},{+},{5},{*},{2}
[2012-02-20 22:07:07,844] [main] (ExpressParse.java:491) DEBUG com.ql.util.express.parse.ExpressParse -
预处理后结果:{10},{*},{10},{+},{1},{+},{2},{*},{3},{+},{5},{*},{2}
[2012-02-20 22:07:07,860] [main] (ExpressParse.java:502) DEBUG com.ql.util.express.parse.ExpressParse -
单词分析结果:
10:CONST_INTEGER,*:*,10:CONST_INTEGER,+:+,1:CONST_INTEGER,+:+,
2:CONST_INTEGER,*:*,3:CONST_INTEGER,+:+,5:CONST_INTEGER,*:*,
2:CONST_INTEGER
[2012-02-20 22:07:07,860] [main] (ExpressParse.java:506) DEBUG com.ql.util.express.parse.ExpressParse -
Block拆分后的结果:
1: main:FUNCTION_DEFINE FUNCTION_DEFINE
2: 10:CONST_INTEGER CONST
2: *:* *
2: 10:CONST_INTEGER CONST
2: +:+ +
2: 1:CONST_INTEGER CONST
2: +:+ +
2: 2:CONST_INTEGER CONST
2: *:* *
2: 3:CONST_INTEGER CONST
2: +:+ +
2: 5:CONST_INTEGER CONST
2: *:* *
2: 2:CONST_INTEGER CONST
[2012-02-20 22:07:07,860] [main] (ExpressParse.java:511) DEBUG com.ql.util.express.parse.ExpressParse -
语句拆分后的结果:
1: main:FUNCTION_DEFINE FUNCTION_DEFINE
2: ;:; STAT_SEMICOLON_EOF
3: 10:CONST_INTEGER CONST
3: *:* *
3: 10:CONST_INTEGER CONST
3: +:+ +
3: 1:CONST_INTEGER CONST
3: +:+ +
3: 2:CONST_INTEGER CONST
3: *:* *
3: 3:CONST_INTEGER CONST
3: +:+ +
3: 5:CONST_INTEGER CONST
3: *:* *
3: 2:CONST_INTEGER CONST
[2012-02-20 22:07:07,860] [main] (ExpressParse.java:520) DEBUG com.ql.util.express.parse.ExpressParse -
最后的语法树:
1: main:FUNCTION_DEFINE FUNCTION_DEFINE
2: ;:; STAT_SEMICOLON_EOF
3: +:+ EXPRESS_LEVEL5
4: +:+ EXPRESS_LEVEL5
5: +:+ EXPRESS_LEVEL5
6: *:* EXPRESS_LEVEL4
7: 10:CONST_INTEGER CONST
7: 10:CONST_INTEGER CONST
6: 1:CONST_INTEGER CONST
5: *:* EXPRESS_LEVEL4
6: 2:CONST_INTEGER CONST
6: 3:CONST_INTEGER CONST
4: *:* EXPRESS_LEVEL4
5: 5:CONST_INTEGER CONST
5: 2:CONST_INTEGER CONST
[2012-02-20 22:07:07,860] [main] (ExpressRunner.java:491) DEBUG com.ql.util.express.ExpressRunner -
1:LoadData 10
2:LoadData 10
3:OP : * OPNUMBER[2]
4:LoadData 1
5:OP : + OPNUMBER[2]
6:LoadData 2
7:LoadData 3
8:OP : * OPNUMBER[2]
9:OP : + OPNUMBER[2]
10:LoadData 5
11:LoadData 2
12:OP : * OPNUMBER[2]
13:OP : + OPNUMBER[2]
[2012-02-20 22:15:36,090] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 10
[2012-02-20 22:15:36,090] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 10
[2012-02-20 22:15:36,090] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(10,10)
[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 1
[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(100,1)
[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 2
[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 3
[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(2,3)
[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(101,6)
[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 5
[2012-02-20 22:15:36,105] [main] (InstructionConstData.java:25) DEBUG com.ql.util.express.instruction.detail.Instruction - LoadData 2
[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - *(5,2)
[2012-02-20 22:15:36,105] [main] (InstructionOperator.java:40) DEBUG com.ql.util.express.instruction.detail.Instruction - +(107,10)
表达式计算:10 * 10 + 1 + 2 * 3 + 5 * 2 = 117
由这个简单的例子,我们看到了整个QL的执行过程:
单词分解-->单词类型分析-->语法分析-->生成运行期指令集合-->执行生成的指令集合。
其中前4个过程涉及语法的匹配运算等非常耗时,所以我们看到了 execute方法的 isCache 是否使用Cache中的指令集参数,它可以缓存前四个过程
。
即把 expressString 本地缓存乘一段指令,第二次重复执行的时候直接执行指令,极大的提高了性能。
分享到:
相关推荐
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。 3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使...
2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的临时变量创建采用了缓冲池的技术,和groovy性能相当。 3、弱类型脚本语言,和groovy,javascript语法类似,虽然比强类型脚本语言要慢一些,但是使...
【脚本技术script56--2006】是一本专注于脚本技术的电子书籍,以CHM(Microsoft ...虽然时间已过去多年,但许多脚本语言的基本原理和技术依然适用,对于初学者和有经验的开发者来说,这仍是一份有价值的参考资料。
简单明了的shell脚本语言讲义,让你轻松了解shell语言。
QLExpress是一种强大、轻量级且动态的编程语言,它为开发者提供了高效的代码编写和执行环境。QLExpress的设计目标是简化编程过程,提高开发效率,同时保持灵活性和可扩展性。这种语言通常适用于快速开发、脚本编写...
使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...
综上所述,PRO-FACE脚本编程是一门综合性的技术,它结合了人机界面的交互设计和脚本语言的逻辑控制,对于实现自动化控制和人机交互体验的提升有着重要的作用。通过理解和掌握这些知识点,能够有效提升PRO-FACE人机...
综上所述,"BAT批处理脚本-提示窗口进度条-飞入+变色字.zip"是一个集成了多种批处理技术的实例,涵盖了从基本的命令执行到复杂的用户交互和视觉效果。理解和掌握这些技术,将有助于提升Windows系统的自动化管理能力...
《3ds MAXScript脚本语言完全学习手册》是一本全面介绍MAXScript脚本语言的教程,不仅适合于初学者学习基础知识,也适合于专业人士深入了解高级功能和技术细节。通过本书的学习,读者将能够有效地利用MAXScript提升...
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神...
3. **Perl**:5.8.8 built for darwin-2level 除了这些脚本语言之外,Mac OS X还预装了一系列shell,用户可以根据自己的喜好选择使用: - **bash**:3.2 "Bourne-again" shell,来自GNU,是最常用的shell,也是Mac...
本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...
Hyper-V 是微软提供的一种虚拟化技术,主要用于在Windows操作系统上创建和管理虚拟机。这个"一键安装 Hyper-V 脚本"(Hyper-V.bat)是一个方便用户快速在Windows家庭版上安装Hyper-V组件的自动化工具。通常,Hyper-V...
**批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....
Python-Expresol库是一个专为Python开发者设计的工具,它允许用户在Python环境中执行自定义的脚本语言。这个库的独特之处在于它的灵活性和可扩展性,使得开发者可以构建自己的编程语法,然后在Python程序中无缝地...
Linux 内核CVE-2024-1086漏洞复现脚本。 在普通用户下,将文件上传后,chmod 777 exploit ,然后运行 ./exploit ,提权成功,输入id,可看到已经是root权限 。
Linux运维-运维系统服务04-Shell脚本d4-Shell循环-10并发执行判断主机是否ping
### TCL脚本语言详细教程 #### 一、TCL语法概览 TCL(Tool Command Language)是一种轻量级的脚本语言,以其简洁高效的特点广泛应用于自动化测试、配置管理等多个领域。对于初学者而言,了解TCL的基本语法是至关...
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它允许攻击者通过在网页上插入恶意脚本,从而在用户的浏览器上执行代码。这些脚本可以窃取用户的数据,包括登录凭证、个人信息,甚至操纵...