【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中代码.

  1. 创建一个.NET Core的命令行应用程序(详细步骤略)

  2. 使用Nuget安装Sprache:

    Install-Package Sprache
  3. 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形式组合成了一个新定义.代码非常直观易读,并且是单元测试友好的.

  4. 编写一个辅助方法,用于检查输入的文本中是否包含合法的标识符:

    /// <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.WasSuccessfultrue,并且Value中包含了规则的值.否则为false.

  5. Main方法中,调用CheckIdentifier,测试解析效果:

    static void Main(string[] args)
    {
    CheckIdentifier(" a123 ");
    CheckIdentifier(" 1abc");
    }

    输出结果:

    [    a123  ]中包含合法的标识符.标识符为: a123
    [ 1abc]中不包含合法的标识符.

    可见我们定义的规则可以正确工作.

另外,GITHUB上Sprache的README中,包含了很多资源,从教程到示例,较详细的介绍了Sprache的用法,感兴趣的朋友不要错过.

类似库

  • Pidgin

    作者是Stackoverflow的员工,做为Sprache的后继者,从性能和功能上有一些改进,但是可能诞生较晚,知名度不如Sprache.

  • FParsec

    使用F#编写的解析组合器.

【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库的更多相关文章

  1. 【译】通过 Rust 学习解析器组合器 — Part 1

    原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...

  2. .Net Core 3.0原生Json解析器

    微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...

  3. 在.NET Core中使用Irony实现自己的查询语言语法解析器

    在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...

  4. dotnet core TargetFramework 解析顺序测试

    dotnet core TargetFramework 解析顺序测试 Intro 现在 dotnet 的 TargetFramework 越来越多,抛开 .NET Framework 不谈,如果一个类 ...

  5. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  6. NET CORE Learning

    ASP.NET Core 基础教程https://www.cnblogs.com/lonelyxmas/tag/ASP.NET%20Core%20%E5%9F%BA%E7%A1%80%E6%95%99 ...

  7. Dotnet Core中使用AutoMapper

    官网:http://automapper.org/ 文档:https://automapper.readthedocs.io/en/latest/index.html GitHub:https://g ...

  8. dotnet Core Asp.net 项目搭建

    Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...

  9. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

随机推荐

  1. 线程属性 pthread_attr_t

    参考资料: https://blog.csdn.net/hudashi/article/details/7709413 Posix线程中的线程属性pthread_attr_t主要包括scope属性.d ...

  2. ORA-12514: TNS:监听程序当前无法识别连接描述符中请

    若Oracle出现“监听程序当前无法识别连接描述符中请求的服务”这个错误可以按照以下方法解决: 可以通过这个路径找到一个文本文件: oracle\product\10.2.0\db_1\NETWORK ...

  3. 【MySQL】-2 函数、分组、子查询、联合查询

    函数 Mysql的函数特性没有SQL可移植性强. 大多数情况下支持的函数: 处理文本串的函数: RTrim():处理列值右边的空格 LTrim():处理列值左边的空格   Trim():处理列值的左右 ...

  4. c语言基础课第三次作业

    7-1找出最小值 1.实验代码 #include <stdio.h> int main(void) int n, i, m, min; scanf("%d", & ...

  5. MUI 里js动态添加数字输入框后,增加、减少按钮无效

    numbox 的自动初化是在 mui.ready 时完成的mui 页面默认会自动初始化页面中的所有数字输入框,动态构造的 DOM 需要进行手动初始化.比如:您动态创建了一个 ID 为 abc 的数字输 ...

  6. hdmi中深度色彩像素打包

    4个色彩像素包模式:24- 30- 36- 48- 不同模式下tmds时钟与与像素的比是位宽与24的比值 . 24 bit mode: TMDS clock = 1.0 x pixel clock ( ...

  7. 深入理解linux关闭文件和删除文件

    背景介绍 最近看了linux系统编程(linux system programming)一书,结合深入理解linux内核(understanding the linux kernel)一书,深入理解了 ...

  8. google guava Multimap的学习介绍

    1.https://blog.csdn.net/gongxinju/article/details/53634434

  9. JS应用实例3:定时弹出广告

    在观看视频时候总会发现有广告弹出 这里就做一个类似这样的定时弹出广告的实例: 前面的JS代码和HTML写在同一个文件,实际开发中总是分开来写 用的时候引入即可 HTML代码: <!DOCTYPE ...

  10. ElasticSearch权威指南学习(分布式集群)

    空集群 只有一个空节点的集群 一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数 ...