【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库
【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库
关于awesome-dotnet-core-learning
.NET Core从2016年发布1.0以来,至今已经3岁了,可以说现在的.NET Core的生态已经相当完善了,可满足各行业的生产要求.如果你还在怀疑.NET Core的实用性质,是时候转变想法了.
在GITHUB上有一个项目:awesome-dotnet-core.专门罗列了各种.NET Core优秀的开源库,该列表几乎每天都在增长,.NET Core生态的高速增长由此可见一斑.
为了更好地普及.NET Core,方便.NET开发者,为.NET Core生态建设添砖加瓦,我产生了创建awesome-dotnet-core系列博客的想法.该系列会不定期发布博客,介绍awesome-dotnet-core其中一些实用的,有意思的,我能看懂的库,尽量以浅显的文字,简单的例子说明库的用法和使用场景等.
本系列所有博客文章和代码示例可在我的GITHUB项目awesome-dotnet-core-learning中找到,欢迎STAR~
第一篇,介绍Sprache-解析器构建库
简介
示例代码托管在GITHUB上, 欢迎STAR!
Sprache是一个简单,轻量级的库,用于直接在C#代码中构造解析器,用来解析如代码这类的结构化文本.官方的说明中,该库不是那种"工业强度"的语言工作台,而是介于正则表达式与全功能工具集(如ANTLR)中间的一种工具.
说白了,就是Sprache要比正则表达式强大,而稍逊于ANTLR这样的文本解析工具.
特点
- 直接从程序代码中使用Sprache,而无需设置任何构建时代码生成任务
- 强类型的解析规则
- 可通过继承和组合解析规则,扩展已有的解析器
- 支持解析规则的单元测试,完美适配测试驱动开发(TDD)
快速上手
以下示例演示了用Sprache编写一个解析编程语言中标识符(如变量名,类名,方法名等)的示例程序.该示例参考了README中代码.
-
创建一个.NET Core的命令行应用程序(详细步骤略)
-
使用Nuget安装Sprache:
Install-Package Sprache
-
在
Program.cs
中,首先增加标识符的解析规则:// 标识符解析规则 private static Parser<string> Identifier = from leading in Parse.WhiteSpace.Many() // 可以包含前置空格 from first in Parse.Letter.Once() // 第一个字符只能是字母 from rest in Parse.LetterOrDigit.Many() // 剩余的字符可以是字母或数字 from trailing in Parse.WhiteSpace.Many() // 可以包含后置空格 select new string(first.Concat(rest).ToArray()); // first+rest做为标识符
可以看出,解析规则是直接使用C#代码定义的,利用Sprache提供的一些内置定义(如:
Parse.Letter
),以LINQ形式组合成了一个新定义.代码非常直观易读,并且是单元测试友好的. -
编写一个辅助方法,用于检查输入的文本中是否包含合法的标识符:
/// <summary> /// 检查输入的文本中是否包含合法的标识符 /// </summary> /// <param name="text">文本</param> private static void CheckIdentifier(string text) { var result = Identifier.TryParse(text); if (result.WasSuccessful) { Console.WriteLine($"[{text}]中包含合法的标识符.标识符为: {result.Value}"); } else { Console.WriteLine($"[{text}]中不包含合法的标识符."); } }
使用
TryParse
方法,尝试利用我们定义的规则解析一个字符串,如果成功了那么result.WasSuccessful
为true
,并且Value
中包含了规则的值.否则为false
. -
在
Main
方法中,调用CheckIdentifier
,测试解析效果:static void Main(string[] args) { CheckIdentifier(" a123 "); CheckIdentifier(" 1abc"); }
输出结果:
[ a123 ]中包含合法的标识符.标识符为: a123 [ 1abc]中不包含合法的标识符.
可见我们定义的规则可以正确工作.
另外,GITHUB上Sprache的README中,包含了很多资源,从教程到示例,较详细的介绍了Sprache的用法,感兴趣的朋友不要错过.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?