如何匿名组合Haskell ReadP中的两个解析器?

时间:2017-01-17 11:23:43

标签: parsing haskell parser-combinators

问题

我想匿名链接两个ReadP解析器。

实施例

输入字符位于{'a', 'o', '+', ' '},其中' '是空格。 我想根据以下规则解析此输入:

  • 第一个o或a前面没有空格/加号
  • 每隔一个o前面都有一个空格
  • 每隔一个a前面加一个加号

BNF

如果不清楚,我想出了以下BNF:

{-
  <Input> :: = <O> <Expr> | <A> <Expr>
  <Expr> ::= <Space> <O> <Expr> | <Plus> <A> <Expr> | <EOL>
  <O> ::= "o"
  <A> ::= "a"
  <Space> ::= " "
  <Plus> ::= "+"
-}

具体问题

这个想法是,规则“o先于空格”和“a先于加号” (如果不是在开头)不应该是o或解析器的一部分,也不应该 我想创建一个显式/命名解析器,因为它是一部分 表达式的定义(Expr)。

如何将oParserspaceParser链接起来?

  • 作文(不起作用):spaceParser . oParser
  • (+++)是对称选择:oParser (+++) spaceParser。与此相关:(+++)是否等同于<|>的{​​{1}}?
  • Control.Applicative创建了一个新的解析器,它显然不适用于字符串,但我之前做过,ReadP.choice [oParser, spaceParser]的行为让我感到惊讶。 choice如何运作?

守则

choice

感谢很多阅读所有内容:)(并且:你会推荐哪些haskell解析库?)

0 个答案:

没有答案
相关问题