2017-06-04 17 views
0

三項式のパーサーを作成するのに助けが必要です。私は三項式のためにこの文法を与えられています。変数のパーサー関数を定義するにはどうすればよいですか?

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 " 
+0

これはまったく正しいとは限りません(まずは解析しません)。あなたはデータTExpTreeを定義しましたが、それを使用していません。パーサが 'Parser TExpTree'ではなく' Parser Ternary'型であることを確かめますか? –

+0

あなたはTExpTreeについて正しいと思います。あなたはそれが解析しないということは何を意味しますか?私はこれがあなたがそれを設定する方法だと思った。 – user3277930

+0

コンパイラから解析エラーが出ます。 –

答えて

1

1つの関数でパーサとエバリュエータを実装しています。そのため、TExpTreeは決して使用しません。パーサーを構築する場合は、パーサー関数のタイプをParser TExpTreeに変更します。次にtExp(e==>o)の代わりに(I e o)と返すなどします。

tLit関数の実装は、パーサーが提供するツールによって異なります。

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

こんにちは、エラーが発生しています。エラーは((:)か((|))のどちらかである可能性がありますが、コロンのように見えますが、おそらく((|)) エラーはスコープに変数がありません。((:) :) ::パーサTExpTree - >パーサTExpTree - > T0おそらくあなたはこれらのどれかを意味していた:(*)範囲内でない変数:((:) :) :: t0->パーサTExpTree - > TExpTreeおそらく、 )(=)これはどういう意味ですか? – user3277930

+0

コードに ':'や '|'はありません。おそらくあなたは '<|>'を意味しましたか?これは 'Control.Applicative'からインポートされます。 '<|>'は代替を表します。だから 'a <|> b'は:' a'を最初に試し、失敗すれば 'b'を試してください。 – sapanoia

関連する問題