gpt4 book ai didi

f# - 解析器标识符和自由格式文本。这可以用 FParsec 来完成吗?

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

作为后续:How do I test for exactly 2 characters with fparsec?

我需要解析一个字符串,该字符串由后跟自由格式文本的标识符对组成。我可以轻松构建一个解析器,该解析器可以找到格式为换行符后跟两个大写字符后跟一个空格的标识符。与前一个标识符相关联的自由格式文本是标识符之后的所有内容,但不包括下一个标识符。

例如:

AB Now is the
time for all good
men.
CD Four score and seven years ago EF our.

包含两个标识符 ABCD和两段自由格式的文本
Now is the \ntime for all good men. Four score and seven years ago EF our.
我的问题是我不知道如何构造一个与自由格式文本匹配但与标识符不匹配的解析器。这是我需要回溯的情况吗?

这可以做到吗?如果可以,怎么做?

最佳答案

Tarmil 发布了简单的解决方案。

这是另一种变体,它在开头不需要换行符,并且只在行尾检查以下标识符:

let id = manyMinMaxSatisfyL 2 2 isUpper "ID" .>> pchar ' '

let text =
stringsSepBy (restOfLine true)
((notFollowedBy ((id >>% ()) <|> skipNewline <|> eof)) >>% "\n")

let parser = many (id .>>. text)

如果您想优化与 stringsSepBy 一起使用的第二个解析器组合器,您可以将其替换为以下版本:
let notFollowedByIdOrEmptyLineOrEof : Parser<string,_> =
fun stream ->
let cs = stream.Peek2()
let c0, c1 = cs.Char0, cs.Char1
if c0 = '\r' || c0 = '\n' || c0 = EOS
|| (isUpper c0 && isUpper c1 && stream.Peek(2) = ' ')
then Reply(Error, NoErrorMessages)
else Reply("\n")

let text2 = stringsSepBy (restOfLine true)
notFollowedByIdOrEmptyLineOrEof

关于f# - 解析器标识符和自由格式文本。这可以用 FParsec 来完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16534674/

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