# DoDSL **Repository Path**: pei6/DoDSL ## Basic Information - **Project Name**: DoDSL - **Description**: Domain Orchestrate DSL - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-20 - **Last Updated**: 2026-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LogicalModel DSL 引擎 一种领域特定语言(DSL),用于定义对象、动作、步骤和状态机,支持代码生成到 C、C++ 和 Python。包含基于 Web 的可视化编辑器。 ## 架构 - **engine/**(Rust)— DSL 解析器、语义分析器、IR 模型、CLI 工具(集成 miette 错误报告) - **codegen/**(Python + Jinja2)— 基于模板的代码生成,支持 C、C++、Python 目标 - **visual/**(React + TypeScript)— 基于 React Flow 的拖拽式可视化编辑器 ## 环境要求 - Rust 1.70+(`cargo`) - Python 3.10+(需要 `jinja2` 和 `pytest`) - Node.js 18+(可视化编辑器) ```bash pip install -r codegen/requirements.txt cd visual && npm install ``` ## 使用方法 ### 检查语法和语义 ```bash cd engine cargo run -- check ../examples/door.lm ``` 错误信息会高亮显示源码上下文(基于 miette): ``` × Duplicate object 'Door' ╭─[door.lm:2:1] 1 │ object Door 2 │ object Door · ─────┬───── · ╰── here ╰──── ``` ### 导出 IR 为 JSON ```bash cargo run -- export ../examples/door.lm -o model.json ``` ### 编译到目标语言 ```bash cargo run -- compile ../examples/door.lm --target c --output ../gen/c cargo run -- compile ../examples/door.lm --target cpp --output ../gen/cpp cargo run -- compile ../examples/door.lm --target python --output ../gen/python ``` ### 可视化编辑器 ```bash cd visual npm run dev ``` 在浏览器中打开 http://localhost:5173,功能包括: - 拖拽式状态机画布(React Flow) - 侧边栏管理对象、动作、步骤、状态、事件 - 步骤拖拽排序 - 属性面板编辑迁移和步骤实现代码 - 导入/导出 JSON 和 `.lm` DSL 文件 - 加载示例模型快速上手 ## DSL 语法 每一行以关键字开头,表达一个完整的语义操作: ```text object Door # 定义对象 action Door.Open # 定义动作 step Door.Open unlock "unlock the door" # 添加步骤(带 ID) step Door.Open push "push the door" reorder Door.Open [push, unlock] # 重排步骤顺序 state Door Closed # 定义状态 event global PowerOff # 全局事件 event Door Push # 对象事件 transition Door Closed --Push--> Opened do [Open] # 状态迁移 transition Door Closed --Push--> Opened when Open.result == success # 条件迁移 impl Door.Open.unlock lang=c { # 步骤实现 gpio_set(LOCK_PIN, LOW); } ``` ## 运行测试 ```bash # Rust 测试(解析器、语义分析、IR) cd engine && cargo test # Python 测试(加载器、C/C++/Python 代码生成) cd codegen && python -m pytest tests/ -v ``` ## 示例模型 `examples/` 目录包含多个汽车零部件的 DSL 模型文件: | 文件 | 零部件 | 状态数 | 迁移数 | |------|--------|--------|--------| | `seat.lm` | 座椅 | 5 | 11 | | `car_door.lm` | 车门 | 3 | 5 | | `window.lm` | 车窗 | 4 | 11 | | `mirror.lm` | 后视镜 | 3 | 5 | | `wiper.lm` | 雨刷 | 4 | 15 | | `interior_light.lm` | 内灯 | 3 | 10 | | `reading_light.lm` | 阅读灯 | 2 | 3 |