我会写
integer :: Parser Integer
integer = read <$ many1 space <*> many1 digit
有一堆左结合(如应用程序)语法分析器建设运营<$>
,<*>
,<$
,<*
的。最左边的东西应该是从组件值中汇集结果值的纯函数。每个运算符右侧的内容应该是一个解析器,将语法的组成部分从左到右集中起来。使用哪个运营商取决于两个选择,如下所示。
the thing to the right is signal/noise
_________________________
the thing to the left is \
+-------------------
pure/| <$> <$
a parser | <*> <*
所以,既然选择read :: String -> Integer
作为将要递送解析器的语义的纯函数,我们可以前导间隔作为“噪声”和数字的一串为“信号”进行分类,因此
read <$ many1 space <*> many1 digit
(..) (.........) (.........)
pure noise parser |
(.................) |
parser signal parser
(.................................)
parser
您可以
p1 <|> ... <|> pn
和快速不可能结合的多种可能性与
empty
很少有必要在解析器中命名组件,并且生成的代码看起来更像是带有添加语义的语法。
为什么'const'? – MathematicalOrchid 2013-02-28 19:30:29
我们希望忽略'many1 space'的值(但不是效果),并将'read'应用于'many1 digit'的值。 (对不起,我刚刚进来,已经很晚了,我很疲倦:我用术语玩得很快而且松散。)如果你想象's'和'd'代表'many1 space'和' many1 digit',那么'const读取的值(忽略效果)<$> many1 space <*> many1 digit'是'const read sd' ='read d'。 – dave4420 2013-02-28 22:33:11