首页 > 解决方案 > 使用 FParsec 我将如何解析:以换行符 <|> 结尾的行以 eof 结尾的行

问题描述

我正在解析一个文件,并想丢弃我不感兴趣的文件的某些行。我已经能够让它适用于所有情况,除了最后一行是一次性的并且没有结束时新队。

我尝试构建一个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# 的新手。

标签: f#fparsec

解决方案


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

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


推荐阅读