packages feed

CSPM-Interpreter-0.4.4.1: src/CSPM/Interpreter/Prefix.hs

----------------------------------------------------------------------------
-- |
-- Module      :  CSPM.Interpreter.Prefix
-- Copyright   :  (c) Fontaine 2009 - 2011
-- License     :  BSD3
-- 
-- Maintainer  :  Fontaine@cs.uni-duesseldorf.de
-- Stability   :  experimental
-- Portability :  GHC-only
--
--
--
----------------------------------------------------------------------------
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE BangPatterns #-}
module CSPM.Interpreter.Prefix
(
  initPrefix
 ,viewPrefixState
 ,prefixStateNext
 ,prefixStateFinalize
)
where

import CSPM.Interpreter.Types as Types
import CSPM.Interpreter.PatternMatcher
import CSPM.Interpreter.Eval

import qualified CSPM.CoreLanguage as Core
import Language.CSPM.AST as AST hiding (Bindings)

import Data.List as List

initPrefix :: PrefixState -> PrefixState
initPrefix = id

viewNextPrefixField :: PrefixState -> CommField
viewNextPrefixField = unLabel . head . prefixFields

viewPrefixState :: PrefixState -> Core.PrefixFieldView INT
viewPrefixState p | List.null $ prefixFields p
  = throwScriptError "viewPrefixState: no fields" Nothing Nothing
viewPrefixState p = case viewNextPrefixField p of
  OutComm out -> Core.FieldOut $ runEM (evalOutField out) env
  InComm _pat -> Core.FieldIn
  InCommGuarded _pat g -> Core.FieldGuard $ runEM (evalFieldSet g) env
  where env = prefixEnv p

prefixStateNext :: PrefixState -> Field -> Maybe PrefixState
prefixStateNext p _field | List.null $ prefixFields p
  = throwScriptError "prefixStateNext no fields" Nothing Nothing
prefixStateNext p field = case viewNextPrefixField p of
{- todo ::
  we must check that the Field is OK here
  we should use the lookahead scheme of the GenericBufferPrefix
-}
  OutComm _out -> return $ p { prefixFields = tail $ prefixFields p }
  InComm pat -> prefixBindInput field pat
  InCommGuarded pat _g -> prefixBindInput field pat
  where
    env = prefixEnv p
    prefixBindInput f pat = do
      newBinds <- tryMatchStrict (argBindings env) pat f
      return p {
           prefixFields = tail $ prefixFields p
          ,prefixEnv = setArgBindings env newBinds }

prefixStateFinalize :: PrefixState -> Maybe PrefixState
prefixStateFinalize p | prefixPatternFailed p = Nothing
prefixStateFinalize p | not $ List.null $ prefixFields p
  = throwScriptError "prefixStateFinalize: unsynchronized fields left" Nothing Nothing
prefixStateFinalize p
  = Just $ p { prefixRHS = runEM (evalProcess $ prefixBody p) (prefixEnv p) }