tlex 0.4.0.0 → 0.4.0.1
raw patch · 4 files changed
+41/−28 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.Lexer.Tlex.Runner: instance (GHC.Classes.Eq p, GHC.Classes.Eq a) => GHC.Classes.Eq (Language.Lexer.Tlex.Runner.TlexResult p a)
- Language.Lexer.Tlex.Runner: instance (GHC.Show.Show p, GHC.Show.Show a) => GHC.Show.Show (Language.Lexer.Tlex.Runner.TlexResult p a)
- Language.Lexer.Tlex.Runner: instance forall k (e :: k). GHC.Base.Functor (Language.Lexer.Tlex.Runner.Runner e)
- Language.Lexer.Tlex.Syntax: instance (GHC.Enum.Enum e, GHC.Show.Show e, GHC.Show.Show a) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.ScanRule e a)
- Language.Lexer.Tlex.Syntax: instance (GHC.Enum.Enum e, GHC.Show.Show e, GHC.Show.Show a) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.Scanner e a)
- Language.Lexer.Tlex.Syntax: instance GHC.Base.Functor (Language.Lexer.Tlex.Syntax.ScanRule e)
- Language.Lexer.Tlex.Syntax: instance GHC.Base.Functor (Language.Lexer.Tlex.Syntax.Scanner e)
- Language.Lexer.Tlex.Syntax: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.ScanRule e a)
- Language.Lexer.Tlex.Syntax: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.Scanner e a)
- Language.Lexer.Tlex.Syntax: instance forall k (s :: k) e f. (GHC.Enum.Enum e, GHC.Show.Show e, GHC.Show.Show f) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.ScannerBuilderContext s e f)
- Language.Lexer.Tlex.Syntax: instance forall k (s :: k) e f. GHC.Classes.Eq f => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.ScannerBuilderContext s e f)
- Language.Lexer.Tlex.Syntax: instance forall k (s :: k) e. GHC.Base.Functor (Language.Lexer.Tlex.Syntax.ScannerBuilderContext s e)
+ Language.Lexer.Tlex.Runner: instance (GHC.Classes.Eq mark, GHC.Classes.Eq action) => GHC.Classes.Eq (Language.Lexer.Tlex.Runner.TlexResult mark action)
+ Language.Lexer.Tlex.Runner: instance (GHC.Show.Show mark, GHC.Show.Show action) => GHC.Show.Show (Language.Lexer.Tlex.Runner.TlexResult mark action)
+ Language.Lexer.Tlex.Runner: instance forall k (unit :: k). GHC.Base.Functor (Language.Lexer.Tlex.Runner.Runner unit)
+ Language.Lexer.Tlex.Syntax: instance (GHC.Enum.Enum unit, GHC.Show.Show unit, GHC.Show.Show action) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.ScanRule unit action)
+ Language.Lexer.Tlex.Syntax: instance (GHC.Enum.Enum unit, GHC.Show.Show unit, GHC.Show.Show action) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.Scanner unit action)
+ Language.Lexer.Tlex.Syntax: instance GHC.Base.Functor (Language.Lexer.Tlex.Syntax.ScanRule unit)
+ Language.Lexer.Tlex.Syntax: instance GHC.Base.Functor (Language.Lexer.Tlex.Syntax.Scanner unit)
+ Language.Lexer.Tlex.Syntax: instance GHC.Classes.Eq action => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.ScanRule unit action)
+ Language.Lexer.Tlex.Syntax: instance GHC.Classes.Eq action => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.Scanner unit action)
+ Language.Lexer.Tlex.Syntax: instance forall k (state :: k) unit action. (GHC.Enum.Enum unit, GHC.Show.Show unit, GHC.Show.Show action) => GHC.Show.Show (Language.Lexer.Tlex.Syntax.ScannerBuilderContext state unit action)
+ Language.Lexer.Tlex.Syntax: instance forall k (state :: k) unit action. GHC.Classes.Eq action => GHC.Classes.Eq (Language.Lexer.Tlex.Syntax.ScannerBuilderContext state unit action)
+ Language.Lexer.Tlex.Syntax: instance forall k (state :: k) unit. GHC.Base.Functor (Language.Lexer.Tlex.Syntax.ScannerBuilderContext state unit)
- Language.Lexer.Tlex: buildRunner :: Enum e => Scanner e a -> Runner e a
+ Language.Lexer.Tlex: buildRunner :: Enum unit => Scanner unit action -> Runner unit action
- Language.Lexer.Tlex.Runner: Runner :: (Int -> Int) -> (Int -> Maybe a) -> (Int -> Int -> Int) -> Runner e a
+ Language.Lexer.Tlex.Runner: Runner :: (Int -> Int) -> (Int -> Maybe action) -> (Int -> Int -> Int) -> Runner unit action
- Language.Lexer.Tlex.Runner: TlexAccepted :: p -> a -> TlexResult p a
+ Language.Lexer.Tlex.Runner: TlexAccepted :: mark -> action -> TlexResult mark action
- Language.Lexer.Tlex.Runner: TlexEndOfInput :: TlexResult p a
+ Language.Lexer.Tlex.Runner: TlexEndOfInput :: TlexResult mark action
- Language.Lexer.Tlex.Runner: TlexError :: TlexResult p a
+ Language.Lexer.Tlex.Runner: TlexError :: TlexResult mark action
- Language.Lexer.Tlex.Runner: [$sel:tlexAccept:Runner] :: Runner e a -> Int -> Maybe a
+ Language.Lexer.Tlex.Runner: [$sel:tlexAccept:Runner] :: Runner unit action -> Int -> Maybe action
- Language.Lexer.Tlex.Runner: [$sel:tlexInitial:Runner] :: Runner e a -> Int -> Int
+ Language.Lexer.Tlex.Runner: [$sel:tlexInitial:Runner] :: Runner unit action -> Int -> Int
- Language.Lexer.Tlex.Runner: [$sel:tlexTrans:Runner] :: Runner e a -> Int -> Int -> Int
+ Language.Lexer.Tlex.Runner: [$sel:tlexTrans:Runner] :: Runner unit action -> Int -> Int -> Int
- Language.Lexer.Tlex.Runner: class (Enum e, Monad m) => TlexContext p e m | m -> p, m -> e
+ Language.Lexer.Tlex.Runner: class (Enum unit, Monad m) => TlexContext mark unit m | m -> mark, m -> unit
- Language.Lexer.Tlex.Runner: data Runner e a
+ Language.Lexer.Tlex.Runner: data Runner unit action
- Language.Lexer.Tlex.Runner: data TlexResult p a
+ Language.Lexer.Tlex.Runner: data TlexResult mark action
- Language.Lexer.Tlex.Runner: runRunner :: Enum s => TlexContext p c m => Runner c a -> s -> m (TlexResult p a)
+ Language.Lexer.Tlex.Runner: runRunner :: Enum state => TlexContext mark unit m => Runner unit action -> state -> m (TlexResult mark action)
- Language.Lexer.Tlex.Runner: tlexGetInputPart :: TlexContext p e m => m (Maybe e)
+ Language.Lexer.Tlex.Runner: tlexGetInputPart :: TlexContext mark unit m => m (Maybe unit)
- Language.Lexer.Tlex.Runner: tlexGetMark :: TlexContext p e m => m p
+ Language.Lexer.Tlex.Runner: tlexGetMark :: TlexContext mark unit m => m mark
- Language.Lexer.Tlex.Syntax: ScanRule :: [StartState] -> Pattern e -> a -> ScanRule e a
+ Language.Lexer.Tlex.Syntax: ScanRule :: [StartState] -> Pattern unit -> action -> ScanRule unit action
- Language.Lexer.Tlex.Syntax: Scanner :: [ScanRule e a] -> Scanner e a
+ Language.Lexer.Tlex.Syntax: Scanner :: [ScanRule unit action] -> Scanner unit action
- Language.Lexer.Tlex.Syntax: [$sel:scanRulePattern:ScanRule] :: ScanRule e a -> Pattern e
+ Language.Lexer.Tlex.Syntax: [$sel:scanRulePattern:ScanRule] :: ScanRule unit action -> Pattern unit
- Language.Lexer.Tlex.Syntax: [$sel:scanRuleSemanticAction:ScanRule] :: ScanRule e a -> a
+ Language.Lexer.Tlex.Syntax: [$sel:scanRuleSemanticAction:ScanRule] :: ScanRule unit action -> action
- Language.Lexer.Tlex.Syntax: [$sel:scanRuleStartStates:ScanRule] :: ScanRule e a -> [StartState]
+ Language.Lexer.Tlex.Syntax: [$sel:scanRuleStartStates:ScanRule] :: ScanRule unit action -> [StartState]
- Language.Lexer.Tlex.Syntax: [$sel:scannerRules:Scanner] :: Scanner e a -> [ScanRule e a]
+ Language.Lexer.Tlex.Syntax: [$sel:scannerRules:Scanner] :: Scanner unit action -> [ScanRule unit action]
- Language.Lexer.Tlex.Syntax: anyoneP :: Enum e => Pattern e
+ Language.Lexer.Tlex.Syntax: anyoneP :: Enum unit => Pattern unit
- Language.Lexer.Tlex.Syntax: buildScanner :: Enum e => ScannerBuilder s e f () -> Scanner e f
+ Language.Lexer.Tlex.Syntax: buildScanner :: Enum unit => ScannerBuilder state unit action () -> Scanner unit action
- Language.Lexer.Tlex.Syntax: data ScanRule e a
+ Language.Lexer.Tlex.Syntax: data ScanRule unit action
- Language.Lexer.Tlex.Syntax: data ScannerBuilderContext s e f
+ Language.Lexer.Tlex.Syntax: data ScannerBuilderContext state unit action
- Language.Lexer.Tlex.Syntax: lexRule :: Enum s => Enum e => [s] -> Pattern e -> f -> ScannerBuilder s e f ()
+ Language.Lexer.Tlex.Syntax: lexRule :: Enum state => Enum unit => [state] -> Pattern unit -> action -> ScannerBuilder state unit action ()
- Language.Lexer.Tlex.Syntax: manyP :: Enum e => Pattern e -> Pattern e
+ Language.Lexer.Tlex.Syntax: manyP :: Enum unit => Pattern unit -> Pattern unit
- Language.Lexer.Tlex.Syntax: maybeP :: Enum e => Pattern e -> Pattern e
+ Language.Lexer.Tlex.Syntax: maybeP :: Enum unit => Pattern unit -> Pattern unit
- Language.Lexer.Tlex.Syntax: newtype Scanner e a
+ Language.Lexer.Tlex.Syntax: newtype Scanner unit action
- Language.Lexer.Tlex.Syntax: orP :: Enum e => [Pattern e] -> Pattern e
+ Language.Lexer.Tlex.Syntax: orP :: Enum unit => [Pattern unit] -> Pattern unit
- Language.Lexer.Tlex.Syntax: someP :: Enum e => Pattern e -> Pattern e
+ Language.Lexer.Tlex.Syntax: someP :: Enum unit => Pattern unit -> Pattern unit
- Language.Lexer.Tlex.Syntax: type ScannerBuilder s e f = State (ScannerBuilderContext s e f)
+ Language.Lexer.Tlex.Syntax: type ScannerBuilder state unit action = State (ScannerBuilderContext state unit action)
Files
- src/Language/Lexer/Tlex.hs +1/−1
- src/Language/Lexer/Tlex/Runner.hs +15/−8
- src/Language/Lexer/Tlex/Syntax.hs +23/−17
- tlex.cabal +2/−2
src/Language/Lexer/Tlex.hs view
@@ -17,7 +17,7 @@ import qualified Language.Lexer.Tlex.Pipeline.Scanner2Nfa as TlexPipeline -buildRunner :: Enum e => Scanner e a -> Runner e a+buildRunner :: Enum unit => Scanner unit action -> Runner unit action buildRunner scanner = let nfa = NFA.buildNFA do TlexPipeline.scanner2Nfa scanner dfa = TlexPipeline.nfa2Dfa nfa
src/Language/Lexer/Tlex/Runner.hs view
@@ -8,28 +8,35 @@ import Language.Lexer.Tlex.Prelude -class (Enum e, Monad m) => TlexContext p e m | m -> p, m -> e where- tlexGetInputPart :: m (Maybe e)- tlexGetMark :: m p+class (Enum unit, Monad m) => TlexContext mark unit m | m -> mark, m -> unit where+ -- | Get a unit of current position from input, and move to next position.+ tlexGetInputPart :: m (Maybe unit) -data TlexResult p a+ -- | Get a mark of current position.+ tlexGetMark :: m mark++data TlexResult mark action = TlexEndOfInput+ -- ^ No more inputs. | TlexError- | TlexAccepted p a+ -- ^ Some inputs are available, but not accepted.+ | TlexAccepted mark action+ -- ^ Accepted with a end position and an action. deriving (Eq, Show) -data Runner e a = Runner+data Runner unit action = Runner { tlexInitial :: Int -> Int -- ^ StartState -> (StateNum | -1)- , tlexAccept :: Int -> Maybe a+ , tlexAccept :: Int -> Maybe action -- ^ StateNum -> Maybe Action , tlexTrans :: Int -> Int -> Int -- ^ StateNum -> CodeUnit -> (StateNum | -1) } deriving Functor -runRunner :: Enum s => TlexContext p c m => Runner c a -> s -> m (TlexResult p a)+runRunner :: Enum state => TlexContext mark unit m+ => Runner unit action -> state -> m (TlexResult mark action) runRunner runner s0 = case tlexInitial runner do fromEnum s0 of -1 -> error "unknown initial state" s -> go s
src/Language/Lexer/Tlex/Syntax.hs view
@@ -24,53 +24,59 @@ import qualified Language.Lexer.Tlex.Machine.Pattern as Pattern -newtype Scanner e a = Scanner- { scannerRules :: [ScanRule e a]+newtype Scanner unit action = Scanner+ { scannerRules :: [ScanRule unit action] } deriving (Eq, Show, Functor) -data ScanRule e a = ScanRule+data ScanRule unit action = ScanRule { scanRuleStartStates :: [Pattern.StartState]- , scanRulePattern :: Pattern.Pattern e- , scanRuleSemanticAction :: a+ , scanRulePattern :: Pattern.Pattern unit+ , scanRuleSemanticAction :: action } deriving (Eq, Show, Functor) -buildScanner :: Enum e => ScannerBuilder s e f () -> Scanner e f+buildScanner :: Enum unit+ => ScannerBuilder state unit action () -> Scanner unit action buildScanner builder = Scanner { scannerRules = unScannerBuilderContext do execState builder do ScannerBuilderContext [] } -newtype ScannerBuilderContext s e f = ScannerBuilderContext- { unScannerBuilderContext :: [ScanRule e f]+newtype ScannerBuilderContext state unit action = ScannerBuilderContext+ { unScannerBuilderContext :: [ScanRule unit action] } deriving (Eq, Show, Functor) -type ScannerBuilder s e f = State (ScannerBuilderContext s e f)+type ScannerBuilder state unit action = State (ScannerBuilderContext state unit action) -lexRule :: Enum s => Enum e- => [s] -> Pattern.Pattern e -> f -> ScannerBuilder s e f ()+lexRule :: Enum state => Enum unit+ => [state] -> Pattern.Pattern unit -> action -> ScannerBuilder state unit action () lexRule ss p act = modify' \(ScannerBuilderContext rs0) -> ScannerBuilderContext do ScanRule [Pattern.startStateFromEnum s | s <- ss] p act:rs0 -anyoneP :: Enum e => Pattern.Pattern e+-- | Wildcard pattern which accepts an any unit.+anyoneP :: Enum unit => Pattern.Pattern unit anyoneP = Pattern.Range SymEnumSet.full -maybeP :: Enum e => Pattern.Pattern e -> Pattern.Pattern e+-- | Maybe pattern which accepts given pattern or nothing.+maybeP :: Enum unit => Pattern.Pattern unit -> Pattern.Pattern unit maybeP x = orP [x, Pattern.Epsilon] -someP :: Enum e => Pattern.Pattern e -> Pattern.Pattern e+-- | Some pattern which accepts one given pattern or more times.+someP :: Enum unit => Pattern.Pattern unit -> Pattern.Pattern unit someP x = x <> Pattern.Many x -manyP :: Enum e => Pattern.Pattern e -> Pattern.Pattern e+-- | Many pattern which accepts nothing or given pattern more times.+manyP :: Enum unit => Pattern.Pattern unit -> Pattern.Pattern unit manyP x = Pattern.Many x -{-# INLINE orP #-}-orP :: Enum e => [Pattern.Pattern e] -> Pattern.Pattern e+-- | Or pattern which accepts one of given patterns.+orP :: Enum unit => [Pattern.Pattern unit] -> Pattern.Pattern unit orP = \case [] -> Pattern.Epsilon p:ps -> foldr (Pattern.:|:) p ps+{-# INLINE orP #-}
tlex.cabal view
@@ -2,12 +2,12 @@ build-type: Custom name: tlex-version: 0.4.0.0+version: 0.4.0.1 license: Apache-2.0 OR MPL-2.0 license-file: LICENSE copyright: (c) 2020 Mizunashi Mana author: Mizunashi Mana-maintainer: mizunashi-mana@noreply.git+maintainer: contact@mizunashi.work category: Parsing homepage: https://github.com/mizunashi-mana/tlex