栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(1)-Sprache-解析器构建库

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(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-解析器构建库

简介

Sprache是一个简单,轻量级的库,用于直接在C#代码中构造解析器,用来解析如代码这类的结构化文本.官方的说明中,该库不是那种"工业强度"的语言工作台,而是介于正则表达式与全功能工具集(如ANTLR)中间的一种工具.

说白了,就是Sprache要比正则表达式强大,而稍逊于ANTLR这样的文本解析工具.

特点
  • 直接从程序代码中使用Sprache,而无需设置任何构建时代码生成任务

  • 强类型的解析规则

  • 可通过继承和组合解析规则,扩展已有的解析器

  • 支持解析规则的单元测试,完美适配测试驱动开发(TDD)

快速上手

以下示例演示了用Sprache编写一个解析编程语言中标识符(如变量名,类名,方法名等)的示例程序.该示例参考了README中代码.

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

  2. 使用Nuget安装Sprache:

    Install-Package Sprache
  3. 在Program.cs中,首先增加标识符的解析规则:

    // 标识符解析规则private static Parser 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. 编写一个辅助方法,用于检查输入的文本中是否包含合法的标识符:

    /// /// 检查输入的文本中是否包含合法的标识符/// /// 文本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.

  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#编写的解析组合器.

作者:        

WAKU

原文出处: https://www.cnblogs.com/waku/p/10505196.html  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/230885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号