FParsec 在可选解析器上失败

2024-02-02

我目前正在学习 FParsec 库,但遇到了一个问题。当我想解析一个可选字符串并随后继续正常解析时,FParsec 将在可选解析器上返回致命错误,而不是返回None正如我所期望的。下面的工作代码示例说明了我的观点:

open System
open FParsec

type AccountEntity = 
    | Default 
    | Entity of string

let pEntity =
    let isEntityFirstChar c = isLetter c
    let isEntityChar c = isLetter c || isDigit c
    (many1Satisfy2L isEntityFirstChar isEntityChar "entity") .>> skipString "/"

let pOptEntity =
     opt pEntity
     |>> (fun optEntity -> 
              match optEntity with 
              | Some entity -> Entity entity 
              | None -> Default)

[<EntryPoint>]
let main argv = 
    printfn "%A" (run pOptEntity "test/account:subaccount") //works
    printfn "%A" (run pOptEntity "account:subaccount") //crashes
    Console.ReadLine() |> ignore
    0 // return an integer exit code

我期望的行为是pOptEntity返回一个Default当未提供实体时。但是,我收到以下错误:

Failure:
Error in Ln: 1 Col: 8
account:subaccount
       ^
Expecting: '/'

不应该opt提供我所描述的行为并继续正常解析帐户字符串,还是我以错误的方式处理此问题?我看了一下attempt但是,那么,我将无法提供我想要的默认实体行为。

非常感谢您的帮助,谢谢。


The opt组合器 http://www.quanttec.com/fparsec/reference/primitives.html#members.opt遵循与以下相同的规则<|>;如果你看<|>文档 http://www.quanttec.com/fparsec/reference/primitives.html#members.:60::124::62:,它提到如果第一个解析器失败不改变解析器状态,尝试第二个解析器。http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html更详细的内容。

在这里,.>>?组合器 http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html是你想要在你的pEntity解析器。更换.>> with .>>?你会得到一个pEntity解析器认为,如果它后面没有跟/, will 回溯到它尝试的开始处并且不消耗输入。这将允许opt组合器按设计运行。

P.S.我测试了这个,它有效。更换.>> with .>>? in pEntity然后运行代码会产生以下输出:

Success: Entity "test"
Success: Default
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FParsec 在可选解析器上失败 的相关文章

  • 绘图 Deedle 框架

    我有以下代码 let mychart frame GetAllSeries gt Seq iter fun key value gt Chart Line value Name key gt Chart Combine where fram
  • 如何解析kotlin代码?

    我需要分析 kotlin 文件代码 以检测关键字 data 和 问题是我没有找到任何像 JavaParser 这样的库 我不需要强大的工具 只需要能够返回行数的东西 任何想法 我使用antlr4来做到这一点 我创建了一个开源库 https
  • 如何解读这些时间戳?

    我正在尝试解析一些 xml 文件中写入的时间戳 大多数时间时间戳是这样的2009 07 22 07 00但有时我发现它们就像2009 07 22Z or 2009 07 22z 请帮助我如何解释这些 Z 以及如何解析它们 我认为这些 z 或
  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • FParsec:如何组合解析器以便它们以任意顺序匹配

    任务是找到特定的键值对并解析它们 这些对可以按任何顺序出现 我的部分工作尝试 open FParsec type Parser lt a gt Parser lt a unit gt type Status Running Done typ
  • 为什么这个 SimpleDateFormat 无法解析这个日期字符串?

    简单日期格式 SimpleDateFormat pdf new SimpleDateFormat MM dd yyyy hh mm ss SSSaa 抛出的异常pdf parse Mar 30 2010 5 27 40 140PM java
  • Python:如何检索每年的谷歌学术引用?

    我正在尝试从 Google Scholar 个人资料中检索信息 我有url from bs4 import SoupStrainer BeautifulSoup from urllib2 import Request urlopen url
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • 按属性值选择 XML 节点

  • 关于Java中trim()方法的查询

    我之前提出了一个问题 但遭到了严厉的批评 所以我在这里再次提出 更简单 并重新措辞以吸引那些可能担心我之前提出问题的方式的人 背景 我正在解析一些 HTML 以获取信息 我将所有内容隔离在一系列行中 但我希望抓取的内容以及后面的一堆空格 为
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • 如何为用户提供给定 boost::spirit 语法的自动完成建议?

    我正在使用 Boost Spirit 在我的 C GUI 应用程序中为非技术用户构建简单的 数据过滤器 语言 语言与纯英语非常相似 并且可以解析为 AST 我被要求使该过程尽可能对用户友好 因此我希望提供类似 CLang 的错误消息 无法识
  • 如何提取Python代码文件中使用的函数?

    我想创建代码文件中使用的所有函数的列表 例如 如果我们在名为 add random py 的文件中有以下代码 import numpy as np from numpy import linalg def foo print np rand
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • F# 在类型提供程序内的类型扩展函数中生成类型

    我有以下问题 在我的类型提供程序中 我需要使用一个返回此泛型类型实例的方法来扩展我之前定义的泛型类型 我的意思是 假设我们有 type receiveType lt a gt class val Next int val Type stri
  • 编程语言解析器的来源?

    我正在清理我的一个旧项目 该项目计算有关大型软件项目的许多简单指标 指标之一是文件 类 方法的长度 目前 我的代码 猜测 类 方法边界的位置基于非常粗略的算法 遍历文件 维护 当前深度 并在遇到未加引号的括号时调整它 当您返回到类或方法开始
  • DateTimeFormatter 中的通配符

    我需要将一个字符串解析为LocalDate 该字符串看起来像31 03 2016用正则表达式术语 即 表示日期数字后可能有 0 个或多个未知字符 输入 输出示例 31xy 03 2016 gt 2016 03 31 我希望在 DateTim
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m

