gpt4 book ai didi

haskell - 如何使用 Parsec 解析三元表达式?

转载 作者:行者123 更新时间:2023-12-04 11:46:42 25 4
gpt4 key购买 nike

buildExpressionParser只处理一元和二元运算符。它可以处理像 ?: 这样的三元运算符吗? ?有一些讨论herehere ,但没有一个是决定性的。

最佳答案

monadic 解析器的一大好处是它们的组合非常好。

这意味着您不必尝试欺骗单个 buildExpressionParser构建您想要的确切解析器。您可以简单地使用它来构建一个解析器,然后像其他任何东西一样使用该解析器,包括另一个 buildExpressionParser .

在您的情况下,您可以:

  • 使用buildExpressionParser为优先级高于 ?: 的表达式创建解析器
  • ?: 创建解析器使用上述
  • 使用buildExpressionParser为优先级低于 ?: 的表达式创建解析器使用上述

  • 这是一个完整的例子:
    import Control.Monad.Identity
    import Text.Parsec
    import Text.Parsec.Expr

    data Ex = Var String | Mul Ex Ex | Add Ex Ex | Assign Ex Ex | Trinary Ex Ex Ex
    deriving (Show)

    var = Var <$> many1 letter
    topOps = [ [binary "*" Mul], [binary "+" Add] ]
    topParser = buildExpressionParser topOps var

    trinaryExpr = do
    expr <- topParser
    trinary expr <|> return expr
    where
    trinary expr = do
    string "?"
    thenV <- trinaryExpr
    string ":"
    elseV <- trinaryExpr
    return $ Trinary expr thenV elseV

    bottomOps = [ [ binary "=" Assign ] ]
    bottomParser = buildExpressionParser bottomOps trinaryExpr

    binary :: String -> (Ex -> Ex -> Ex) -> Operator String () Identity Ex
    binary s t = Infix (string s >> return t) AssocLeft

    testParse s = runParser bottomParser () "" s
    main = print $ testParse "a=b+c*d?e+f:g*h"

    输出(手动格式化)是:
    Right 
    (Assign
    (Var "a")
    (Trinary
    (Add (Var "b")
    (Mul (Var "c") (Var "d")))
    (Add (Var "e") (Var "f"))
    (Mul (Var "g") (Var "h"))))

    关于haskell - 如何使用 Parsec 解析三元表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57930737/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com