packages feed

pads-haskell-0.1.0.0: examples/DFAC.hs

{-# LANGUAGE TypeFamilies
           , ScopedTypeVariables
           , DeriveDataTypeable
           , MultiParamTypeClasses
           , TypeSynonymInstances
           , TemplateHaskell
           , QuasiQuotes
           , FlexibleInstances
           , FlexibleContexts
           , RecordWildCards
           , NamedFieldPuns
           , OverloadedStrings #-}

module DFAC where
import Language.Pads.Padsc
import Language.Pads.Testing
import Data.Word



[pads|
    
    -- constrained dfa 
    -- accepts all caaats with each character followed by a consistent number:
    -- c1a1t1 or c5a5a5a5t5 but not c1a2t2


    -- START   -- _ --> S1
    -- S1      -- c --> S2
    -- S2      -- a --> S3
    -- S3      -- a --> S3
    -- S3      -- t --> ACCEPT


    data AA = AA {'a','a','a'}

    data START = START {start::S1}

    -- s1 -- c --> s2

    data S1 = S1 {
                    'c',
                     c1 :: Char,
                     s2 :: S2 c1
                 }

    -- s2 -- a --> s3

    data S2 (n::Char) = 
              S2 {  
                    'a',
                    constrain c2 :: Char where <| n == c2 |>,
                              s3 :: S3 c2
                 }

    -- s3 -- a --> s3
    -- s3 -- t --> s4

    data S3 (n::Char) = 
              S3A {  'a', 
                    constrain c3a :: Char where <| n == c3a |>,
                              s3a :: S3 c3a 
                  } |
              S3T { 't', 
                    constrain c3t :: Char where <| n == c3t |>,
                              ss4 :: S4 c3t}

    data S4 (n::Char) = S4 {s4::ACCEPT}

    data ACCEPT = ACCEPT ()

|]


testdfa parser str = 
  let 
    ((x, (y, z)), s) = parser str
    bad = numErrors y + length s       
  in case bad of 
    0 -> "DFA accepts " ++ str ++ ""
    n -> "DFA rejects " ++ str ++ " with " ++ (show n) ++ " errors."

--testdfa sTART_parseS "c1a1t1"
--testdfa sTART_parseS "c1a1t2"

--testdfa sTART_parseS "c1a1a1a1a1a1a1a1t2"
--testdfa sTART_parseS "c1a1a1a1a1a1a1a1t1"