作为我的OmniXaml项目的一部分,我创建了一个拉式解析器。它读取 XML 文件并将其转换为可枚举的 XAML 节点。但我对结果并不满意,所以我决定尝试以更优雅的方式构建另一个。
这就是我尝试使用Sprache制作解析器的原因。
问题是我什至不知道如何开始。XAML 解析在很大程度上依赖于上下文,因此如果要生成一个 Xaml 节点,则可能必须先行查看并处理以下节点。我目前使用 XmlReader 来读取 XAML。
在这里,我列出了一些输入/输出示例,以便您弄清楚我想要做什么。输入是 XAML 代码,输出是 XAML 节点列表。XAML 节点是一种结构,我在其中保存重新创建 XAML 中表示的对象所需的数据。它们就像 CPU 的指令。
例 1
输入(XAML):
<DummyClass xmlns="root" SampleProperty="Property!">
</DummyClass>
输出(XAML 节点列表)
- “root”的命名空间声明,前缀为:“”
- DummyClass 类型的对象的开始
- 从类型“DummyClass”开始成员“SampleProperty”
- 价值节点: “财产!”
- 会员结束
- 没有任何
- 对象结束
例 2
输入:
<DummyClass xmlns="root">
<DummyClass.Child>
<ChildClass></ChildClass>
</DummyClass.Child>
</DummyClass>
输出:
- “root”的命名空间声明,前缀为:“”
- DummyClass 类型的对象的开始
- 没有任何
- 从类型“DummyClass”开始成员“Child”
- “ChildClass”类型的对象的开始
- 没有任何
- 对象结束
- 会员结束
- 对象结束
例 3
输入:
<DummyClass xmlns="root">
<DummyClass.Items>
<Item/>
<Item/>
<Item/>
</DummyClass.Items>
</DummyClass>
输出:
- “root”的命名空间声明,前缀为:“”
- DummyClass 类型的对象的开始
- 没有任何
- 从“DummyClass”类型开始的成员“项目”</li>
- [获取对象] 指令
- [项目开始] 指令
- “项目”类型的对象的开始</li>
- 没有任何
- 对象结束
- “项目”类型的对象的开始</li>
- 没有任何
- 对象结束
- “项目”类型的对象的开始</li>
- 没有任何
- 对象结束
- 会员结束
- 对象结束
- 会员结束
- 对象结束
问题:如何从这个开始?
你能给我提供一些样本/指南吗?谢谢!