GroteTrap 0.5 → 0.5.1
raw patch · 8 files changed
+81/−17 lines, 8 filesdep +sybdep ~QuickCheckdep ~basedep ~mtlPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: syb
Dependency ranges changed: QuickCheck, base, mtl, parsec
API changes (from Hackage documentation)
+ Language.GroteTrap.Show: format :: Data a => Language a -> String -> String
+ Language.GroteTrap.Show: lshow :: Data a => Language a -> a -> String
- Language.GroteTrap.Language: Language :: (String -> a) -> (Int -> a) -> [Operator a] -> [Function a] -> Language a
+ Language.GroteTrap.Language: Language :: Maybe (String -> a) -> Maybe (Int -> a) -> [Operator a] -> [Function a] -> Language a
- Language.GroteTrap.Language: number :: Language a -> Int -> a
+ Language.GroteTrap.Language: number :: Language a -> Maybe (Int -> a)
- Language.GroteTrap.Language: variable :: Language a -> String -> a
+ Language.GroteTrap.Language: variable :: Language a -> Maybe (String -> a)
- Language.GroteTrap.Range: class Ranged a
+ Language.GroteTrap.Range: class Ranged a where range x = (begin x, end x) begin = fst . range end = snd . range
Files
- GroteTrap.cabal +16/−7
- LICENSE +1/−1
- Language/GroteTrap.hs +2/−0
- Language/GroteTrap/Language.hs +4/−4
- Language/GroteTrap/ParseTree.hs +2/−2
- Language/GroteTrap/Show.hs +49/−0
- Language/GroteTrap/Unparse.hs +1/−1
- LogicExample.hs +6/−2
GroteTrap.cabal view
@@ -1,29 +1,38 @@ Name: GroteTrap-Version: 0.5+Version: 0.5.1 Synopsis: Parser and selection library for expression languages. Description: Allows quick definition of expression languages. You get a parser for free, as well as conversion from text selection to tree selection and back. Homepage: http://www.haskell.org/haskellwiki/GroteTrap Author: Jeroen Leeuwestein, Martijn van Steenbergen Maintainer: martijn@van.steenbergen.nl-Copyright: Copyright (c) 2007-2008 Jeroen Leeuwestein and Martijn van Steenbergen+Copyright: Copyright (c) 2007-2015 Jeroen Leeuwestein and Martijn van Steenbergen -Cabal-Version: >= 1.2+Cabal-Version: >= 1.6 License: BSD3 License-file: LICENSE Category: Language Build-type: Simple Extra-source-files: LogicExample.hs, ArithmeticExample.hs +Source-Repository head+ Type: git+ Location: https://github.com/MedeaMelana/GroteTrap+ Library- Build-Depends: base, QuickCheck, parsec <= 2.1.0.0, mtl+ Build-Depends: base < 5,+ QuickCheck < 2.9,+ parsec < 3.2,+ mtl < 2.3,+ syb < 0.5 Exposed-Modules: Language.GroteTrap- Language.GroteTrap.Range- Language.GroteTrap.Trees Language.GroteTrap.Language Language.GroteTrap.Lexer- Language.GroteTrap.Unparse+ Language.GroteTrap.Range+ Language.GroteTrap.Show Language.GroteTrap.ShowTree+ Language.GroteTrap.Trees+ Language.GroteTrap.Unparse Language.GroteTrap.Util Other-Modules: Language.GroteTrap.ParseTree Language.GroteTrap.Parser
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2008, Jeroen Leeuwestein and Martijn van Steenbergen+Copyright (c) 2008-2015, Jeroen Leeuwestein and Martijn van Steenbergen All rights reserved. Redistribution and use in source and binary forms, with or without
Language/GroteTrap.hs view
@@ -7,6 +7,7 @@ module Language.GroteTrap.Unparse, module Language.GroteTrap.ShowTree, module Language.GroteTrap.Util,+ module Language.GroteTrap.Show, -- * Parsing and evaluating @@ -26,3 +27,4 @@ import Language.GroteTrap.Unparse import Language.GroteTrap.ShowTree import Language.GroteTrap.Util+import Language.GroteTrap.Show
Language/GroteTrap/Language.hs view
@@ -25,8 +25,8 @@ -- | Language connects the syntax of identifiers, numbers, operators and functions with their semantics. GroteTrap is able to derive a parser and evaluator from a Language, as well as convert between source text selections and tree selections. data Language a = Language- { variable :: String -> a- , number :: Int -> a+ { variable :: Maybe (String -> a)+ , number :: Maybe (Int -> a) , operators :: [Operator a] , functions :: [Function a] }@@ -34,8 +34,8 @@ -- | An empty language. Use this as the starting base of your languages, setting only those fields that are of importance. language :: Language a language = Language- { variable = error "variables are not supported"- , number = error "numbers are not supported"+ { variable = Nothing+ , number = Nothing , operators = [] , functions = [] }
Language/GroteTrap/ParseTree.hs view
@@ -78,8 +78,8 @@ -- | Evaluates a parse tree from a language. evaluate :: Language a -> ParseTree -> a evaluate lang = foldParseTree (ParseTreeAlg eid eint euna ebin elst ecll epar) where- eid _ = variable lang- eint _ = number lang+ eid _ = fromJust $ variable lang+ eint _ = fromJust $ number lang euna _ op = opSem1 $ fromJust $ findOperator op isUnary $ operators lang ebin _ op = opSem2 $ fromJust $ findOperator op isBinary $ operators lang elst _ op = opSemN $ fromJust $ findOperator op isAssoc $ operators lang
+ Language/GroteTrap/Show.hs view
@@ -0,0 +1,49 @@+module Language.GroteTrap.Show (lshow, format) where++import Data.Maybe+import Data.List+import Data.Generics hiding (Prefix)+import Language.GroteTrap.Language+import Language.GroteTrap.Parser++lshow lang = lshow' lang maxBound++lshow' :: Data a => Language a -> Int -> a -> String+lshow' lang contextPrio val =+ if isJust (variable lang) && con == toConstr (fromJust (variable lang) undefined)+ then fromJust $ gfindtype val+ else if isJust (number lang) && con == toConstr (fromJust (number lang) undefined)+ then show $ (fromJust $ gfindtype val :: Int)+ else fromJust $ lookup con [ (toConstr $ opCon op, lshow'Op lang contextPrio op val) | op <- operators lang ]+ where+ con = toConstr val++opCon :: Operator a -> a+opCon (Unary { opSem1 = o }) = o undefined+opCon (Binary { opSem2 = o }) = o undefined undefined+opCon (Assoc { opSemN = o }) = o undefined++gchildren :: (Data a, Typeable b) => a -> [b]+gchildren v = catMaybes $ gmapQ (Nothing `mkQ` Just) v++lshow'Op :: Data a => Language a -> Int -> Operator a -> a -> String+lshow'Op lang contextPrio op val = par $ case (op, gchildren val) of+ (Unary _ Prefix prio tok, [c]) ->+ tok ++ sh prio c+ (Unary _ Postfix prio tok, [c]) ->+ sh prio c ++ tok+ (Binary _ _ prio tok, [lhs, rhs]) ->+ sh prio lhs ++ " " ++ tok ++ " " ++ sh prio rhs+ (Assoc _ prio tok, _) ->+ concat $ intersperse (" " ++ tok ++ " ") $ map (sh prio) (head (gchildren val))+ _ ->+ error "unexpected number of children"+ where+ sh = lshow' lang+ par s+ | opPrio op >= contextPrio = "(" ++ s ++ ")"+ | otherwise = s++-- | Formats a sentence according to a language.+format :: Data a => Language a -> String -> String+format lang = lshow lang . readExpression lang
Language/GroteTrap/Unparse.hs view
@@ -73,7 +73,7 @@ over upper lower = take n $ zipWith f (pad upper) (pad lower) where f ' ' b = b f a _ = a- pad str = str ++ repeat ' '+ pad = (++ repeat ' ') n = length upper `max` length lower -- | Merge folds many strings 'over' each other.
LogicExample.hs view
@@ -1,6 +1,9 @@+{-# OPTIONS -fglasgow-exts #-}+ module LogicExample where import Language.GroteTrap+import Data.Generics hiding (Prefix) import Data.Set hiding (map) @@ -13,7 +16,7 @@ | And [Logic] | Impl Logic Logic | Not Logic- deriving (Show, Eq)+ deriving (Show, Eq, Typeable, Data) type LogicAlg a = ( String -> a@@ -36,7 +39,7 @@ logicLanguage :: Language Logic logicLanguage = language- { variable = Var+ { variable = Just Var , operators = [ Unary Not Prefix 0 "!" , Assoc And 1 "&&"@@ -68,3 +71,4 @@ demo4 = fromError $ follow appie root demo5 = fromError $ follow appie [0] demo6 = range $ fromError $ follow appie [0]+demo7 = lshow logicLanguage (And [Var "p", Var "q"])