我需要帮助为三元表达式创建解析器。我给出了三元表达式的语法。
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 "
答案 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))