{-# LANGUAGE FlexibleContexts #-} module Jikka.Core.Parse ( run, parseProgram, parseExpr, parseType, parseRule, ) where import Data.Text (Text, unpack) import Jikka.Common.Alpha import Jikka.Common.Error import Jikka.Core.Language.Expr import qualified Jikka.Core.Parse.Alex as L import qualified Jikka.Core.Parse.Happy as P parseRule :: (MonadAlpha m, MonadError Error m) => String -> m (String, [(VarName, Type)], Expr, Expr) parseRule :: String -> m (String, [(VarName, Type)], Expr, Expr) parseRule String input = do [Token'] tokens <- String -> m [Token'] forall (m :: * -> *). MonadError Error m => String -> m [Token'] L.run String input [Token'] -> m (String, [(VarName, Type)], Expr, Expr) forall (m :: * -> *). (MonadAlpha m, MonadError Error m) => [Token'] -> m (String, [(VarName, Type)], Expr, Expr) P.runRule [Token'] tokens parseType :: (MonadAlpha m, MonadError Error m) => String -> m Type parseType :: String -> m Type parseType String input = do [Token'] tokens <- String -> m [Token'] forall (m :: * -> *). MonadError Error m => String -> m [Token'] L.run String input [Token'] -> m Type forall (m :: * -> *). (MonadAlpha m, MonadError Error m) => [Token'] -> m Type P.runType [Token'] tokens parseExpr :: (MonadAlpha m, MonadError Error m) => String -> m Expr parseExpr :: String -> m Expr parseExpr String input = do [Token'] tokens <- String -> m [Token'] forall (m :: * -> *). MonadError Error m => String -> m [Token'] L.run String input [Token'] -> m Expr forall (m :: * -> *). (MonadAlpha m, MonadError Error m) => [Token'] -> m Expr P.runExpr [Token'] tokens parseProgram :: (MonadAlpha m, MonadError Error m) => String -> m Program parseProgram :: String -> m Program parseProgram String input = do [Token'] tokens <- String -> m [Token'] forall (m :: * -> *). MonadError Error m => String -> m [Token'] L.run String input [Token'] -> m Program forall (m :: * -> *). (MonadAlpha m, MonadError Error m) => [Token'] -> m Program P.runProgram [Token'] tokens run :: (MonadAlpha m, MonadError Error m) => FilePath -> Text -> m Program run :: String -> Text -> m Program run String _ Text input = do [Token'] tokens <- String -> m [Token'] forall (m :: * -> *). MonadError Error m => String -> m [Token'] L.run (String -> m [Token']) -> String -> m [Token'] forall a b. (a -> b) -> a -> b $ Text -> String unpack Text input [Token'] -> m Program forall (m :: * -> *). (MonadAlpha m, MonadError Error m) => [Token'] -> m Program P.runProgram [Token'] tokens