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="^(?<head>.)$">
<xs:insert get="match.head"/>
</xs:ifr>约束
- get 与 str 恰选其一;匹配失败不产生输出。
- 只暴露命名捕获。禁止位置捕获组、look-around 与 backreference;非捕获分组使用 (?:…)。
- match.* 在词法块结束时消失;未参与匹配的可选捕获不存在。
没有匹配的指令。