三項式のパーサーを作成するのに助けが必要です。私は三項式のためにこの文法を与えられています。変数のパーサー関数を定義するにはどうすればよいですか?
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とExpression Treeを定義しました。
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))
はこれまでのところ、私はこれらを持っていますが、私は、主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 "
これはまったく正しいとは限りません(まずは解析しません)。あなたはデータTExpTreeを定義しましたが、それを使用していません。パーサが 'Parser TExpTree'ではなく' Parser Ternary'型であることを確かめますか? –
あなたはTExpTreeについて正しいと思います。あなたはそれが解析しないということは何を意味しますか?私はこれがあなたがそれを設定する方法だと思った。 – user3277930
コンパイラから解析エラーが出ます。 –