f# - 使用 FParsec 我将如何解析 : line ending in newline <|> a line ending with eof

标签 f# fparsec

我正在解析一个文件,并想丢弃我不感兴趣的文件中的某些行。我已经能够让它适用于所有情况,除了最后一行是一次性的并且确实不以换行符结尾。

我尝试构建一个 endOfInput规则并用 skipLine 连接它规则通过 <|> 。这一切都包含在 many 中。 。调整一切,我似乎要么得到“许多成功而不消耗输入...”错误,要么在 skipLine 上失败。当我不尝试某种回溯时规则。

let skipLine = many (noneOf "\n") .>> newline |>> fun x -> [string x]

let endOfInput = many (noneOf "\n") .>> eof |>> fun x -> [string x]

test (many (skipLine <|> endOfInput)) "And here is the next.\nThen the last."

** 最后一行的skipLine 解析器出现此错误

我已经尝试过

let skipLine = many (noneOf "\n") .>>? newline |>> fun x -> [string x]

...和...

let skipLine = many (noneOf "\n") .>> newline |>> fun x -> [string x]

test (many (attempt skipLine <|> endOfInput)) "And here is the next.\nThen the last."

** 这些会产生许多错误

注意:输出函数只是占位符,以使它们与我的其他规则一起使用。我还没有弄清楚如何格式化输出。 这是我第一次使用 FParsec,而且我还是 F# 新手。

最佳答案

FParsec 实际上有一个内置解析器,可以完全满足您的需求:skipRestOfLine 。它以换行符或 eof 终止,就像您正在寻找的那样。

如果您想尝试自己实现它作为学习练习,请告诉我,我会尽力帮助您解决问题。但是,如果您只想要一个跳过字符直到行尾的解析器,那么内置的 skipRestOfLine 正是您所需要的。

关于f# - 使用 FParsec 我将如何解析 : line ending in newline <|> a line ending with eof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484943/

相关文章:

f# - 在创建中间值时,我应该存储它吗?

F# NUnit 测试将值设置为 null

f# - 如何在 F# 中处理 IEnumerable?

enums - F#枚举到字符串的转换

parsing - 如何使用 FParsec 在 F# 中解析非常大的文件

reflection - 定义具有非常多消息类型的消息传递域

f# - Fparsec v. 0.9.2(新手)中的空白在哪里?

f# - 解析括号表达式

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