将表达式(如 @a - @b + @c)中各部分 解析为token并存放在List中,算法如下:
ExpressUtils.java
public static List<Token> parse(String expr) {
List<Token> tokenList = new ArrayList<Token>();
TokenType type = TokenType.Text;
StringBuffer buf = new StringBuffer();
char[] charArray = expr.toCharArray();
for (int i = 0; i < charArray.length; ++i) {
char ch = charArray[i];
if (ch == '@') {
if (buf.length() > 0) {
tokenList.add(new Token(type, buf.toString()));
}
type = TokenType.Variant;
buf = new StringBuffer();
continue;
}
if (ch == '/' && i < charArray.length - 1 && charArray[i + 1] == '*') {
if (buf.length() > 0) {
tokenList.add(new Token(type, buf.toString()));
}
buf.append("/*");
++i;
type = TokenType.MultiLineComment;
continue;
}
if (ch == '/' && i < charArray.length - 1 && charArray[i + 1] == '/') {
if (buf.length() > 0) {
tokenList.add(new Token(type, buf.toString()));
}
buf.append("//");
++i;
type = TokenType.LineComment;
continue;
}
if (type == TokenType.Variant) {
if (Character.isLetter(ch) || Character.isDigit(ch)) {
buf.append(ch);
} else if (ch == '_') {
buf.append(ch);
} else {
tokenList.add(new Token(type, buf.toString()));
type = TokenType.Text;
buf = new StringBuffer();
--i;
}
continue;
}
if (type == TokenType.Text) {
buf.append(ch);
continue;
}
if (type == TokenType.MultiLineComment) {
if (ch == '*' && i < charArray.length - 1 && charArray[i + 1] == '/') {
buf.append("*/");
++i;
tokenList.add(new Token(type, buf.toString()));
type = TokenType.Text;
buf = new StringBuffer();
continue;
} else {
buf.append(ch);
}
}
if (type == TokenType.LineComment) {
if (ch == '\n') {
buf.append(ch);
tokenList.add(new Token(type, buf.toString()));
type = TokenType.Text;
buf = new StringBuffer();
} else if (ch == '\r') {
buf.append(ch);
if (i < charArray.length - 1 && charArray[i + 1] == '\n') {
buf.append(charArray[i + 1]);
++i;
}
tokenList.add(new Token(type, buf.toString()));
type = TokenType.Text;
buf = new StringBuffer();
} else {
buf.append(ch);
}
continue;
}
}
if (buf.length() > 0) {
tokenList.add(new Token(type, buf.toString()));
}
return tokenList;
}
将java源文件编译成类的Class型实例:JdkCompiler.java/JdkCompileTask.java
public synchronized Class<? extends Expr> compile(JavaSource javaSource) {
compileCount.incrementAndGet();
long startTimeMillis = System.nanoTime();
try {
final DiagnosticCollector<JavaFileObject> errs = new DiagnosticCollector<JavaFileObject>();
JdkCompileTask<Expr> compileTask = new JdkCompileTask<Expr>(classLoader, options);
String fullName = javaSource.getPackageName() + "." + javaSource.getClassName();
return (Class<? extends Expr>) compileTask.compile(fullName, javaSource.getSource(), errs);
} catch (JdkCompileException ex) {
DiagnosticCollector<JavaFileObject> diagnostics = ex.getDiagnostics();
throw new CompileExprException("compile error, source : \n" + javaSource + ", " + diagnostics.getDiagnostics(), ex);
} catch (Exception ex) {
throw new CompileExprException("compile error, source : \n" + javaSource, ex);
} finally {
// 编译时间统计
compileTimeNano.addAndGet(System.nanoTime() - startTimeMillis);
}
}
待研究:
javax.tools.JavaCompiler.JavaCompiler
compiler = javax.tools.ToolProvider.getSystemJavaCompiler().
分享到:
相关推荐
luci-app-aliddns的版本号0.4.0-1表明这是该应用的一个稳定版本。 “aliddns_0.4.0-1_all.ipk”是一个针对OpenWrt系统的软件包,采用ipk格式。ipk是OpenWrt软件包管理系统使用的标准格式,它包含应用程序的源代码、...
阿里DDNS ipk包“luci-app-aliddns_0.3.8-1_all.ipk”是一款专为K3路由器设计的应用程序,用于动态域名解析服务。此软件包是DDNS(Dynamic Domain Name System)服务的一个用户界面,使得用户能够更方便地管理和更新...
本文将详细介绍`luci-app-aliddns_0.3.8-1_all.ipk`的最新版本,以及如何在OpenWrt上安装和使用它。 1. **阿里DDNS服务**: - 动态域名解析:当用户的公网IP发生变化时,阿里DDNS会自动更新DNS记录,保持域名与...
1. **编程器硬件**:ALI 3510C的RS232编程器是连接主机和目标芯片的物理桥梁,它提供了与芯片进行数据交换的接口。这种编程器通常包含一个能够模拟RS232信号的电路,并通过专用的连接线与目标设备相连。 2. **编程...
最新阿里云ddns openwrt 插件 luci-app-aliddns_0.4.0-1_all.ipk
K3 路由器 阿里DDNS ipk包 luci-app-aliddns_0.3.0-1_all.ipk
1. **ALI3601芯片**:这是一款专为网络设备设计的微处理器,可能包含有硬件加速器来优化网络数据处理,如TCP/IP协议栈处理、加密和解密功能。它可能还集成了内存管理单元,支持多种接口,如以太网、USB和串行端口,...
标题《ALI 车载CD芯片 M5673D SPEC》表示本文件是一份关于ALI公司的M5673D车载CD解码芯片的技术规格说明书。ALI是一家专注于集成电路设计的公司,其产品广泛应用于各种电子产品中,而M5673D芯片作为一款车载CD解码...
《ALi_Universal-Fixer_v1[1].4b_ali_》是一个专门针对ALi(联发科)芯片组的修复工具,主要用于解决与ALi相关硬件设备在使用过程中出现的各种问题。这个版本是1.4b,通常代表着开发者在原有的基础上进行了改进和...
1. **Ali 3510**:这是一款由台湾联发科(Allegro Microsystems, Ltd,简称Ali)制造的单片机,常用于卫星接收器等数字消费电子产品。这款芯片集成了CPU、内存控制器、视频解码器等功能,使得它能高效处理卫星信号的...
1. **驱动程序开发**:ALI_Tools_3329E包含针对3329E芯片的驱动程序源代码,开发者可以通过修改和编译这些代码来适配不同的操作系统和外围设备,确保STB能够正确识别和操作各种硬件组件。 2. **固件升级**:随着...
1. **wke.dll**:这是一个动态链接库(DLL)文件,通常包含可由多个程序共享的代码和数据。"wke"可能代表Web Kit Engine,一个用于渲染网页内容的开源引擎。在游戏平台或任何需要网页展示功能的应用中,这样的DLL...
1. 连接编程器:通过RS232接口将编程器连接到电脑。 2. 安装驱动:安装对应的驱动程序,使电脑能够识别编程器。 3. 启动软件:运行"M3510C-LOADER",加载编程软件。 4. 设定参数:配置编程参数,如波特率、校验方式...
AliDDNS-v2.0.sh
我加入了IPv6自动解析脚本。到手直接用。非常适合家里有群晖NAS但是只有公网IPv6的家庭宽带。绝对是优秀的DDNS方案。 本脚本的工作流程是:对比云端解析记录-> 不存在则添加 -> 存在... ./aliddns.sh [OPTION] <String>
1. PhysX_9.12.1031_SystemSoftware.msi:这是PhysX系统的安装程序,版本号为9.12.1031。用户可以通过运行这个MSI文件来安装PhysX系统软件。该版本可能包含了对物理模拟的优化和一些修复,以确保与当时的游戏兼容性...
《ALI M1535D与M1543C FIR控制器在Linux下的驱动程序详解》 在Linux操作系统中,设备驱动程序是系统与硬件交互的重要桥梁,它使得操作系统能够充分利用硬件的功能。本文将详细解析针对ALI M1535D和M1543C快速红外...
com.ali.mobisecenhance.ld.StubApplication.apk
标题 "ali_repo1.rar本地库文件夹的另一部分" 暗示这可能是一个与阿里巴巴相关的本地软件仓库的压缩文件,包含了一些特定的库或框架的分发版本。描述中的 "ali_repo文件夹下的另一部分" 强调了这是之前ali_repo...
1. **高清视频解码**:该芯片支持多种高清视频格式的解码,如H.264、MPEG-2、MPEG-4、AVC等,确保流畅播放高清内容。 2. **多标准支持**:ALi 3329B-c-ci 可以处理不同数字电视标准,如DVB-C (数字有线电视)、DVB-T...