123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- {-# LANGUAGE OverloadedStrings #-}
- module Data.SCargot.Language.Basic
- ( -- * Spec
- -- $descr
- basicParser
- , basicPrinter
- ) where
- import Control.Applicative ((<$>))
- import Data.Char (isAlphaNum)
- import Text.Parsec (many1, satisfy)
- import Data.Text (Text, pack)
- import Data.SCargot.Repr.Basic (SExpr)
- import Data.SCargot ( SExprParser
- , SExprPrinter
- , mkParser
- , flatPrint
- )
- isAtomChar :: Char -> Bool
- isAtomChar c = isAlphaNum c
- || c == '-' || c == '*' || c == '/'
- || c == '+' || c == '<' || c == '>'
- || c == '=' || c == '!' || c == '?'
- -- $descr
- -- The 'basicSpec' describes S-expressions whose atoms are simply
- -- text strings that contain alphanumeric characters and a small
- -- set of punctuation. It does no parsing of numbers or other data
- -- types, and will accept tokens that typical Lisp implementations
- -- would find nonsensical (like @77foo@).
- --
- -- Atoms recognized by the 'basicSpec' are any string matching the
- -- regular expression @[A-Za-z0-9+*<>/=!?-]+@.
- -- | A 'SExprParser' that understands atoms to be sequences of
- -- alphanumeric characters as well as the punctuation
- -- characters @[-*/+<>=!?]@, and does no processing of them.
- --
- -- >>> decode basicParser "(1 elephant)"
- -- Right [SCons (SAtom "1") (SCons (SAtom "elephant") SNil)]
- basicParser :: SExprParser Text (SExpr Text)
- basicParser = mkParser pToken
- where pToken = pack <$> many1 (satisfy isAtomChar)
- -- | A 'SExprPrinter' that prints textual atoms directly (without quoting
- -- or any other processing) onto a single line.
- --
- -- >>> encode basicPrinter [L [A "1", A "elephant"]]
- -- "(1 elephant)"
- basicPrinter :: SExprPrinter Text (SExpr Text)
- basicPrinter = flatPrint id
|