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" />
                    
Directory.Packages.props
<PackageReference Include="OpenRobot.Litegraph.MmidSyntax" />
                    
Project file
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
                    
#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
                    
Install as a Cake Addin
#tool nuget:?package=OpenRobot.Litegraph.MmidSyntax&version=1.0.0
                    
Install as a Cake Tool

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):字段名是否已登记

已知限制

  1. JSON 形状还不是跨仓库契约:MmidSelectorJson 的字段名与结构只保证自家往返成立。 上报 / 下发的报文形状定稿前,不要把它当成对外协议。
  2. 不认字段名,除非你给它目录:Parse 默认接受任何字段文本。要拦住拼错的字段, 必须自己实现 IMmidFieldCatalog 并传进去。
  3. 不求值、不取数据:Parse 只回答「这句话合不合语法」。T3 对当前刀号是否成立、 :stable(300ms) 是否已稳定,都由 OpenRobot.Litegraph.RuleEngine 结合运行时输入判定。
  4. 版本只增不减:MmidAstVersion.Current 升上去之后,Minimum 不随包版本自动上调 —— 旧的 AST 仍能读。真要弃读老版本,得显式改 Minimum,那是破坏性变更。
  5. 写回是规范形式,不是原文回放:Write 输出统一格式(空白、引号、in(...) 的写法), 与用户原始输入不保证逐字一致。需要保留原文就自己存原文。

版本历史

1.0.0(首次发布)

  • 类 CSS 选择器语法:复合选择器(类型 / 类 / 属性)+ 组合子 > + 伪类 :cut / :stable / :nth / :not / :prev / :lastMatch
  • MmidSelectorParser / MmidSelectorWriter / MmidSelectorJson 三向互转
  • AST 结构版本 MmidAstVersion,超范围版本拒绝读取
  • 6 个比较算子、MmidValueComparer 数值优先比较、IMmidFieldCatalog 字段名校验
  • 零外部依赖
Product 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