我正在尝试使用Parsec编写类似csv的解析器。 到现在为止还挺好。 解析器解码标头,并处理一切正常。 现在,我试图在文件开头跳过一些注释。 注释以# (或空行)开头。 如果这样做, endBy循环不会在标头启动时出现,而是会失败。

这是我的代码:

csvParser = do
   -- skipping comment bit
   P.endBy ((P.char '#' >> P.many (P.noneOf "\n"))
            <|> P.many P.space
           ) eol

   -- real parsing starting
   header <- parseHeader
   eol
   case header of
       ["style", "number", "quantity", "length", "width", "height"] -> parsePL
       otherwise -> error $ "Can't decore following header:" ++ (show header)


   where parseHeader = P.sepBy cell sep
         sep = P.char ','
         eol = P.char '\n'
         cell = P.many (P.noneOf ",\n")
         cellp = do x <- cell ; sep; return x
         today = "2015/01/15" :: Date

         readR :: String -> Rational
         readR x = toRational x' where
                   x' = read x :: Float
         parsePL = P.endBy (do
               style <- cellp
               numberOfBox <- read <$> cellp
               numberPerBox <- cellp
               length <- readR <$> cellp
               width <-  readR <$> cellp
               height <- readR <$> cell

               return (style, numberOfBox, length, width, height, "", 0, "",  today)
               ) eol

#1楼 票数:2 已采纳

我发现了问题: space包含换行符'\\n'

  ask by mb14 translate from so

未解决问题?本站智能推荐:

1回复

parsec无法为endBy函数定义规则

我为一种语言编写parsec规则时遇到问题,而我却有另一种语言定义(问题部分) WS代表空格,而LITERAL是除空格或带引号的字符以外的任何字符(可以包含空格),因此,我编写了下一个函数: 问题是符号“;” 是有效的文字,因此(1)函数对其进行了解析,因此存在解析错误,因为(2)无法
1回复

如何在Haskell中运行Parsec测试?

最近,我开始使用 Hackage 库学习解析器实现,尤其是 Parsec。 到目前为止,我有这段代码来测试整数加法作为简单计算器功能之一: 由于缺少 GHCI 启动此解析器的线索,我有点困惑(我的操作系统是 Windows 10)。 我想在命令提示符中输入什么只是为了进行一些测试?
1回复

如何在Parsec中解析带有开始和结束标记的多行

我是Parsec新手。 在这里将感谢您指出问题的指针。 说,我有一个固定数量的标头的csv文件。 与其单独解析每一行,不如在行的开头查找令牌,并获取所有行,直到具有非空令牌的下一行为止。 下面的例子: 有效输入的规则是:如果填充了令牌字段,请获取所有行,直到下一个非空令牌字段为止。
1回复

如何在Parsec/Megaparsec中重载运算符?

我正在使用Parsec / Megaparsec作为解析器实现编译器。 我找不到重载操作符+ ,我想将它用于整数加法和字符串连接。 可能吗?
2回复

Parsec中的用户状态

我正在使用Parsec解析表达式,我想使用Parsec中的用户状态跟踪这些表达式中的变量。 不幸的是我真的没办法怎么做。 给出以下代码: 所以, ParsecT suma的u将是Set.Set 。 但是我如何将状态更新集成到var呢? 我试过modify $ Set.insert
1回复

在Haskell/Parsec中引发ParseError

在Parsec中引发错误( ParseError )的首选方法是什么? 我得到了执行检查,如果检查失败,解析器内部的一些代码ParseError应(即返回Left ParseError运行时parse )。
1回复

如何在parsec中给出给定位置的失败消息

我需要在parsec中给出一个给定位置的失败消息。 我尝试通过在给出意外错误消息之前设置位置,但它不起作用: 回馈 虽然正确的答案是: 它可以通过从代码中省略setPosition pos0 >>来生成(位置错误)。 我的解决方法是进行解析,在parsec的用户状
2回复

如何在Parsec中实现下标运算符?

我正在用 Parsec 编写一个解析器。 像 E -> E + E 这样的左递归产生式在 LL 解析器中无法轻松编写,因此 Parsec 提供了buildExpressionParser ,它支持中缀、后缀和前缀运算符。 但是下标运算符呢? E -> E [E] 将如何实现? 如果我可