随机推荐

  • Git 切换分支

    git 有一些东西我还没有搞懂 是分支 假设我有一个本地存储库A我从远程克隆的B 所以现在A检查主分支 所以当我从A它去B master B只是 github 上的一个克隆 C 为了保持同步 我时不时地从其他地方拉取C主分支 But now
  • 向 pentaho design studio 添加 jdbc 驱动程序并配置数据源

    我刚刚将 pentaho 的设计工作室集成到 BI 服务器中 有谁知道如何添加 mysql jdbc 驱动程序 我需要连接才能定义关系操作流程 在我的研究中我发现 http wiki bizcubed com au xwiki bin vi
  • js-bson 错误 - OpenShift 上的 Mosca(MQTT 代理)

    我一直在 OpenShift 上使用 NodeJS 进行一些工作 当我尝试在 Node 实例中运行 Mosca 服务器时遇到问题 我收到的错误如下 Error var lib openshift 5547bd284382ec394a0000
  • 获取Oracle子查询中order by后的第一行

    我有一个表学生 id 姓名 部门 年龄 分数 我想找到每个部门得分最高 在最年轻的学生中 的最年轻的学生 在 SQL Server 中 我可以使用以下 SQL select from student s1 where s1 id in se
  • 我应该避免 typedef,尝试使用原始名称并尽可能进行强制转换吗?

    我不确定这里的词汇 但希望我能让人理解 当我使用不太扎实的 C 知识来研究 winapi 时 我发现了很多 typedef 的东西 对我来说 这些东西似乎使问题变得过于复杂 并添加了我必须记住的另一件事 例如 UINT代替unsigned
  • 在python中创建用户定义类的对象集

    table set class GlobeLearningTable object def init self mac port dpid self mac mac self port port self dpid dpid def add
  • Android:动态创建控件和方向变化

    目前我正在开发一个动态创建控件的 Android 应用程序 每次用户单击按钮时 按钮下方都会出现一个新的 EditText 并且用户可以与 EditText 进行交互 但是 如果屏幕方向发生变化 用户创建的 EditText 也会消失 用户
  • 来自plotly的三元图

    在此输入图像描述 https i stack imgur com lyUJu png 我想在三元图中添加线条 水平 垂直 以突出显示某些部分 可以帮我吗 三元图 代码如下 fig px scatter ternary df a df a b
  • 根据 big-o 表示法进行评级的算法是否会受到并行性的影响?

    我刚刚读了一篇关于矩阵乘法突破的文章 O n 2 373 的算法 但我猜矩阵乘法是可以并行化的 那么 如果我们开始生产千核处理器 这会变得无关紧要吗 事情会发生怎样的变化 并行执行不会改变特定算法的复杂性的基本原理 充其量 您只是花费一些给
  • 验证模型属性 WCF Web APi

    我有一组使用 WCF Web Api 托管的服务 我需要做的是验证应用程序模型内的属性 例如 在 MVC 3 中 我像这样装饰模型中的属性 StringLength 30 public string UserName get set 然后在
  • 如何计算SQL中不同项目的数量

    数据库结构 Clubs ID ClubName Teams ID TeamName ClubID Players ID Name Registrations PlayerID TeamID Start date End date Seaso
  • 计算 GPU 上的彩色像素 - 理论

    我有一张 128 x 128 像素的图像 它被分解为 8 x 8 的网格 每个网格块包含 16 x 16 像素 要求 我想计算我的图像包含多少个黑色像素 直接的方法 I could通过逐行 逐列检查整个图像并检查像素是否为黑色来实现此目的
  • 如何编译 ast.Expr?

    import ast code 1 1 expr ast parse code body 0 print type expr compile ast Expression expr string eval gets me class ast
  • Rails + Amazon RDS:延迟问题

    我有一个应用程序 其数据库正在迁移到亚马逊RDS 由于 RDS 和我们的服务器之间的查询延迟 例如仅由于查询而导致加载时间长达 30 秒 我的性能显着下降 没有显式缓存 并且请求可以进一步优化 但这仍然比本地数据库慢 10 倍以上 这种业绩
  • 使用 gorilla/mux URL 参数的函数的单元测试

    TLDR gorilla mux 过去不提供设置 URL 变量的可能性 现在确实如此 这就是为什么第二高得票数的答案在很长一段时间内都是正确的答案 原始问题如下 这就是我想做的 main go package main import fmt
  • html - 像链接一样的表格行

    我无法将表格行设置为某些内容的链接 我只能使用 css 和 html 我尝试了从 div in row 到其他东西的不同操作 但仍然无法使其工作 您有两种方法可以做到这一点 使用 JavaScript tr 使用锚点 tr td a hre
  • C++ 中线程的简单示例

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 有人可以发布一个在 C 中启动两个 面向对象 线程的简单示例吗 我正在寻找实际的 C 线
  • 如何为tomcat maven插件添加存储库

    如何包含找到的 tomcat maven 插件的存储库here http tomcat apache org maven plugin 2 0 SNAPSHOT source repository html 我在中央 Maven 存储库中找
  • 将 JSON 反序列化为 Java 枚举

    我在 Android 上的 Java 中有以下枚举 我希望能够将传入的 JSON 字符串 对象中的整数反序列化为该枚举类型 我在 Jackson 和 GSON 上受到了关注 但在我正在使用的 JSON org 包上没有得到任何关注 有没有简
  • FParsec 在可选解析器上失败

    我目前正在学习 FParsec 库 但遇到了一个问题 当我想解析一个可选字符串并随后继续正常解析时 FParsec 将在可选解析器上返回致命错误 而不是返回None正如我所期望的 下面的工作代码示例说明了我的观点 open System o