packages feed

yapb-0.2: src/parserlib/algo/SynCompAlgorithm.hs

module SynCompAlgorithm(chooseCompCandidatesFn, defaultCompCandidatesFn) where

import qualified SynCompAlgoBU as BU
import qualified SynCompAlgoTD as TD
import qualified SynCompAlgoPEPM as PEPM

-- For experiment
import qualified SynCompAlgoBUTree as BUTree
import qualified SynCompAlgoBUTreeNested as BUTreeNested

import TokenInterface
import Config
import SynCompAlgoUtil
import CommonParserUtil

import Data.Typeable

chooseCompCandidatesFn :: (TokenInterface token, Typeable token, Typeable ast, Show token, Show ast) =>
  IO (  CompCandidates token ast
        -> Int
        -> [Candidate]
        -> Int
        -> Stack token ast
        -> IO ([[Candidate]], Bool) )
chooseCompCandidatesFn =
  do maybeConfig <- readConfig
     case maybeConfig of
       Nothing -> return defaultCompCandidatesFn
       Just config -> return (choose (config_ALGORITHM config) (config_SIMPLE config))
  where
    choose 0 _     = BU.compCandidates
    choose 1 _     = TD.compCandidates
    choose 2 _     = PEPM.compCandidates
    choose 3 True  = BUTree.compCandidates         -- 3 and Simple
    choose 3 False = BUTreeNested.compCandidates   -- 3 and Nested
    choose _ _     = defaultCompCandidatesFn  -- by default !

defaultCompCandidatesFn :: (TokenInterface token, Typeable token, Typeable ast, Show token, Show ast) =>
   CompCandidates token ast
        -> Int
        -> [Candidate]
        -> Int
        -> Stack token ast
        -> IO ([[Candidate]], Bool)
defaultCompCandidatesFn = BU.compCandidates