syntax-example 0.4.0.0 → 1.0.0.0
raw patch · 2 files changed
+25/−22 lines, 2 filesdep ~semi-isodep ~syntaxdep ~syntax-attoparsec
Dependency ranges changed: semi-iso, syntax, syntax-attoparsec, syntax-printer
Files
- Main.hs +20/−17
- syntax-example.cabal +5/−5
Main.hs view
@@ -1,19 +1,22 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} import Control.Applicative+import Control.Category.Structures import Control.Lens.Cons import Control.Lens.SemiIso import Control.Lens.TH+import Control.SIArrow import qualified Data.Attoparsec.Text.Lazy as AP import Data.Char import Data.Scientific (Scientific)-import Data.SemiIsoFunctor-import Data.Syntax (Syntax)+import Data.Syntax (Seq) import qualified Data.Syntax as S import qualified Data.Syntax.Attoparsec.Text.Lazy as S-import Data.Syntax.Char (SyntaxChar)+import Data.Syntax.Char (SyntaxChar, SyntaxText) import qualified Data.Syntax.Char as S import qualified Data.Syntax.Combinator as S import qualified Data.Syntax.Printer.Text as S@@ -39,30 +42,30 @@ $(makePrisms ''AST) -- | A variable name.-name :: Syntax syn Text => syn Text+name :: SyntaxText syn => syn () Text name = _Cons /$/ S.satisfy isAlpha /*/ S.takeWhile isAlphaNum -- | A quoted string.-quoted :: SyntaxChar syn seq => syn seq+quoted :: SyntaxChar syn => syn () (Seq syn) quoted = S.char '"' */ S.takeTill (=='"') /* S.char '"' -- | Encloses a symbol in parentheses.-parens :: SyntaxChar syn seq => syn a -> syn a+parens :: SyntaxChar syn => syn () a -> syn () a parens m = S.char '(' */ S.spaces_ */ m /* S.spaces_ /* S.char ')' -- | A literal.-literal :: SyntaxChar syn Text => syn Literal+literal :: SyntaxText syn => syn () Literal literal = _LitNum /$/ S.scientific- /|/ _LitStr /$/ quoted+ /+/ _LitStr /$/ quoted -- | An atom is a variable, literal or an expression in parentheses.-atom :: SyntaxChar syn Text => syn AST+atom :: SyntaxText syn => syn () AST atom = _Lit /$/ literal- /|/ _Var /$/ name- /|/ parens expr+ /+/ _Var /$/ name+ /+/ parens expr -- | Parses a list of atoms and folds them with the _App prism.-apps :: SyntaxChar syn Text => syn AST+apps :: SyntaxText syn => syn () AST apps = bifoldl1 _App /$/ S.sepBy1 atom S.spaces1 -- | An expression of our lambda calculus.@@ -70,20 +73,20 @@ -- Thanks to 'tuple-morph' we don't have to worry about /* and */ here. -- Tuples are reassociated and units are removed by the 'morphed' -- isomorphism (applied in /$~ operator).-expr :: SyntaxChar syn Text => syn AST+expr :: SyntaxText syn => syn () AST expr = _Abs /$~ S.char '\\' /*/ S.spaces_ /*/ name /*/ S.spaces /*/ S.string "->" /*/ S.spaces /*/ expr - /|/ _Let /$~ S.string "let" /*/ S.spaces1+ /+/ _Let /$~ S.string "let" /*/ S.spaces1 /*/ name /*/ S.spaces /*/ S.char '=' /*/ S.spaces /*/ expr /*/ S.spaces1 /*/ S.string "in" /*/ S.spaces1 /*/ expr - /|/ apps+ /+/ apps main :: IO () main = do@@ -91,7 +94,7 @@ t <- T.getContents -- Try to parse it.- case AP.parse (S.getParser expr <* AP.skipSpace <* AP.endOfInput) t of+ case AP.parse (S.getParser_ expr <* AP.skipSpace <* AP.endOfInput) t of AP.Fail _ _ err -> putStrLn err AP.Done _ ast -> do -- If parsing succeeded print the AST.@@ -99,7 +102,7 @@ -- Try to pretty print it. -- (Printing cannot really fail in this example)- case S.runPrinter expr ast of+ case S.runPrinter_ expr ast of Left err -> putStrLn err Right bld -> T.putStrLn (T.toLazyText bld)
syntax-example.cabal view
@@ -1,18 +1,18 @@ name: syntax-example-version: 0.4.0.0+version: 1.0.0.0 synopsis: Example application using syntax, a library for abstract syntax descriptions. description: Example application using syntax, a library for abstract syntax descriptions. . The code: .- * <https://github.com/Pawel834/syntax-example/blob/master/Main.hs Main.hs>+ * <https://github.com/Pawel834/syntax-example/blob/83c283823749038db3d21aaf99105f456e25bac7/Main.hs Main.hs> . Example input: . > (\f-> > (\x- > -> f ((x) x)) (\x + > -> f ((x) x)) (\x > -> f (x x) > ) > (\x -> "test")@@ -38,7 +38,7 @@ executable syntax-example main-is: Main.hs- build-depends: base >= 4 && < 5, lens, semi-iso >= 0.4,- syntax >= 0.2, syntax-attoparsec >= 0.2, syntax-printer,+ build-depends: base >= 4 && < 5, lens, semi-iso >= 1,+ syntax >= 1, syntax-attoparsec >= 1, syntax-printer >= 1, attoparsec, text, scientific >= 0.3 default-language: Haskell2010