繁体   English   中英

如何在Parsec中停止endBy

How to stop a endBy in Parsec

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试使用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 个回复

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

1 parsec无法为endBy函数定义规则

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

2 如何在 Haskell 中运行 Parsec 测试?

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

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

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

4 如何在Parsec中返回多个已解析的ADT?

我正在使用Parsec来解析一个看起来像这样的文件: 除了文件可以具有可变数量的节外,每个节均以“ ##”行开头,并且可以包含0+个内容行。 我希望输出看起来像这样: 当我每节只有一条内容行并产生上面的输出时,代码起作用。 我有两个问题: 1)当我每个部分有多 ...

6 Parsec中的用户状态

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

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

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

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

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

9 “尝试”在Parsec中的表现如何?

为了弄清楚try在parsec中是如何工作的,我把它放到了ghci中: 我不完全确定我的期望,但这不是我所期待的,因为我认为try的全部目的是当预期的事情不存在时不会导致错误。 ...

10 在Haskell中解析Parsec

我有2个解析器: 如果它不起作用,我如何构建一个尝试一个然后另一个的解析器? 我无法弄清楚要归还什么。 必须有一个聪明的方法来做到这一点。 谢谢。 编辑: 添加更多信息...... 我正在学习Haskel,所以我开始: 然后我读了关于F-algebra ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM