我想匿名链接两个ReadP
解析器。
输入字符位于{'a', 'o', '+', ' '}
,其中' '
是空格。
我想根据以下规则解析此输入:
如果不清楚,我想出了以下BNF:
{-
<Input> :: = <O> <Expr> | <A> <Expr>
<Expr> ::= <Space> <O> <Expr> | <Plus> <A> <Expr> | <EOL>
<O> ::= "o"
<A> ::= "a"
<Space> ::= " "
<Plus> ::= "+"
-}
这个想法是,规则“o先于空格”和“a先于加号”
(如果不是在开头)不应该是o或解析器的一部分,也不应该
我想创建一个显式/命名解析器,因为它是一部分
表达式的定义(Expr
)。
如何将oParser
与spaceParser
链接起来?
spaceParser . oParser
(+++)
是对称选择:oParser (+++) spaceParser
。与此相关:(+++)
是否等同于<|>
的{{1}}?Control.Applicative
创建了一个新的解析器,它显然不适用于字符串,但我之前做过,ReadP.choice [oParser, spaceParser]
的行为让我感到惊讶。 choice
如何运作?choice
感谢很多阅读所有内容:)(并且:你会推荐哪些haskell解析库?)