OpenRobot.Litegraph.MmidSyntax
1.0.0
dotnet add package OpenRobot.Litegraph.MmidSyntax --version 1.0.0
NuGet\Install-Package OpenRobot.Litegraph.MmidSyntax -Version 1.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="OpenRobot.Litegraph.MmidSyntax" Version="1.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="OpenRobot.Litegraph.MmidSyntax" Version="1.0.0" />
<PackageReference Include="OpenRobot.Litegraph.MmidSyntax" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add OpenRobot.Litegraph.MmidSyntax --version 1.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: OpenRobot.Litegraph.MmidSyntax, 1.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package OpenRobot.Litegraph.MmidSyntax@1.0.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=OpenRobot.Litegraph.MmidSyntax&version=1.0.0
#tool nuget:?package=OpenRobot.Litegraph.MmidSyntax&version=1.0.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
OpenRobot.Litegraph.MmidSyntax
MMID 规则选择器的文本 ⇄ AST(net8.0):类 CSS 选择器语法 —— 复合选择器 + 组合子 + 伪类(含两个段历史伪类)。 纯函数、零依赖,只做语法,不做求值。
- 只做一件事:
文本 → AST → JSON,以及反向的JSON → AST → 文本。解析、序列化、比较各是一个静态类, 没有状态、没有 IO、不打日志。 - 不认识字段名:
$BUS.Program.Main之类原样进 AST;要校验名字,传一个IMmidFieldCatalog进来, 不给就一律接受。这样业务侧新增字段不需要本包发版。 - AST 带版本:
MmidAstVersion.Current跟着结构走 —— 加伪类要升版本,修 bug 不用。FromJson遇到超出[Minimum, Current]的版本直接拒绝,不按老结构猜着读。 - 零外部依赖:nuspec 依赖 group 为空,只用 BCL 的
System.Text.Json。
安装
<PackageReference Include="OpenRobot.Litegraph.MmidSyntax" Version="1.0.0" />
包由本仓库产出:
dotnet pack Litegraph/OpenRobot.Litegraph.MmidSyntax/OpenRobot.Litegraph.MmidSyntax.csproj -c Release
依赖:无。
快速开始
using OpenRobot.Litegraph.MmidSyntax;
var selectors = MmidSelectorParser.Parse("T3.S8000:cut:stable(300ms):not(:nth(1))");
selectors.Count; // 1(逗号分隔的选择器列表)
var complex = selectors.Selectors[0];
var subject = complex.Subject; // 主体复合选择器
subject.TypeName; // "T3"
subject.Classes; // ["S8000"]
complex.Pseudos; // :cut / :stable(300ms) / :not(...)
// 写回文本(往返稳定)
var text = MmidSelectorWriter.Write(selectors);
// 落库 / 下发
var json = MmidSelectorJson.ToJson(selectors);
var back = MmidSelectorJson.FromJson(json);
不抛异常的版本(页面校验、规则编辑器用这个):
if (!MmidSelectorParser.TryParse(userInput, out var ast, out var error))
{
Console.WriteLine($"{error!.Message}"); // 消息里带「(位置 12)」
return;
}
语法
selector-list := selector ( "," selector )* ;
selector := compound ( ">" compound )* pseudo* ;
compound := typename? ( "." value )* ( "[" field op operand "]" )* ;
typename := "T" INT | "*" ;
pseudo := ":cut" | ":stable(" INT "ms" )"
| ":nth(" INT ")" | ":not(" selector ")"
| ":prev(" field op operand ")" // 紧邻的上一段
| ":lastMatch(" field op operand ")" // 本件内最近一次被本规则命中的段
op := "=" | "!=" | "^=" | "$=" | "~=" | "in(" list ")" ;
operand := literal | "@" computed-field ;
[main=O1026] T3.S8000:cut:stable(300ms):not(:nth(1))
T4 > T3:lastMatch($BUS.Tool.Tcode = @previousTool)
T3, T4
校验字段名
public sealed class FieldCatalog : IMmidFieldCatalog
{
private readonly HashSet<string> _known = new(StringComparer.Ordinal) { "$BUS.Cut", "$BUS.Tool.Tcode" };
public bool Contains(string field) => _known.Contains(field);
}
MmidSelectorParser.Parse("T3[$BUS.Tool.Tcode = 3]", new FieldCatalog());
API 速查
解析与写回
| 成员 | 说明 |
|---|---|
MmidSelectorParser.Parse(text, catalog?) |
解析;语法错误抛 MmidSyntaxException |
MmidSelectorParser.TryParse(text, out ast, out error) |
不抛异常 |
MmidSelectorParser.TryParse(text, catalog, out ast, out error) |
不抛异常 + 字段目录校验 |
MmidSelectorWriter.Write(list) / WriteComplex(selector) |
AST → 文本 |
MmidSyntaxException.Position |
出错处的字符偏移(从 0 起),供编辑器定位 |
JSON
| 成员 | 说明 |
|---|---|
MmidSelectorJson.ToJson(list) |
AST → JSON |
MmidSelectorJson.FromJson(json) |
JSON → AST;版本不支持或结构非法时抛 |
MmidSelectorJson.TryFromJson(json, out ast, out error) |
不抛异常 |
MmidAstVersion.Minimum / Current / IsSupported(v) |
AST 结构版本(当前 1) |
AST
| 类型 | 说明 |
|---|---|
MmidSelectorList |
顶层:Selectors / Count |
MmidComplexSelector |
组合子链:Compounds / Subject / Predecessors / Pseudos |
MmidCompound |
复合选择器:TypeName / Classes / Attributes / IsWildcardType |
MmidAttribute |
[field op operand]:Field / Operator / Values |
MmidPseudo |
MmidCutPseudo / MmidStablePseudo / MmidNthPseudo / MmidNotPseudo / MmidPrevPseudo / MmidLastMatchPseudo |
MmidHistoryPredicate |
段历史伪类的谓词:Field / Operator / Values |
MmidOperand |
字面量或计算字段:IsComputed / Literal / Computed / FromLiteral(...) / FromComputed(...) |
算子与比较
| 类型 | 说明 |
|---|---|
MmidOperator |
Eq / NotEq / StartsWith / EndsWith / Contains / In |
MmidOperators |
ToText / ToJson / TryParseText / TryParseJson / RequiresList |
MmidValueComparer |
TryGetNumber / AreEqual:数值优先,否则序数文本比较 |
IMmidFieldCatalog |
Contains(field):字段名是否已登记 |
已知限制
- JSON 形状还不是跨仓库契约:
MmidSelectorJson的字段名与结构只保证自家往返成立。 上报 / 下发的报文形状定稿前,不要把它当成对外协议。 - 不认字段名,除非你给它目录:
Parse默认接受任何字段文本。要拦住拼错的字段, 必须自己实现IMmidFieldCatalog并传进去。 - 不求值、不取数据:
Parse只回答「这句话合不合语法」。T3对当前刀号是否成立、:stable(300ms)是否已稳定,都由OpenRobot.Litegraph.RuleEngine结合运行时输入判定。 - 版本只增不减:
MmidAstVersion.Current升上去之后,Minimum不随包版本自动上调 —— 旧的 AST 仍能读。真要弃读老版本,得显式改Minimum,那是破坏性变更。 - 写回是规范形式,不是原文回放:
Write输出统一格式(空白、引号、in(...)的写法), 与用户原始输入不保证逐字一致。需要保留原文就自己存原文。
版本历史
1.0.0(首次发布)
- 类 CSS 选择器语法:复合选择器(类型 / 类 / 属性)+ 组合子
>+ 伪类:cut/:stable/:nth/:not/:prev/:lastMatch MmidSelectorParser/MmidSelectorWriter/MmidSelectorJson三向互转- AST 结构版本
MmidAstVersion,超范围版本拒绝读取 - 6 个比较算子、
MmidValueComparer数值优先比较、IMmidFieldCatalog字段名校验 - 零外部依赖
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on OpenRobot.Litegraph.MmidSyntax:
| Package | Downloads |
|---|---|
|
OpenRobot.Litegraph.RuleEngine
MMID 规则引擎的模型层:规则模型、语义校验、SegmentKey 匹配与 MMID 选择器求值。不含执行器,也不含画布编译器。 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 45 | 10/28/2026 |