gpt4 book ai didi

f# - 关于 FParsec 处理空白的建议

转载 作者:行者123 更新时间:2023-12-04 17:25:45 25 4
gpt4 key购买 nike

我有以下子表达式来解析具有以下格式的“引号”

"5.75 @ 5.95"

因此,我有这个 parsec 表达式来解析它
let pquote x = (sepBy (pfloat) ((spaces .>> (pchar '/' <|>  pchar '@' )>>. spaces))) x

它工作正常......除非我的输入中有一个尾随空格,因为分隔符表达式开始消耗内容。所以我将它包裹在一个尝试中,它有效并且似乎,据我所知,或多或少是什么意思成为。
let pquote x = (sepBy (pfloat) (attempt (spaces .>> (pchar '/' <|>  pchar '@' )>>. spaces))) x

由于我不太了解 fparsec,我想知道是否有更好的方法来编写它。它看起来有点重(当然仍然非常易于管理)

最佳答案

let s1 = "5.75         @             5.95              "
let s2 = "5.75/5.95 "
let pquote: Parser<_> =
pfloat
.>> spaces .>> skipAnyOf ['@'; '/'] .>> spaces
.>>. pfloat
.>> spaces

笔记:
  • 我已经做了 spaces随处可选 spaces跳过零个或多个空格的任何序列,因此无需使用 opt - 谢谢@丹尼尔;
  • type Parser<'t> = Parser<'t, UserState> - 我这样定义是为了避免“值限制”错误;你可以删除它;
  • 另外,如果您的程序可能在默认语言设置带有十进制逗号的系统上运行,请不要忘记以下内容:System.Threading.Thread.CurrentThread.CurrentCulture <- Globalization.CultureInfo.GetCultureInfo "en-US"这行不通,谢谢@Stephan
  • 我不会使用 sepBy除非我有一个未知大小的值列表。
  • 如果你真的不需要返回的值(例如 '@' 个字符),建议使用 skip*函数代替 p*出于性能考虑。

  • UPD 添加斜线作为分隔符

    关于f# - 关于 FParsec 处理空白的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452190/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com