xmlsquishsource. compose. build.
English

XML DSL 与项目指南

全部十五条指令

筛选框只是快捷入口;每条契约都完整存在于 HTML 中,并拥有稳定片段链接。

跳转到章节
本页目录

xs:pack

项目结构

最终交付归档的源码根。 聚合编译后的入口与完整资源 bytes,输出可复现 ZIP 格式的 .pack。

允许位置

pack 构建目标的文档根。

允许内容

模块导入、asset/include 和宏展开。

属性

—

有效语法

<xs:pack xmlns:xs="https://xmlsquish.moesegfault.dev/ns">
  <xs:include path="instructions.xml"/>
  <xs:asset path="scripts/check.py"/>
</xs:pack>

约束

  • include 必须面向 entry,不能面向 module。
  • 归档路径不得逃出根,也不得静默覆盖同名成员。
阅读章节: 构建与产物

xs:sopack

项目结构

可重定位编译库的源码根。 保存 IR、编译模块、宏、资源和元信息,不包含最终成品。

允许位置

SOPack 目标的文档根。

允许内容

模块导入、宏声明和资源。

属性

—

有效语法

<xs:sopack xmlns:xs="https://xmlsquish.moesegfault.dev/ns">
  <xs:import src="macros.xml"/>
  <xs:asset path="schema.json"/>
</xs:sopack>

约束

  • 不能 include;宏正文也不能绕过限制。
  • 消费者按不可变库使用;装载时重定位源码身份。
阅读章节: 构建与产物

xs:asset

定义与调用

保存一个完整文件的原始 bytes。 代码与静态资源不解析成 XML、不转码、不做提示词空白处理。

允许位置

pack 或 SOPack 的资源构造,包括宏正文。

允许内容

空。

属性

path必需
相对于定义源码的文件路径。
name可选
归档成员名;默认保留相对路径。

有效语法

<xs:asset path="scripts/check.py" name="scripts/check.py"/>

约束

  • 宏内资源路径属于定义位置,不属于调用者。
  • 不安全路径或冲突成员名必须报错。
阅读章节: 构建与产物

xs:include

定义与调用

编译并包含一个入口。 向 pack 添加入口产品,而不是原样复制 XML 源码。

允许位置

仅 pack 构造;不能用于 SOPack。

允许内容

空。

属性

path必需
相对于定义源码的 entry 路径。
name可选
归档成员名;默认是源文件 stem 加 .prompt。

有效语法

<xs:include path="instructions.xml" name="instructions.prompt"/>

约束

  • 目标必须是 entry,不能是 module。
  • SOPack 不能包含最终产品。
阅读章节: 构建与产物

xs:entry

项目结构

一个输出文档的构建根。 先接受声明,再构造最终文档。

允许位置

构建目标的文档根;绝不能作为导入目标。

允许内容

开头的 xs:import 与 xs:param 声明,随后是普通 XML、xs:expand、xs:insert 与 xs:ifr。

属性

—

有效语法

<xs:entry xmlns:xs="https://xmlsquish.moesegfault.dev/ns">
  <Prompt>Hello</Prompt>
</xs:entry>

约束

  • 所有声明必须位于构造正文之前。
  • 不能定义宏或根 slot,也不能像宏一样被展开。
阅读章节: 快速开始

xs:module

项目结构

可复用宏库。 注册定义,但没有可执行正文。

允许位置

被导入 SourceUnit 的文档根。

允许内容

只能是 xs:import 与 xs:macro,两者可以交错。

属性

—

有效语法

<xs:module xmlns:xs="https://xmlsquish.moesegfault.dev/ns"
           xmlns:app="urn:example:app">
  <xs:macro name="app:hello"/>
</xs:module>

约束

  • 普通 XML、非空白文本、顶层 xs:param 与展开均非法。
  • module 不能作为 entry 构建,也没有隐式 main。
阅读章节: 源码模型

xs:import

项目结构

从模块装载定义。 把另一个 SourceUnit 冻结进符号闭包,但不执行它。

允许位置

xs:module 的直接子元素,或 xs:entry 的声明区。

允许内容

空。

属性

src必需
相对声明文件解析的静态源码引用。

有效语法

<xs:import src="./macros.xml"/>

约束

  • 目标必须是 module,绝不能是 entry。
  • 不产生输出、frame、arg 或 fill;每个源码身份只装载一次。
阅读章节: 源码模型

xs:macro

定义与调用

定义不可变的具名宏。 发布一个命名空间限定符号。

允许位置

xs:module 的直接子元素;宏定义不能嵌套。

允许内容

开头的 xs:param 声明,随后是普通 XML 与组合指令。

