tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
49
Task/S-Expressions/Haskell/s-expressions.hs
Normal file
49
Task/S-Expressions/Haskell/s-expressions.hs
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
import Text.ParserCombinators.Parsec ((<|>), (<?>), many, many1, char, try, parse, sepBy, choice)
|
||||
import Text.ParserCombinators.Parsec.Char (noneOf)
|
||||
import Text.ParserCombinators.Parsec.Token (integer, float, whiteSpace, stringLiteral, makeTokenParser)
|
||||
import Text.ParserCombinators.Parsec.Language (haskellDef)
|
||||
|
||||
|
||||
data Val = Int Integer
|
||||
| Float Double
|
||||
| String String
|
||||
| Symbol String
|
||||
| List [Val] deriving (Eq, Show)
|
||||
|
||||
lexer = makeTokenParser haskellDef
|
||||
|
||||
tInteger = (integer lexer) >>= (return . Int) <?> "integer"
|
||||
|
||||
tFloat = (float lexer) >>= (return . Float) <?> "floating point number"
|
||||
|
||||
tString = (stringLiteral lexer) >>= (return . String) <?> "string"
|
||||
|
||||
tSymbol = (many1 $ noneOf "()\" \t\n\r") >>= (return . Symbol) <?> "symbol"
|
||||
|
||||
tAtom = choice [try tFloat, try tInteger, tSymbol, tString] <?> "atomic expression"
|
||||
|
||||
tExpr = do
|
||||
whiteSpace lexer
|
||||
expr <- tList <|> tAtom
|
||||
whiteSpace lexer
|
||||
return expr
|
||||
<?> "expression"
|
||||
|
||||
tList = do
|
||||
char '('
|
||||
list <- many tExpr
|
||||
char ')'
|
||||
return $ List list
|
||||
<?> "list"
|
||||
|
||||
tProg = many tExpr <?> "program"
|
||||
|
||||
p ex = case parse tProg "" ex of
|
||||
Right x -> putStrLn $ unwords $ map show x
|
||||
Left err -> print err
|
||||
|
||||
main = do
|
||||
let expr = "((data \"quoted data\" 123 4.5)\n (data (!@# (4.5) \"(more\" \"data)\")))"
|
||||
putStrLn $ "The input:\n" ++ expr ++ "\n"
|
||||
putStr "Parsed as:\n"
|
||||
p expr
|
||||
Loading…
Add table
Add a link
Reference in a new issue