F#库FParsec入门

简介: FParsec 是一个F#语言构建的解析器组合库,主要用于解析文本,并结构化输出,可以为形式语法实现递归下降文本解析器。本文给出简单的解析器示例。

     FParsec 是一个F#语言构建的解析器组合,主要用于解析文本,并结构化输出,可以为形式语法实现递归下降文本解析器。根据官网的介绍,FParsec库的主要功能包括:

  • 支持上下文相关的无限前瞻文法
  • 自动生成、高度可读的错误消息
  • Unicode 支持
  • 对非常大的文件的有效支持
  • 一个可嵌入的、运行时可配置的运算符优先级解析器组件
  • 一个简单、高效且易于扩展的 API
  • 针对性能进行彻底优化的实现
  • 全面的文档
  • 一个宽松的开源许可证,源代码和二进制形式的 FParsec 库是在简化的 BSD 许可下分发

   官网为 http://www.quanttec.com/fparsec/ ,可以从官网查看具体的用法。FParsec 源代码在 GitHub 上可以下载:github.com/stephan-tolksdorf/fparsec

     FParsec 库的源代码用 C# 和 F# 编写的,包含两个DLL库:FParsec.dll和 FParsecCS.dll ,项目需要引用此DLL库。下面给出一些示例,用来直观的掌握如何使用这个解析器库:

    首先,所有 FParsec 类型和模块都在FParsec命名空间中声明。该命名空间包含一些基本类和4个 F# 模块,即:

  • Primitives:包含基本类型定义和解析器组合器
  • CharParsers:包含字符、字符串和数字的解析器,以及将解析器应用于输入流的函数
  • Error:包含用于创建、处理和格式化解析器错误消息的类型和辅助函数
  • StaticMapping:包含将静态键值映射编译为优化函数的函数

      因此如果要使用open FParsec库,则应该首先引入此库:

openFParsec

首先需要需要根据解析的对象,构建合适的解析器Parser,当然,FParsec库中的模块如 FParsec.Primitives和FParsec.CharParsers模块中包含了内置的解析器,如解析float类型的解析器pfloat,其定义为:

valpfloat: Parser<float,'u>

如果要想调用此解析器,并返回结果(ParserResult<'Result,unit>),则需要run来进行调用 ,其中的ParserResult定义为:

typeParserResult<'Result,'UserState>=|Successof'Result * 'UserState*Position|Failureofstring*ParserError*'UserState

解析器pfloat示例为:

letf2=runpfloat"1.25"printfn"%O"f2//Success: 1.25

当然,为了方便的进行测试运行,可以构建一个test函数:

lettestpstr=matchrunpstrwith|Success(value, _, _)   ->printfn"OK: %A"value|Failure(err, _, _) ->printfn"Fail: %s"err

用此test函数来运行pfloat解析器示例,如下所示:

//解析float类型testpfloat"1.25"//OK: 1.25testpfloat"1.25E"//Fail: Error ...

其中对文本"1.25E"解析会出现如下错误信息:

Fail: ErrorinLn: 1Col: 61.25E^Note: Theerroroccurredattheendoftheinputstream.
Expecting: decimaldigit

下面介绍一下如何从括号中提取数值,示例如下:

//解析string类型,忽略空白 ' ', '\t', '\r' ', '\n' letpstr_wss=pstrings .>>spacesletpfloat_ws=pfloat  .>>spaces//()中间的解析出floatletpfloatBetKK=pstr_ws"(">>. pfloat_ws .>>pstr_ws")"testpfloatBetKK"(2.6)"//OK: 2.6testpfloatBetKK"(2.7 )"//OK: 2.7testpfloatBetKK"( 2.8 ) "//OK: 2.8testpfloatBetKK" ( 2.9 ) "//Fail: Error... 左括号有空格

另外,还可以对特定括号中的字符按照分隔符进行拆分并解析,具体示例如下:

letparray=pstr_ws"[">>. sepBypfloat_ws (pstr_ws";") .>>pstr_ws"]"//OK: [1.0; 2.0; 3.0]testparray@"[ 1 ; 2 ;3 ] "

有时候,我们解析字符时,希望跳过特定字符,具体示例如下:

//spaces >>. 左空白   .>> spaces 右空白letpfloat_ws2=spaces>>.  pfloat  .>>spacesletfs= (skipStringCI"<float>">>. pfloat_ws2) stestf"<FLOAT> 1.0 "//OK:1.0

上述示例,则跳过<float>字符串,且忽略大小写,从而提取出1.0

相关文章
|
前端开发 JavaScript UED
Svelte:下一代前端框架的革命性选择
Svelte:下一代前端框架的革命性选择
280 0
Svelte:下一代前端框架的革命性选择
Error: listen EACCES: permission denied 0.0.0.0:80
Error: listen EACCES: permission denied 0.0.0.0:80
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
478 1
|
9月前
|
人工智能 数据可视化 数据库
低代码平台:技术复杂性的系统简化
低代码平台通过模块化和自动化技术,简化了传统开发流程中的需求分析、代码开发、测试部署等环节,显著提高了开发效率和协作能力。其核心特性如“一键编程”、“快速迭代”降低了开发复杂度,提供了敏捷开发的能力,使企业能更快响应市场需求和技术变革。可视化开发、实时渲染、分布式协作支持及无缝部署等功能进一步优化了开发体验。平台内置的五大核心引擎(SQL、功能、模板、图表、切面)进行了系统性优化,提升了数据处理能力和开发灵活性。此外,低代码平台还融合了AI技术,提供了智能代码助手、自动优化和故障排查等功能,增强了开发效率和精度。
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
279 0
|
存储 自然语言处理 Python
Python中文词汇与英文词频统计
本文介绍了如何使用Python进行英文和中文词频统计。对于英文,借助内置库按空格分隔单词并处理特殊字符;对于中文,需安装jieba分词库。代码实现中,通过读取文件、分词、统计词频并输出到文件。运行时,通过命令行提供文本和结果文件路径。此技能在学术研究、语言分析和文本挖掘领域颇有价值。
Python中文词汇与英文词频统计
Vue2对话框(Dialog)
这是一篇介绍如何在Vue3中使用对话框(Dialog)的文章。该对话框组件可自定义标题、内容、尺寸等属性,并支持全屏切换、加载中状态等功能,整体样式参考了ant-design-vue Modal的设计。文章详细介绍了创建和使用Dialog组件的方法。
437 0
Vue2对话框(Dialog)
|
自然语言处理 程序员 编译器
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
|
数据采集 Java Python
GitHub天花板!清华大佬纯手码的《python背记手册》火了!
根据5月份的TIOBE指数分析,Python几乎是Java的两倍,以目前的情况来看,Java想重回巅峰怕是遥遥无期,反倒是Python开始了霸榜之旅。 无论任何一门语言,都是需要不断的花时间,花精力去学习的,python也不例外,虽然很多人都在说python如何如何的简单,但并不意味着你可以随便学学敷衍了事。
|
存储 搜索推荐 Linux