属性

name必需
在定义位置解析的带前缀词法 QName。

有效语法

<xs:macro name="app:hello">
  <Message>Hello</Message>
</xs:macro>

约束

  • 展开后的 QName 在冻结闭包中不得重定义。
  • 宏体只能看到定义位置 file.* 与显式调用输入。
阅读章节: 宏、参数与展开

xs:param

定义与调用

声明必需字符串输入。 添加一份不可变 Unicode 字符串契约。

允许位置

xs:macro 开头或 xs:entry 声明区。

允许内容

空。

属性

name必需
在所属宏或 entry 中唯一的名称。

有效语法

<xs:param name="title"/>

约束

  • 所有参数都是必需的,并且必须恰好提供一次。
  • 缺失、未知或重复调用参数都是 hard error。
阅读章节: 宏、参数与展开

xs:expand

定义与调用

调用静态解析的宏。 把显式输入求值一次,并返回有序 XML 节点序列。

允许位置

允许产生输出节点的构造正文。

允许内容

只能是 xs:arg 与 xs:fill 调用输入。

属性

ref必需
冻结符号表中已有宏的静态带前缀 QName。

有效语法

<xs:expand ref="app:hello">
  <xs:arg name="title" value="Hello"/>
</xs:expand>

约束

  • ref 不能来自 binding、字符串拼接或正则捕获。
  • 新 frame 不继承调用方 arg.*、match.* 或 slot。
阅读章节: 宏、参数与展开

xs:arg

值与 XML 内容

提供一个不可变字符串。 在 callee frame 创建前于调用方求值。

允许位置

xs:expand 的直接子元素。

允许内容

value/get 形式为空;body 形式可以组合只产生文本的内容。

属性

name必需
目标宏声明的参数名。
value互斥选择
字面字符串形式。
get互斥选择
已有标量 binding 形式。

有效语法

<xs:arg name="title" get="arg.heading"/>

约束

  • value、get、body 恰选其一。
  • body 必须只产生字符数据;空白保留,出现 XML 节点即报错。
阅读章节: 宏、参数与展开

xs:fill

值与 XML 内容

提供 XML 节点序列。 在调用方求值并冻结序列,再提供给 slot。

允许位置

xs:expand 的直接子元素。

允许内容

产生 XML 节点序列的任意有效构造正文。

属性

name必需
目标宏声明的 slot 名称。

有效语法

<xs:fill name="body"><Message>Hello</Message></xs:fill>

约束

  • 未知 slot 名与同一次调用中的重复 fill 都是 hard error。
  • fill 恰好求值一次,也不能当作字符串读取。
阅读章节: 宏、参数与展开

xs:slot

值与 XML 内容

插入调用方提供的 XML 内容。 在一个宏内标记具名插入点。

允许位置

xs:macro 构造正文内部。

允许内容

空。

属性

name必需
在所属宏内唯一的 slot 名称。
required可选 · 默认值: false
布尔标志;true 要求存在对应 fill。

有效语法

<xs:slot name="body" required="true"/>

约束

  • 缺失 required fill 是 hard error;未填充的可选 slot 不产生输出。
  • slot 不能通过 get、xs:insert 或正则读取。
阅读章节: 宏、参数与展开

xs:insert

值与 XML 内容

把一个标量输出为转义文本。 创建文本节点,不重新解析标记。

允许位置

构造正文或只允许文本的 xs:arg body。

允许内容

空。

属性

get必需
已有的 file.*、arg.* 或作用域内 match.* binding。

有效语法

<xs:insert get="arg.name"/>

约束

  • binding 不存在是 hard error,而不是空字符串。
  • <、> 与 & 等字符会被转义,绝不解释为 XML 标记。
阅读章节: 控制与作用域

xs:ifr

控制

匹配字符串并条件输出。 在正文运行期间暴露词法命名捕获。

允许位置

构造正文,包括嵌套的宏与 ifr 正文。

允许内容

只在匹配成功后求值的任意有效构造正文。

属性

get互斥选择
已有标量 binding 输入。
str互斥选择
字面字符串输入。
pattern必需
采用受支持子集的 Unicode 正则表达式。

有效语法

<xs:ifr get="arg.value" pattern="^(?&lt;head&gt;.)$">
  <xs:insert get="match.head"/>
</xs:ifr>

约束

  • get 与 str 恰选其一;匹配失败不产生输出。
  • 只暴露命名捕获。禁止位置捕获组、look-around 与 backreference;非捕获分组使用 (?:…)。
  • match.* 在词法块结束时消失;未参与匹配的可选捕获不存在。
阅读章节: 控制与作用域