跳转至

OpenEX development for Java

  • 本文介绍了如何用Java语言对OpenEX进行扩展开发
  • 开发之前您需要了解OpenEX每个包的作用是什么
  • AST2.0版本包名全部换由ex.openex换成io.openex

编译器

存在于io.openex.compile包下,是脚本的初步分析器

文件I/O与词法分析

文件读取功能由io.openex.compile.CompileManager类的getFileData实现
词法分析器由io.openex.compile.LexicalAnalysis类实现,解析出的Token记录以LexicalAnalysis的子类Token实现

语法/语义分析

初步语句分割和语法分析由io.openex.compile.parser.Parser类实现,解析出的语句会进一步由所有继承io.openex.compile.parser.BaseParser接口的类进行语法和语义分析
io.openex.compile.Compiler类用于记录由include语句导入的库名或者定义过的函数名和变量名,用于语义分析的语句校验

表达式分析

该表达式分析采用了未发布的JavaEditionPlus版本的表达式分析方式,支持了布尔表达式与算术表达式混合使用,也支持了部分变量重赋值的语法,相比于之前的表达式分析,解决了很多BUG,提高了解析效率
其功能由io.openex.compile.expression.ExpressionParser类实现

解释器

执行引擎

位于io.openex.astvm.exe包下,其内部三个类作用和功能分别是
Executor执行引擎本体,解释器核心
LibraryLoader实现库的加载器,用于加载内部库与外部库
Script代表一个编译好的脚本

内部字节码

是编译器的输出结果,仅用于内部执行引擎运行和解析,其他平台的字节码会另外编译出一套,位于io.openex.astvm.code包下
opcode包是一些表达式编译后的字节码,用于进行运算
struct包是一些语句编译后的字节码,用于流程控制与创建函数或者变量

线程管理器

位于io.openex.astvm.thread包下,是OpenEX多线程功能的实现
ThreadManager用于管理线程
ThreadTask代表创建的单个线程

变量

位于io.openex.astvm.obj包下,其中的类代表OpenEX脚本创建的变量,作为一种API接口方便外部库开发者调用开发
所有类全部继承于io.openex.astvm.obj.ExObject

实现库

位于io.openex.astvm.lib包下,是作为外部库开发者的接口和内部库的实现而存在
所有库全部继承于io.openex.astvm.lib.RuntimeLibrary
库中函数功能实现类全部继承于RuntimeLibrary的子类RuntimeFunction

其他

io.openex.util包内是一些OpenEX内部处理异常和输出模块的实现,其中有编译异常,运行时异常,输出模块
输出模块由io.openex.util.ScriptOutputStream实现,为了方便EXCompile和其他版本的实现
io.openex.CommandManager用于处理命令行的参数,在新版中可能会被joptsimple第三方库代替 io.openex.Main是OpenEX主类,用于初始化编译器和解释器,其中附带了OpenEX版本信息和关键字列表等

如何添加您的代码

构建

本教程建议您使用IDEA2022以上版本构建此项目,将项目导入到您的IDEA中,直接点击右上角的运行即可调试您的代码,也可以通过构建JAR包来发布您修改过的OpenEX版本

其他IDE的用户中 使用VisualStudioCode的用户请使用以下代码构建项目

编译源代码
javac -d . src\*.java

运行源代码
java -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath %项目根目录路径% io.openex.Main

添加代码

根据需求不同,您可以更改OpenEX的编译器或解释器中代码的实现来完成您自己的功能

注意!
  • 修改后的OpenEX便不在代表OpenEX主要版本
  • 您需要将io.openex.Main中的两个常量更改为您自己的版本号以区分OpenEX