# magic-script-antlr
**Repository Path**: yaoqis/magic-script-antlr
## Basic Information
- **Project Name**: magic-script-antlr
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-09
- **Last Updated**: 2026-08-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# magic-script-antlr
一个使用 ANTLR 4 构建的、可嵌入 JVM 的小型动态脚本语言。项目当前版本为 `1.0.0-SNAPSHOT`,包含独立 AST、词法作用域、闭包、解释器、完整 ASM Java 8 字节码后端、`invokedynamic` 调用点、模块、受控 Java 互操作和开发工具接口。
## 已实现
- `var`、`let`、只读 `const`
- 块级词法作用域和闭包
- Lambda:`x => x + 1`、`(a, b) => { return a + b; }`
- `if/else`、`while`、`for (key, value in source)`
- `return`、`break`、`continue`
- `throw`、`try/catch/finally`
- 递归列表/Map 解构、末尾 rest 绑定
- 列表、Map 和调用参数 spread
- 支持 `${expression}` 的模板字符串及嵌套花括号
- 数字、字符串、布尔值、`null`、List 和 Map
- 算术、比较、逻辑、三元和复合赋值
- 函数调用、属性访问、索引访问和 `?.`
- 宿主函数、显式模块注册和白名单 Java 反射
- 解释器/ASM 双执行模式与差分测试
- 执行步数、调用深度、源码长度和稳定异步取消门面
- 线程安全的源码/字节码缓存和并发执行
- 类、方法、字段三级 Java 互操作授权
- ASM 运行时错误源码定位和生成类显式释放
- Lambda 编译为独立静态方法,闭包只保存显式捕获 Cell,无解释式回退
- 调用、算术、属性和索引操作使用独立 `invokedynamic` 调用点
- JVM local、Frame slot、捕获 Cell 三层变量存储策略
- 同步断点调试、步入/步过/步出、终止和局部变量快照
- 可嵌入语言服务:诊断、文档符号和关键字补全
- stdio JSON-RPC Language Server Protocol 入口
- 编译缓存、解释器和 ASM 的线程安全性能指标
- 具有 `StableApi`、`ExperimentalApi` 和 `InternalApi` 分级的 1.0 API 契约
## 环境
- JDK 8+
- Maven 3.8+
- ANTLR Tool/runtime 4.9.3
项目固定在 ANTLR 4.9.3,因为当前构建环境是 JDK 8,而 4.10.1 和 4.13.1 的已发布 Tool 都是 Java 11 字节码。若升级到新的 ANTLR 版本,构建 grammar 需要 JDK 11,但生成代码仍可配置为面向 Java 8。
## 构建与运行
```bash
./mvnw test
./mvnw package
java -jar target/magic-script-antlr-1.0.0-SNAPSHOT.jar examples/demo.ms
```
Windows 使用 `mvnw.cmd`。CI 在 JDK 8 和 JDK 11 上运行同一套 `verify`;仓库同时提供 GitHub Actions 配置和可供 Gitee Jenkins 流水线使用的 `Jenkinsfile`。
也可以嵌入 Java:
```java
MagicScriptEngine engine = MagicScriptEngine.standard();
engine.setGlobal("price", 12);
try (CompiledMagicScript script = engine.compile("return price * 2;")) {
Object interpreted = engine.execute(script);
Object compiled = engine.execute(script, null, ExecutionMode.BYTECODE);
}
```
## 架构

