【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的用法,感兴趣的朋友不要错过.
类似库
【awesome-dotnet-core-learning】(1)-Sprache-解析器构建库的更多相关文章
- 【译】通过 Rust 学习解析器组合器 — Part 1
原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...
- .Net Core 3.0原生Json解析器
微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...
- 在.NET Core中使用Irony实现自己的查询语言语法解析器
在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...
- dotnet core TargetFramework 解析顺序测试
dotnet core TargetFramework 解析顺序测试 Intro 现在 dotnet 的 TargetFramework 越来越多,抛开 .NET Framework 不谈,如果一个类 ...
- spring cloud+dotnet core搭建微服务架构:Api授权认证(六)
前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...
- 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 ...
- Dotnet Core中使用AutoMapper
官网:http://automapper.org/ 文档:https://automapper.readthedocs.io/en/latest/index.html GitHub:https://g ...
- dotnet Core Asp.net 项目搭建
Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...
- DotNet Core 介绍
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
随机推荐
- UI与开发的必备神器!— iDoc一键适配不同平台尺寸(iDoc201902-2新功能)
一.自动换算不同平台尺寸在一个项目从设计到开发的过程中,为了适配不同设备,一份设计稿,UI需要花大量的时间去制作各种尺寸的切图,耗时耗力. 那有没有一种高效的办法,让UI只需要设计一份设计稿就可以了呢 ...
- C++ 提取网页内容系列之二
标 题: C++ 提取网页内容系列作 者: itdef链 接: http://www.cnblogs.com/itdef/p/4171203.html 欢迎转帖 请保持文本完整并注明出处 另外一种下载 ...
- .net 资源释放(托管资源和非托管资源)
1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我 ...
- Element.querySelector和Element.querySelectorAll和jQuery(element).find(selector)选择器的区别
<divid="test1"> <a href="http://www.hujuntao.com/">设计蜂巢</a> &l ...
- ASM的一些小坑
变量必需放到数据段,才有直接对地址赋值的访问权限 segment .data n1 dw 55h segment .text global _nasm_function _nasm_function: ...
- [UWP]在UWP平台中使用Lottie动画
最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...
- vue keep-alive解决关闭标签动态缓存问题
直接上代码: <keep-alive :include='topNavMentNames'> <router-view ></router-view> </k ...
- Flask 中内置的 Session
Flask中的Session Flask中的Session不同于Django的session,django的session存在后端数据库中,而flask的session会将你的SessionID存放在 ...
- H5内联视频
概述 微信上很多H5页面都会有会动的像视屏的页面,这样的效果很棒.从技术上来说,这个其实就是视屏,不过没有控制播放的按钮罢了.它们还有一个专业的名字--内联视频.下面我把自己对内联视屏的学习记录下来, ...
- Nginx---(main block)
正常运行必备配置 1,user USERNAME [GROUPAME] ; 指定用于运行worker进程的用户和组: user nginx nginx; 2, pid /PATH/TO/PID_F ...