@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的设计目标是简化编程过程,提高开发效率,同时保持灵活性和可扩展性。这种语言通常适用于快速开发、脚本编写...
本文将详细讲解如何利用`iTerm2`配合`ZModem`协议的脚本`iterm2-send-zmodem.sh`和`iterm2-recv-zmodem.sh`来解决在远程服务器上进行文件传输时遇到的问题。 首先,让我们了解`ZModem`协议。`ZModem`是一种双向、...
使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...
综上所述,"BAT批处理脚本-提示窗口进度条-飞入+变色字.zip"是一个集成了多种批处理技术的实例,涵盖了从基本的命令执行到复杂的用户交互和视觉效果。理解和掌握这些技术,将有助于提升Windows系统的自动化管理能力...
《3ds MAXScript脚本语言完全学习手册》是一本全面介绍MAXScript脚本语言的教程,不仅适合于初学者学习基础知识,也适合于专业人士深入了解高级功能和技术细节。通过本书的学习,读者将能够有效地利用MAXScript提升...
**批处理**(Batch Scripting),是一种计算机编程语言,它允许用户创建一系列预定义命令的脚本文件,以实现自动化任务的执行。在Windows操作系统中,这种脚本通常被称为**批处理脚本**,其文件扩展名为`.bat`或`....
Hyper-V 是微软提供的一种虚拟化技术,主要用于在Windows操作系统上创建和管理虚拟机。这个"一键安装 Hyper-V 脚本"(Hyper-V.bat)是一个方便用户快速在Windows家庭版上安装Hyper-V组件的自动化工具。通常,Hyper-V...
Python-Expresol库是一个专为Python开发者设计的工具,它允许用户在Python环境中执行自定义的脚本语言。这个库的独特之处在于它的灵活性和可扩展性,使得开发者可以构建自己的编程语法,然后在Python程序中无缝地...
Linux 内核CVE-2024-1086漏洞复现脚本。 在普通用户下,将文件上传后,chmod 777 exploit ,然后运行 ./exploit ,提权成功,输入id,可看到已经是root权限 。
综上所述,PRO-FACE脚本编程是一门综合性的技术,它结合了人机界面的交互设计和脚本语言的逻辑控制,对于实现自动化控制和人机交互体验的提升有着重要的作用。通过理解和掌握这些知识点,能够有效提升PRO-FACE人机...
Linux运维-运维系统服务04-Shell脚本d4-Shell循环-10并发执行判断主机是否ping
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它允许攻击者通过在网页上插入恶意脚本,从而在用户的浏览器上执行代码。这些脚本可以窃取用户的数据,包括登录凭证、个人信息,甚至操纵...
在完成这个项目的过程中,学生将深入理解编程语言的构造,学习如何将高级语言转化为机器可以理解的形式,这对于计算机科学与技术专业的学生来说,是至关重要的实践经历。同时,这也是一个展示编程技巧、问题解决能力...
在学习过程中,可以参考“Shell脚本学习指南.pdf”这样的资料,它通常会详细讲解上述各个知识点,并提供实例帮助理解。通过实践和查阅相关文档,你可以逐步提升Shell脚本编写能力,更好地利用Linux系统的强大功能。
Lua是一种轻量级的脚本语言,因其简洁的语法和高效的执行性能,常被用作Cocos2d-x游戏的脚本语言。在Cocos2d-x项目中,使用Lua脚本能极大地提高开发效率,简化代码结构,并实现游戏逻辑与渲染的分离。 首先,我们...