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