Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 使用解析器组合器的原因是什么?_Parsing_Haskell_Parser Combinators - Fatal编程技术网

Parsing 使用解析器组合器的原因是什么?

Parsing 使用解析器组合器的原因是什么?,parsing,haskell,parser-combinators,Parsing,Haskell,Parser Combinators,我正在研究如何在Haskell中使用解析器组合器。作者给出了以下解析器组合器示例: windSpeed :: String -> Maybe Int windSpeed windInfo = parseMaybe windSpeedParser windInfo windSpeedParser :: ReadP Int windSpeedParser = do direction <- numbers 3 speed <- numbers 2 <

我正在研究如何在Haskell中使用解析器组合器。作者给出了以下解析器组合器示例:

windSpeed :: String -> Maybe Int
windSpeed windInfo =
    parseMaybe windSpeedParser windInfo

windSpeedParser :: ReadP Int
windSpeedParser = do
    direction <- numbers 3
    speed <- numbers 2 <|> numbers 3
    unit <- string "KT" <|> string "MPS"
    return speed
windSpeed::String->Maybe Int
风速信息=
解析WindPeedParser windInfo
windSpeedParser::ReadP Int
风速雷达=do

方向我看到了使用解析器组合器的几个好处:

windSpeed :: String -> Maybe Int
windSpeed windInfo =
    parseMaybe windSpeedParser windInfo

windSpeedParser :: ReadP Int
windSpeedParser = do
    direction <- numbers 3
    speed <- numbers 2 <|> numbers 3
    unit <- string "KT" <|> string "MPS"
    return speed
  • 解析器组合器是手工编写的自顶向下解析器的推广。在手工编写解析器的情况下,使用解析器组合器来抽象出常见的模式
  • 与解析器生成器不同,解析器组合器可能是动态的,允许在运行时进行决策。如果可以根据输入重新定义语言的语法,则此方面可能很有用
  • 解析器是一级对象

因为数据往往是分层结构的,所以您可以为某些子元素编写解析器,然后构建一个解析器级联,每个解析器执行谜题的一部分?也就是说,对于XML解析器,首先是解析属性值的解析器,然后是使用前面的解析器解析
key=“value”
,然后重复该解析器解析任意数量的键/值对,然后解析标记,然后解析标记层次结构,等等。我要强调的是,您可以重用库函数,与基于BNF的方法不同,您不局限于上下文无关的语法。谢谢-您能将其扩展为一个答案吗?我想您可以在这里找到答案: