Skip to content

Repository files navigation

Wenyan4j

基于 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

About

A minimal `wenyan-lang` runtime in Java.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages