java 几个不错的编译器
janino以及javacc是不错的选择,都是好多框架的选择
janino 参考使用
- pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dalong</groupId>
<artifactId>javacapp</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>me.nimavat</groupId>
<artifactId>shortid</artifactId>
<version>1.0.1.RC1</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>demo</id>
<url>http://dl.bintray.com/snimavat/maven</url>
</repository>
</repositories>
</project>
- main
package com.dalong;
import org.codehaus.commons.compiler.CompileException;
import org.codehaus.janino.ScriptEvaluator;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class App {
static void method1(String item) {
System.out.printf(item);
}
public static void main(String[] args) throws CompileException, InvocationTargetException {
ScriptEvaluator se = new ScriptEvaluator();
se.cook(
""
+ "static void method1() {\n"
+ " System.out.println(1);\n"
+ "}\n"
+ "\n"
+ "method1();\n"
+ "method2();\n"
+ "\n"
+ "static void method2() {\n"
+ " System.out.println(me.nimavat.shortid.ShortId.generate().toString());\n"
+ "}\n"
);
Arrays.stream(se.getDefaultImports()).iterator().forEachRemaining(App::method1);
se.evaluate(new Object[0]);
}
}
javacc
javacc 的使用就有点复杂了,需要定义自己的schema 然后进行代码生成
- 下载jar
参考地址:https://javacc.github.io/javacc/ 注意下载jar 包,同时重命名为javacc.jar - 配置命令
javacc shell 同时添加执行权限
#!/bin/sh
java -classpath javacc.jar javacc "$@"
- 创建一个简单的schema
options {
STATIC = false;
}
PARSER_BEGIN(Adder)
import java.io.*;
class Adder {
public static void main(String[] args) {
for (String arg : args) {
try {
System.out.println(evaluate(arg));
} catch (ParseException ex) {
System.err.println(ex.getMessage());
}
}
}
public static long evaluate(String src) throws ParseException {
Reader reader = new StringReader(src);
return new Adder(reader).expr();
}
}
PARSER_END(Adder)
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
<INTEGER: (["0"-"9"])+>
}
long expr():
{
Token x, y;
}
{
x=<INTEGER> "+" y=<INTEGER> <EOF>
{
return Long.parseLong(x.image) + Long.parseLong(y.image);
}
}
- 生成代码
./javacc app.jj
- 效果
- 编译执行
javac Adder.java
java Adder 1+2
参考资料
https://github.com/javacc/javacc
https://github.com/janino-compiler/janino
https://github.com/apache/calcite/blob/master/core/src/main/codegen/templates/Parser.jj
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-02-16 cube.js 学习 cli 命令
2020-02-16 cube.js 学习 cube 连接mongodb 试用三
2020-02-16 cube.js 学习 cube 连接mongodb 试用二
2019-02-16 Running Elixir in Docker Containers
2019-02-16 Distributed Phoenix Chat using Redis PubSub
2019-02-16 Connecting Elixir Nodes with libcluster, locally and on Kubernetes
2019-02-16 Distributed Phoenix Chat with PubSub PG2 adapter