本项目实现了一个语法简单、功能完备的脚本语言解析器。通过解析 .properties 配置文件,可以将业务逻辑描述为一系列行为指令,并生成一个可执行的 DALObject 对象。该对象支持动态调用、变量管理、流程控制等操作,适合用于游戏AI、业务流程引擎、测试脚本等场景。
- 轻量级脚本语言:支持变量、运算符、流程控制、方法调用等基本语法。
- 配置驱动:所有行为逻辑均可通过
.properties文件定义,无需重新编译代码。 - 环形缓冲区:用于存储指令执行过程中的临时数据,支持多参数传递。
- 多类型变量支持:支持字符串、整数、小数、布尔值四种类型的变量存储与操作。
- 可扩展行为集:内置
LOG、ADD、MOV、CONCAT、CALL、LT、EQUAL等行为,支持根据业务需求扩展。 - 支持嵌套与跳转:支持标签、条件跳转、方法调用,具备图灵完备性。
| 类名 | 说明 |
|---|---|
ObjectParser |
解析器接口,定义将输入流解析为 DALObject 的方法。 |
PropertiesParser |
基于 .properties 的老版本解析器,使用单句语法。 |
PropertiesChunkParser |
基于 .properties 的块语法解析器,支持更灵活的代码块编写。 |
DALObject |
核心行为执行类,维护变量表和环形缓冲区,执行解析后的指令序列。 |
DALObject 内部维护一个环形数组作为临时存储区,用于存放指令执行过程中的参数。同时,它维护四个映射表,分别存储四种类型的变量:
| 类型 | 参数标识 |
|---|---|
| 字符串 | -s |
| 整数 | -i |
| 小数 | -d |
| 布尔值 | -b |
| 指令 | 说明 |
|---|---|
LOG |
打印环形缓冲区最后一个值 |
ADD |
取最后三个值:a + b,结果存入变量 c |
MOV |
取最后三个值:将值 a 存入变量 b,类型为 c |
CONCAT |
取最后三个值:将字符串 a 与 b 拼接,存入变量 c |
CALL |
取最后一个值作为方法名,调用对应行为 |
LT |
取最后三个值 a, b, c,若 a < b,跳转到第 c 行 |
EQUAL |
取最后三个值 a, b, c,若 a == b,跳转到第 c 行 |
你可以根据业务需要扩展更多行为,例如游戏中的“移动”、“攻击”等。
| 参数 | 含义 |
|---|---|
-v |
字面量 |
-s |
字符串变量 |
-i |
整数变量 |
-d |
小数变量 |
-b |
布尔变量 |
-a |
调用方法 |
-e |
执行表达式(预留) |
- 参数取值:
语法参数 值,如-s value,将变量value的值取出并存入环形缓冲区。支持嵌套,如-d -s value。 - 基本行为:直接写行为名,如
ADD。 - 标签定义:以
:开头,如:loop,将当前行号存储为整数变量。
-v 1;
-d doubleValue;
-v res;
ADD;
将 1 与 doubleValue 相加,结果存入变量 res(类型自动推断为小数)。
:loop;
-v 1;
-i counter;
-v counter;
ADD;
-i counter;
LOG;
-v 5;
-i loop;
LT;
实现一个从 0 到 5 的计数器循环。
-v greetings
CALL
调用名为 greetings 的行为块。
项目提供了 test_chunk.properties 作为示例配置文件,展示了以下功能:
- 数据定义(
data.*) - 行为定义(
action.*) - 变量操作与类型转换
- 条件跳转与循环
- 方法调用与嵌套
- 标签与跳转逻辑
你可以通过运行该示例,观察脚本执行的完整流程。
- 外部函数支持(-e):可扩展为调用外部 Java 方法或监听器。
- 对象查找(?):支持跨对象方法调用,实现更复杂的交互。
- 动态函数定义(*f):支持运行时定义和修改行为逻辑。
- 编写
.properties配置文件。 - 使用
PropertiesChunkParser或PropertiesParser解析文件。 - 获取
DALObject实例并调用action("方法名")执行逻辑。
ObjectParser parser = new PropertiesChunkParser();
parser.parse(new FileInputStream("test_chunk.properties"));
DALObject obj = parser.getObject();
obj.action("tryAdd");- 游戏 AI 行为树配置
- 业务流程引擎
- 自动化测试脚本
- 动态规则系统