【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. 2019.03.01 bzoj3075: [Usaco2013]Necklace(kmp+dp)

    传送门 题意简述:给出S,TS,TS,T两个字串,∣S∣≤10000,∣T∣≤1000|S|\le10000,|T|\le1000∣S∣≤10000,∣T∣≤1000,问至少从SSS中删去几个字符能够 ...

  2. virtual关键字

    出于多态的考虑,为了覆盖, 子类同名覆盖函数(函数名.参数.返回值都相同) virtual void print(): 这也许会使人联想到函数的重载,但稍加对比就会发现两者是完全不同的:(1)重载的几 ...

  3. 【转】comparable Interface

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 , ...

  4. VIP之Switch

    Switch II 最大能连接12路输入与12路输出 不能合并数据数 每个输入可以驱动多个输出 每个输出只能被一个输入驱动 当输入没有连接到输出时,可以禁止掉 每个被禁止的输入可以设置成停止或者消耗模 ...

  5. Android开发之Activity

    活动(Activity) 活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户交互. FirstActivity 手动创建活动 新建一个project,不再选择empty act ...

  6. mac virtualbox 安装

    在Mac上装virtualbox提示安装失败!!! 安全性与隐私的通用下点击允许!!!

  7. mysql windows 5.7 安装版下载地址

    https://dev.mysql.com/downloads/windows/installer/5.7.html

  8. C# 监听HTTP请求

    先把代码放在这里,下面再详细解说: using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Oracle.DataAccess.Client; ...

  9. Batch Normalization--介绍

    思考 YJango的前馈神经网络--代码LV3的数据预处理中提到过:在数据预处理阶段,数据会被标准化(减掉平均值.除以标准差),以降低不同样本间的差异性,使建模变得相对简单. 我们又知道神经网络中的每 ...

  10. 分布式系统中 Unique ID 的生成方法

    http://darktea.github.io/notes/2013/12/08/Unique-ID Snowflake 生成的 unique ID 的组成 (由高位到低位): 41 bits: T ...