px普贤教程PuXian
普贤教程 › 包参考

pxml 包

PXML 配置语言解析器(qg-issue 04 收编)

纯函数风格(无 IO/无状态),入口 pxml_parse(text) -> Result(0.2.0 起):

项值
包名pxml
版本0.2.0
可用版本0.1.0 / 0.2.0
入口pxml.px
分类数据格式与编解码
文件数 / 行数1 / 451

安装与引入

bash
pxpkg init          # 首次
pxpkg add pxml@0.2.0
pxpkg install
px
import pxml
所属分类教程:数据格式与编解码

公开接口

函数参数
pxml_parsetext
其余 20 个 def(内部与辅助,可直接调用但不属稳定接口)
函数参数
px_nd(): # 空 dict(M129 起 {} 即空 dict;此处保留 json_parse 旧写法,行为一致)
px_isdigitc
px_isalphac
px_isid0c
px_isidc
px_is_unitu
px_dur_nsnum, unit
px_scan_stringtext, i, line
px_scan_numbertext, i, line
px_scan_identtext, i, line
px_tokenizetext
px_seenarr, key
px_tnametk
px_parse_keytoks, pos
px_parse_valuetoks, pos
px_parse_calltoks, pos
px_parse_arraytoks, pos
px_parse_bodytoks, pos, in_con
px_parse_containertoks, pos
px_parse_documenttoks

包内说明(源码头注释)

text
============================================================
普贤标准库:std.pxml —— PXML 配置语言解析器(qg-issue 04 收编)
------------------------------------------------------------
纯函数风格(无 IO/无状态),入口 pxml_parse(text) -> Result(0.2.0 起):
Ok(dict)  解析成功,载荷 = 配置树
Err(str)  失败,载荷 = "line N: ..." 诊断文案
消费:r.is_ok() / r.err() / r.unwrap(),或函数内 `let v = pxml_parse(t)?`
JSON 序列化形态不变(Result → {"ok":bool,"value":...}),但 Result **不支持** r["ok"] 索引
(索引 Result 会 R1002 响亮报错,不静默给 null)⇒ 旧调用点漏改会当场红,不会静默错值。
随发布包分发:import std.pxml。
加密能力说明:ENC 字段级加密"识别不解密"(分层铁律,解析器永不碰密钥);
消费方运行时解密依赖 aes_gcm/base64 native —— 按 std.gfx 先例,
ENC 解密主打编译模式(pxc build);纯解析(无加密函数)双模式一致。
完整规范:docs/PXML.md(v0.6)

设计决策(实现约定,v0.3):
- duration 字面量(720h / 1.5s)换算为纳秒 int(1d = 86400e9 ns)
- ENC[...] 整体识别为"带标记字符串",原样保留含 ENC[ 前缀;
解析器不解密、不校验内部——解密是消费方运行时职责(分层铁律)
- env("X") / include("p") 解析为 call 节点
{"__call":"env","args":["X"]},消费方展开(parser 不做 IO)
- 字符串必须引号(' " 或 """),无裸字符串、无隐式类型转换
- 块 {} 与 dict {} 同形;键重复报错;# 注释(引号/ENC 内不剥离)
- 不支持:缩进语义、YAML 裸值/冒号、\u 转义(直接写 UTF-8)、
未知 duration 单位、裸标识符值、科学计数 duration
语法 EBNF 见 docs/CONFIG-FORMAT.md §5.2
============================================================
---- 工具 ----