如何为变量定义解析器函数?

时间:2017-06-04 04:26:28

标签: haskell

我需要帮助为三元表达式创建解析器。我给出了三元表达式的语法。

tExp :: tOpd ( '<=>' tExp | '==>' tExp| e )
tOpd :: tTerm ( '|||' tOpd | e )
tTerm :: tFact ( '&&&' tTerm | e)
tFact :: '~' tPrim | tPrim
primary :: tVar | tLit | '('tExp')'
tVar :: lowercase (Alphanumeric)*
tLit :: T | F | M

我也在这里定义了数据类型Ternary和表达式树。

data Ternary = T | F | M
    deriving (Eq,  Show, Ord) 

   data TExpTree = L Ternary              -- Ternary literal (i.e. T, F or M)
                  | V String               -- Variable 
                  | N TExpTree             -- Prefix not
                  | A TExpTree TExpTree    -- And node
                  | O TExpTree TExpTree    -- Or node
                  | E TExpTree TExpTree    -- Equivalence node
                  | I TExpTree TExpTree    -- Implication node
        deriving (Show, Eq)

我知道首先我需要为每条规则创建函数。

tExp:: Parser TExpTree
tExp = do o <- tOpd
          (do symbol "<=>"
              e <- tExp
              return (e<=>o)
           +++ do synbol "==>"
              e <- tExp
              return (e==>o)
           +++ return o)

tOpd :: Parser TExpTree
tOpd = do t <- tTerm
          (do symbol "|||"
              e <- tOpd
              return (t|||e)
           +++ return t)

tTerm :: Parser TExpTree
tTerm = do f <- tFact
          (do symbol "&&&"
              e <- tTerm
              return (f+e)
           +++ return f)

tFact:: Parser TExpTree 
tFact = do m <- tPrim
           return m
        +++
           (do symbol "~"
              m <- tExp
              return (~m))

到目前为止,我有这些,但我不知道如何为primary,tLit和tVar创建它们。

有人可以帮助我弄清楚tLit,所以我可以尝试自己做其余的事情吗?我不确定该怎么做。

我有tLit的测试功能,以确认它也能正常工作。

testtLit :: Bool
testtLit = lt == (L T) && lf == (L F) && lm == (L M)  
       where Just (lt, _) = parse tLit " T " 
             Just (lf, _) = parse tLit " F "
             Just (lm, _) = parse tLit " M " 

1 个答案:

答案 0 :(得分:1)

您正在单个函数中实现解析器和求值程序。因此,您永远不会使用TExpTree。如果要构建解析器,请将解析器函数的类型更改为Parser TExpTree。然后,让tExp返回(I e o)而不是(e==>o),依此类推。

tLit函数的实现取决于解析器提供的工具。它可能看起来像这样(未经测试):

tLit :: Parser TExpTree
tLit = (symbol "T" >> return (L T))
   <|> (symbol "F" >> return (L F))
   <|> (symbol "M" >> return (L M))