上图是中文详细总览,技术类名保留英文以对应源码;下方 Mermaid 图保留具体模块关系,作为可维护的架构来源。
```mermaid
flowchart TB
JAVA["Java 嵌入应用"] --> ENGINE["MagicScriptEngine
稳定 API:编译、执行、配置"]
CLI["MagicScript CLI"] --> ENGINE
IDE["IDE / 编辑器"] --> LSP["Language Server
stdio JSON-RPC"]
LSP --> LS["MagicScriptLanguageService
诊断、符号、补全"]
ENGINE --> CACHE["Source LRU Cache"]
CACHE --> PARSER["ParserFacade
ANTLR Lexer / Parser"]
LS --> PARSER
GRAMMAR["MagicScriptLexer.g4
MagicScriptParser.g4"]
GRAMMAR -. "生成" .-> PARSER
PARSER --> TREE["ANTLR ParseTree"]
TREE --> BUILDER["AstBuilder"]
BUILDER --> AST["独立不可变 AST
SourceSpan"]
AST --> ANALYZER["SemanticAnalyzer"]
ANALYZER --> RESOLUTION["Resolution
Scope / Symbol / FunctionLayout / Capture"]
RESOLUTION --> SCRIPT["CompiledMagicScript
已解析、已绑定脚本"]
RESOLUTION --> STORAGE["变量分层策略
JVM local / Frame slot / Cell"]
SCRIPT --> INTERPRETER["Interpreter
语义参考实现"]
SCRIPT --> ASM["AsmCompiler
Java 8 字节码"]
STORAGE --> INTERPRETER
STORAGE --> ASM
ASM --> VERIFY["CheckClassAdapter
字节码校验"]
VERIFY --> BYTECODE["BytecodeProgram
invokedynamic / 静态 Lambda"]
DEBUGGER["DebugSession
断点、单步、变量快照"] -. "仅解释器模式" .-> INTERPRETER
INTERPRETER --> RUNTIME["共享运行时语义
ExecutionContext / ExecutionBudget
Frame / Cell / CompiledClosure
ValueOperations / DynamicCallSite
HostInterop / HostAccessPolicy"]
BYTECODE --> RUNTIME
GLOBALS["Globals / Host Functions"] --> RUNTIME
MODULES["Registered Modules"] --> RUNTIME
OBJECTS["允许访问的 Java 对象"] --> RUNTIME
RUNTIME --> RESULT["结果或带 SourceSpan 的异常"]
ENGINE -. "缓存指标" .-> METRICS["MetricsRecorder
编译、缓存、执行、失败"]
INTERPRETER -. "执行指标" .-> METRICS
BYTECODE -. "执行指标" .-> METRICS
classDef entry fill:#e8f1ff,stroke:#2563eb,color:#172554
classDef api fill:#ecfdf5,stroke:#059669,color:#064e3b
classDef frontend fill:#fff7ed,stroke:#ea580c,color:#7c2d12
classDef semantics fill:#f5f3ff,stroke:#7c3aed,color:#4c1d95
classDef backend fill:#fef2f2,stroke:#dc2626,color:#7f1d1d
classDef runtime fill:#f0fdfa,stroke:#0d9488,color:#134e4a
classDef host fill:#f8fafc,stroke:#64748b,color:#1e293b
classDef engineering fill:#fefce8,stroke:#ca8a04,color:#713f12
class JAVA,CLI,IDE entry
class ENGINE,SCRIPT,LS,LSP api
class GRAMMAR,PARSER,TREE,BUILDER,AST frontend
class ANALYZER,RESOLUTION,STORAGE semantics
class INTERPRETER,ASM,VERIFY,BYTECODE,DEBUGGER backend
class RUNTIME runtime
class GLOBALS,MODULES,OBJECTS,RESULT host
class CACHE,METRICS engineering
```
ANTLR 生成的 `ParserRuleContext` 只存在于解析阶段,`AstBuilder` 之后全部模块只依赖独立 AST。`SemanticAnalyzer` 统一完成作用域、符号和闭包捕获分析,生成的 `Resolution` 同时驱动解释器和 ASM 后端,便于进行全语法差分测试。
解释器是语义参考实现;ASM 后端生成并校验 Java 8 class,将 Lambda 编译成独立静态方法,并通过 `invokedynamic` 完成动态调用和运算。两种模式共享 `ExecutionContext`、动态值语义、宿主访问策略和执行预算。调试器挂接解释器语句边界,LSP 和语言服务复用同一套解析及语义分析前端。
## 文档
- [快速开始](docs/GETTING_STARTED.md)
- [嵌入与运行时](docs/EMBEDDING.md)
- [语言规范](docs/LANGUAGE_SPEC.md)
- [调试器、语言服务和 LSP](docs/TOOLING.md)
- [架构](docs/ARCHITECTURE.md)
- [API 兼容策略](docs/API_COMPATIBILITY.md)
- [测试策略与用例目录](docs/TESTING.md)
- [发布流程](docs/RELEASING.md)
## 本机基准
```bash
java -cp target/magic-script-antlr-1.0.0-SNAPSHOT.jar io.github.magicscript.cli.BenchmarkCli 10000
```
该入口先预热,再分别测量解释器和字节码模式;它用于同一机器上的回归比较,不作为跨机器性能承诺。
## 安全边界
Java 反射默认全部拒绝。`allowHostClass` 放行一个普通类的全部公开成员;更小权限的嵌入场景应使用 `allowHostMethod(type, name)` 和 `allowHostField(type, name)`。JavaBean 属性读写分别校验真实的 getter/setter 方法名,注册模块不会隐式开放反射。反射、进程、类加载器、线程和 JDK 内部类型不能被授权。生产环境仍应暴露窄接口对象,并设置执行步数、调用深度和源码长度限制。
## 兼容性
1.x 在 Java 8 及以上版本运行。标记为 `StableApi` 的类型和成员遵循语义化版本兼容承诺;实验性入口、内部包、AST/语义模型及生成字节码不在二进制兼容范围内。详细规则见 [API 兼容策略](docs/API_COMPATIBILITY.md)。