关于 awesome-dotnet-core-learning
.NET Core 从 2016 年发布 1.0 以来, 至今已经 3 岁了, 可以说现在的. NET Core 的生态已经相当完善了, 可满足各行业的生产要求. 如果你还在怀疑. NET Core 的实用性质, 是时候转变想法了.
在 GitHub 上有一个项目: https://github.com/thangchung/awesome-dotnet-core . 专门罗列了各种. NET Core 优秀的开源库, 该列表几乎每天都在增长,.NET Core 生态的高速增长由此可见一斑.
为了更好地普及. NET Core, 方便. NET 开发者, 为. NET Core 生态建设添砖加瓦, 我产生了创建 awesome-dotnet-core 系列博客的想法. 该系列会不定期发布博客, 介绍 awesome-dotnet-core 其中一些实用的, 有意思的, 我能看懂的库, 尽量以浅显的文字, 简单的例子说明库的用法和使用场景等.
本系列所有博客文章和代码示例可在我的 GitHub 项目中找到, 欢迎 STAR~
第一篇, 介绍 Sprache - 解析器构建库
简介
https://github.com/sprache/Sprache 是一个简单, 轻量级的库, 用于直接在 C#代码中构造解析器, 用来解析如代码这类的结构化文本. 官方的说明中, 该库不是那种 "工业强度" 的语言工作台, 而是介于正则表达式与全功能工具集 (如 ANTLR http://antlr.org/ ) 中间的一种工具.
说白了, 就是 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 的用法, 感兴趣的朋友不要错过.
类似库
https://github.com/benjamin-hodgson/Pidgin
作者是 Stack Overflow 的员工, 做为 Sprache 的后继者, 从性能和功能上有一些改进, 但是可能诞生较晚, 知名度不如 Sprache.
FParsec https://github.com/stephan-tolksdorf/fparsec
使用 F# 编写的解析组合器.
来源: https://www.cnblogs.com/waku/p/10505196.html