Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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
在uu-parsinglib中使用'opt'组合符_Parsing_Haskell - Fatal编程技术网

在uu-parsinglib中使用'opt'组合符

在uu-parsinglib中使用'opt'组合符,parsing,haskell,Parsing,Haskell,我正在为我的项目编写一个简单文本模板语言的解析器,我完全被uu parsinglib中的optcombinator(如果需要的话,版本为2.7.3.2)所困扰。关于如何正确使用它有什么想法吗 这是一个非常简单的例子,显示了我的困境 {-# LANGUAGE FlexibleContexts #-} import Text.ParserCombinators.UU hiding (pEnd) import Text.ParserCombinators.UU.Utils import Text.P

我正在为我的项目编写一个简单文本模板语言的解析器,我完全被uu parsinglib中的
opt
combinator(如果需要的话,版本为2.7.3.2)所困扰。关于如何正确使用它有什么想法吗

这是一个非常简单的例子,显示了我的困境

{-# LANGUAGE FlexibleContexts #-}

import Text.ParserCombinators.UU hiding (pEnd)
import Text.ParserCombinators.UU.Utils
import Text.ParserCombinators.UU.BasicInstances

pIdentifier :: Parser String
pIdentifier = pMany pLetter

pIfClause :: Parser ((String, String), String, Maybe (String, String), String)
pIfClause = (,,,) <$> pIf <*> pIdentifier <*> pOptionalElse <*> pEnd

pIf :: Parser (String, String)
pIf = pBraces ((,) <$> pToken "if " <*> pIdentifier)

pOptionalElse :: Parser (Maybe (String, String))
pOptionalElse = (((\x y -> Just (x, y)) <$> pElse <*> pIdentifier) `opt` Nothing)

pElse :: Parser String
pElse = pBraces (pToken "else")

pEnd :: Parser String
pEnd = pBraces (pToken "end")

main :: IO ()
main = do
  putStrLn $ show $ runParser "works" pIfClause "{if abc}def{else}ghi{end}"
  putStrLn $ show $ runParser "doesn't work" pIfClause "{if abc}def{end}"

opt
的文档说明:

如果可以识别p,则使用p的返回值。否则,使用值v。请注意,默认情况下opt是贪婪的


贪婪的含义在
的文档中有解释,谢谢,我想我试过了,但显然没有。“完全没有”是行得通的。
main: Failed parsing 'doesn't work' :
Expected  at position LineColPos 0 12 12 expecting one of [Whitespace, "else"] at LineColPos 0 12 12 :
                              v
                  {if abc}def{end}
                              ^