基于 Java 的文言编程语言运行时,使用 ANTLR4 解析并树遍历解释执行。
- 变量声明与命名:
吾有一數。曰三。名之曰「甲」。 - 算术运算:
加減乘除…以…所餘幾何 - 逻辑运算:
中有陽乎中無陰乎 - 条件分支:
若…者…若非…云云 - 循环:
為是…遍恆為是凡…中之 - 数组:
充銜夫…之……之長 - 函数:定义
吾有一術、调用施、返回乃得 - 赋值与删除:
昔之…者今…是矣今不復存矣 - 输出:
書之 - 异步:
待之以待施Promise then/crash 链 - 导入扩展:
吾嘗觀『…』之書
- 族(class):
吾有一族。曰「鸟」。虚族(abstract)终族(final) - 约(interface):
吾有一约。曰「可飞」。 - 承(extends):单继承,支持隐式/显式父类构造器调用
- 守(implements):多接口实现,编译期校验
- 属性:
公之私之密之+恆性(只读)+ 默认值 - 方法:
其公術其私術其密術其虚術其術(默认公) - 终術(final 方法):
其恆公術其恆密術其恆術 - 初術(构造器):含参、多重重载、
施父之初显式调用父类 - 实例化:
生一「凤」曰「丹」。与「「丹朱」」。 - 己/父 引用:
夫己之「名」施父之「鸣」施父之初
@WenyuanPavilion声明扩展库名@WenyuanFunction暴露 public static 方法@WenyuanField暴露 Record/字段为选择器@WenyanClass@WenyanInterface@WenyanMethod@WenyanProperty暴露 Java 类为文言族/约/術/属性
# 运行例程
./gradlew.bat run --args="example/文言万物.wy"
./gradlew.bat run --args="example/随机骰子.wy"
# 运行测试
./gradlew.bat test
# 构建可执行 Jar
./gradlew.bat shadowJar
java -jar build/libs/Wenyan4j-1.0.0-all.jar example/文言万物.wy| 文件 | 说明 |
|---|---|
天地,好在否.wy |
基础输出 |
乘算口訣.wy |
九九乘法表 |
埃氏筛.wy |
埃拉托色尼素数筛 |
歸併排序.wy |
归并排序 |
增乘開平方.wy |
增乘开平方算法 |
大衍求一.wy |
大衍求一术 |
文言万物.wy |
面向对象例程:鸟→凤→黄鹂 继承链与接口 |
随机骰子.wy |
面向对象例程:LCG 随机数生成器与骰子 |
吾有一约。曰「可翔」。 # 定义接口
其约如是。 其公術「翱翔」也。
是謂「可翔」之约也。
吾有一族。曰「鸟」。 # 基类
其族如是。
公之「名」者。言也。 # 公属性
密之「气力」者。數也。曰一百。 # 密属性(子类可见),默认值100
其恆性「羽色」者。言也。 # 只读属性
其初術。 # 构造器
欲行是術。必先得一言曰「名」。一言曰「色」。
乃行是術曰。
昔之己之「名」者。今「名」是矣。
昔之己之「羽色」者。今「色」是矣。
是謂之初術也。
其公術「鸣」。 # 公方法
乃行是術曰。 夫己之「名」。書之。 是謂「鸣」之術也。
是謂「鸟」之族也。
吾有一终族。曰「凤」。承「鸟」。守「可翔」。 # 终族(不可继承)
其族如是。
其初術。 欲行是術。必先得一言曰「名」。一言曰「色」。
乃行是術曰。 施父之初。与「名」。与「色」。 # 调用父类构造器
是謂之初術也。
其公術「翱翔」。 # 实现接口方法
乃行是術曰。 施父之「鸣」。 有言「「振翅」」。書之。
是謂「翱翔」之術也。
是謂「凤」之族也。
生一「凤」曰「丹」。与「「丹朱」」。与「「赤」」。
施「丹」之「翱翔」。
脚本以 吾嘗觀『简化秘术』之書 开头时,自动启用简化字模式:
吾嘗觀『简化秘术』之書。
吾有一数。曰三。书之。 # 可用「数」「书」替代「數」「書」
支持的简化映射:尝→嘗 观→觀 书→書 术→術 数→數 阴→陰 阳→陽 长→長 于→於 为→為 义→義 变→變 几→幾 余→餘 恒→恆 无→無
复→復 万→萬 亿→億 丝→絲 尘→塵 厘→釐 减→減 谓→謂
// 定义扩展库
@WenyuanPavilion("算经")
public class MyMath {
@WenyuanFunction("平方")
public static WenyanValue square(List<WenyanValue> args) {
return WenyanValue.number(args.get(0).asNumber().pow(2));
}
}
// 注册并运行
WenyanEngine engine = new WenyanEngine()
.registerWenyuanClass(MyMath.class);
engine.execute("吾嘗觀「算经」之書。施「平方」於三。書之。");// 用注解暴露 Java 类为文言族
@WenyanClass("计数器")
public class Counter {
@WenyanProperty("值")
private int value = 0;
@WenyanMethod(value = "初術", isConstructor = true)
public Counter() {
}
@WenyanMethod("增值")
public void increment() {
value++;
}
}LGPL-3.0