From dacd3182df29bf57628fcca78a64c25d1b90817d Mon Sep 17 00:00:00 2001 From: Jacek Olczyk Date: Sun, 17 Mar 2019 16:17:42 +0100 Subject: [PATCH] Implement a basic expression parser and add some unit tests. --- .gitignore | 4 + ChangeLog.md | 3 + Contua.iml | 56 ++++++++++++++ LICENSE | 30 ++++++++ README.md | 1 + Setup.hs | 2 + app/Main.hs | 6 ++ examples/test.cont | 1 + lang_overview/lang_overview.pdf | Bin 0 -> 80930 bytes lang_overview/lang_overview.tex | 124 ++++++++++++++++++++++++++++++ package.yaml | 54 +++++++++++++ src/Parser/Expr.hs | 130 ++++++++++++++++++++++++++++++++ src/Parser/Parser.hs | 36 +++++++++ src/Parser/TypeDecls.hs | 17 +++++ src/Parser/TypeDefs.hs | 24 ++++++ src/Parser/Utils.hs | 30 ++++++++ stack.yaml | 64 ++++++++++++++++ test/Spec.hs | 81 ++++++++++++++++++++ 18 files changed, 663 insertions(+) create mode 100644 .gitignore create mode 100644 ChangeLog.md create mode 100644 Contua.iml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Setup.hs create mode 100644 app/Main.hs create mode 100644 examples/test.cont create mode 100644 lang_overview/lang_overview.pdf create mode 100644 lang_overview/lang_overview.tex create mode 100644 package.yaml create mode 100644 src/Parser/Expr.hs create mode 100644 src/Parser/Parser.hs create mode 100644 src/Parser/TypeDecls.hs create mode 100644 src/Parser/TypeDefs.hs create mode 100644 src/Parser/Utils.hs create mode 100644 stack.yaml create mode 100644 test/Spec.hs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e6925c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.stack-work/ +Contua.cabal +*~ +.idea \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..52b2082 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,3 @@ +# Changelog for Contua + +## Unreleased changes diff --git a/Contua.iml b/Contua.iml new file mode 100644 index 0000000..779f445 --- /dev/null +++ b/Contua.iml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..102126f --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright Author name here (c) 2019 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Author name here nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..5fa4c06 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# Contua diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..81ff9de --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,6 @@ +module Main where + +import Parser.Parser + +main :: IO () +main = putStrLn "Not done yet!" diff --git a/examples/test.cont b/examples/test.cont new file mode 100644 index 0000000..f4f0edd --- /dev/null +++ b/examples/test.cont @@ -0,0 +1 @@ +type :: a = [2, 1, 3, 7] \ No newline at end of file diff --git a/lang_overview/lang_overview.pdf b/lang_overview/lang_overview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3949f446205cc4077f013ede4f7dff227089c2bb GIT binary patch literal 80930 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 z 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', \color{ForestGreen}type \color{black} \}) | "(", \color{ForestGreen}type\color{black}, ")"}\\ +% basicType +\texttt{\color{CadetBlue}basicType} =\ & \texttt{\color{RubineRed}typeCtor \color{black}| id | "[", id, "]"}\\ +% typeCtor +\texttt{\color{RubineRed}typeCtor\color{black}} =\ & \texttt{ID, \{ \color{ForestGreen}type \color{black} \}}\\ +% function +% \texttt{\color{brown}function\color{black}} =\ & \texttt{}\\ +% expr +\texttt{\color{RoyalPurple}expr\color{black}} =\ & \texttt{ + % variables + id + % type ctors + | ID + % + + | \color{RoyalPurple}expr\color{black}, "+", \color{RoyalPurple}expr \color{black} + % - + | \color{RoyalPurple}expr\color{black}, "-", \color{RoyalPurple}expr \color{black} + % * + | \color{RoyalPurple}expr\color{black}, "*", \color{RoyalPurple}expr \color{black} + % - unary + | "-", \color{RoyalPurple}expr \color{black} +|}\\ +&\texttt{ + % () + | "(", \color{RoyalPurple}expr\color{black}, ")" + % application + | \color{RoyalPurple}expr\color{black}, \color{RoyalPurple}expr \color{black} + % lambda + | \color{blue}'fn'\color{black}, \{ id \}, ".", \color{RoyalPurple}expr \color{black} + % listExpr + | \color{RawSienna}listExpr \color{black} +|}\\ +&\texttt{ + % where + | \color{RoyalPurple}expr\color{black}, \color{blue}'where'\color{black}, \color{red} funDecl\color{black}, \{ \color{blue}'and'\color{black}, \color{red}funDecl \color{black} \} + % let in + | \color{blue}'let'\color{black}, \color{red}funDecl\color{black}, \color{blue}'in'\color{black}, \color{RoyalPurple}expr \color{black} +|}\\ +&\texttt{ + % match + | \color{blue}'match'\color{black}, \color{RoyalPurple}expr\color{black}, \color{blue}'with'\color{black}, \{ "|", \color{RoyalPurple}expr\color{black}, '=>', \color{RoyalPurple}expr \color{black} \} +|}\\ +&\texttt{ + % if then else + | \color{blue}'if'\color{black}, \color{Goldenrod}bexpr\color{black}, \color{blue}'then'\color{black}, \color{RoyalPurple}expr\color{black}, \color{blue}'else'\color{black}, \color{RoyalPurple}expr\color{black} +}\\ +% bexpr +\texttt{\color{Goldenrod}bexpr\color{black}} =\ &\texttt{ + % boolean variable + id + % conjunction + | \color{Goldenrod}bexpr\color{black}, \color{blue}'and'\color{black}, \color{Goldenrod}bexpr \color{black} + % disjunction + | \color{Goldenrod}bexpr\color{black}, \color{blue} 'or'\color{black}, \color{Goldenrod}bexpr \color{black} + % negation + | \color{blue} 'or'\color{black}, \color{Goldenrod}bexpr \color{black} + % less + | \color{RoyalPurple}expr\color{black}, '<=', \color{RoyalPurple}expr\color{black} +}\\ +% listExpr +\texttt{\color{RawSienna}listExpr\color{black}} =\ &\texttt{ + % list literal + [\color{RoyalPurple}expr\color{black}, \{",", \color{RoyalPurple}expr \color{black}\}] + % head/tail + | \color{RoyalPurple} expr\color{black}, ":", \color{RawSienna}listExpr \color{black} + % concatenation + | \color{RawSienna}listExpr\color{black}, "++", \color{RawSienna}listExpr \color{black} +} +\end{align*} +\section{Forcing continuation style} +\end{document} \ No newline at end of file diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..c63edc9 --- /dev/null +++ b/package.yaml @@ -0,0 +1,54 @@ +name: Contua +version: 0.1.0.0 +github: "Joald/Contua" +license: BSD3 +author: "Jacek Olczyk" +maintainer: "jacek.olczyk98@gmail.com" +copyright: "2019 Jacek Olczyk" + +extra-source-files: +- README.md +- ChangeLog.md + +# Metadata used when publishing your package +# synopsis: Short description of your package +# category: Web + +# To avoid duplicated efforts in documentation and dealing with the +# complications of embedding Haddock markup inside cabal files, it is +# common to point users to the README.md file. +description: Please see the README on GitHub at + +dependencies: +- base >= 4.7 && < 5 +- megaparsec >= 7 +- mtl +- text +- parser-combinators +- hspec >= 2.6.1 +- hspec-megaparsec + +library: + source-dirs: src + +executables: + Contua-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - Contua + +tests: + Contua-test: + main: Spec.hs + source-dirs: test + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - Contua diff --git a/src/Parser/Expr.hs b/src/Parser/Expr.hs new file mode 100644 index 0000000..e1ebc58 --- /dev/null +++ b/src/Parser/Expr.hs @@ -0,0 +1,130 @@ +module Parser.Expr where + +import Control.Monad +import Control.Monad.Combinators.Expr +import Text.Megaparsec +import qualified Text.Megaparsec.Char.Lexer as L + +import Parser.TypeDefs +import Parser.Utils +import Parser.TypeDecls +import Data.List.NonEmpty (fromList) + +funDecl :: Parser FunDecl +funDecl = do + fnType <- type_ + void (symbol "::") + name <- identifier + args <- many identifier + void (symbol "=") + e <- expr + void (symbol ";") + return $ FunDecl fnType name args e + + +lambda :: Parser Expr +lambda = do + void (symbol "fn") + ids <- many identifier + void (symbol ".") + ELambda ids <$> expr + +matchExpr :: Parser Expr +matchExpr = do + void (symbol "match") + em <- expr + void (symbol "in") + pats <- many $ do + void (symbol "|") + expr + return $ EMatch em pats + +whereExpr :: Parser Expr +whereExpr = do + ep <- expr + void (symbol "where") + fs <- many funDecl + return $ EWhere ep (fromList fs) + +listExpr :: Parser List +listExpr = choice + [ LVar <$> identifier + , brackets listLiteral + , listCons + , listConcat + ] + +listLiteral :: Parser List +listLiteral = do + e <- expr + rest <- many (symbol "," >> expr) + return . LLiteral $ e : rest + + +listCons :: Parser List +listCons = do + e <- expr + void (symbol ":") + LCons e <$> listExpr + +listConcat :: Parser List +listConcat = do + l <- listExpr + ls <- symbol "++" >> (listExpr <|> listConcat) + return $ LConcat l ls + + +letExpr :: Parser Expr +letExpr = do + void (symbol "let") + var <- identifier + void (symbol "=") + e1 <- expr + void (symbol "in") + ELet var e1 <$> expr + + + + +application :: Parser Expr +application = do + e1 <- expr + es <- some expr + return $ applicationHelper e1 es + where + applicationHelper e es + | [] <- es = e + | x : xs <- es = applicationHelper (EApply e x) xs + + + +exprTerm :: Parser Expr +exprTerm = choice + [ try (parens expr) + , try (EInt <$> lexeme L.decimal) + , lambda + , try (EVar <$> identifier) -- needs to be last to not parse keywords as ids +-- , matchExpr +-- , whereExpr +-- , letExpr +-- , EList <$> listExpr + ] + +binary :: String -> (Expr -> Expr -> Expr) -> Operator Parser Expr +binary name f = InfixL (f <$ symbol name) + +prefix, postfix :: String -> (Expr -> Expr) -> Operator Parser Expr +prefix name f = Prefix (f <$ symbol name) +postfix name f = Postfix (f <$ symbol name) + +exprOperatorTable :: [[Operator Parser Expr]] +exprOperatorTable = + [ [ binary "" EApply] + , [ prefix "-" ENeg ] + , [ binary "*" EMul ] + , [ binary "+" EAdd + , binary "-" ESub ] + ] + +expr :: Parser Expr +expr = makeExprParser exprTerm exprOperatorTable diff --git a/src/Parser/Parser.hs b/src/Parser/Parser.hs new file mode 100644 index 0000000..b920ceb --- /dev/null +++ b/src/Parser/Parser.hs @@ -0,0 +1,36 @@ +module Parser.Parser + ( parseProgram + , program + ) where + +import Control.Applicative hiding (many, some) +import Control.Monad +import Text.Megaparsec hiding (State) +import Data.List.NonEmpty + + +import Parser.Utils +import Parser.TypeDefs +import Parser.Expr +import Parser.TypeDecls + + +{- | This is the Contua language, the parser part. + Much of it, especially the Utils module has been taken directly from: + https://markkarpov.com/megaparsec/megaparsec.html +-} + +keywords = ["type", "fn", "let", "in", "match", "with", "if", "then", "else", "and", "or", "not"] + + +program :: Parser AST +program = do + types <- many $ try typeDecl + funcs <- some funDecl + return $ AST types funcs + +parseProgram :: String -> IO () +parseProgram = parseTest program + + + diff --git a/src/Parser/TypeDecls.hs b/src/Parser/TypeDecls.hs new file mode 100644 index 0000000..60fd595 --- /dev/null +++ b/src/Parser/TypeDecls.hs @@ -0,0 +1,17 @@ +module Parser.TypeDecls where + +import Control.Monad +import Text.Megaparsec + + +import Parser.TypeDefs +import Parser.Utils +import Text.Megaparsec.Char + +type_ :: Parser Type +type_ = do + void (symbol "type") + return TInt + +typeDecl :: Parser TypeDecl +typeDecl = (\x -> TypeDecl x [] TInt) <$> symbol "xd" diff --git a/src/Parser/TypeDefs.hs b/src/Parser/TypeDefs.hs new file mode 100644 index 0000000..5395e6b --- /dev/null +++ b/src/Parser/TypeDefs.hs @@ -0,0 +1,24 @@ +module Parser.TypeDefs where + +import Data.List.NonEmpty + +data AST = AST [TypeDecl] [FunDecl] deriving (Show, Eq) + +data FunDecl = FunDecl Type Name [Name] Expr deriving (Show, Eq) + +data TypeDecl = TypeDecl TypeName [Name] Type deriving (Show, Eq) + +data Type = TInt | TBool | TFun [Type] | TAbstract Name deriving (Show, Eq) + +type Name = String + +type TypeName = String + +data Expr = EVar Name | EInt Int | ETypeName TypeName | EAdd Expr Expr | ENeg Expr + | ESub Expr Expr | EMul Expr Expr | EParen Expr | EApply Expr Expr | ELambda [Name] Expr + | EList List | EWhere Expr (NonEmpty FunDecl) | EIf BExpr Expr Expr | EMatch Expr [Expr] + | ELet Name Expr Expr deriving (Show, Eq) + +data BExpr = BVal Name | BAnd BExpr BExpr | BOr BExpr BExpr | BNot BExpr | BLeq Expr Expr deriving (Show, Eq) + +data List = LVar Name | LLiteral [Expr] | LCons Expr List | LConcat List List deriving (Show, Eq) diff --git a/src/Parser/Utils.hs b/src/Parser/Utils.hs new file mode 100644 index 0000000..7da4763 --- /dev/null +++ b/src/Parser/Utils.hs @@ -0,0 +1,30 @@ +module Parser.Utils where + +import Data.Void +import Text.Megaparsec hiding (State) +import qualified Text.Megaparsec.Char.Lexer as L +import Text.Megaparsec.Char + +type Parser = Parsec Void String + +sc :: Parser () +sc = L.space + space1 + (L.skipLineComment "#") + (L.skipBlockComment "#{" "}#") + +lexeme :: Parser a -> Parser a +lexeme = L.lexeme sc + +symbol :: String -> Parser String +symbol = L.symbol sc + +parens :: Parser a -> Parser a +parens = between (symbol "(") (symbol ")") + +brackets :: Parser a -> Parser a +brackets = between (symbol "[") (symbol "]") + +identifier :: Parser String +identifier = lexeme ((:) <$> lowerChar <*> many alphaNumChar "identifier") + diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..8f0da1b --- /dev/null +++ b/stack.yaml @@ -0,0 +1,64 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: lts-13.11 + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# - location: +# git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver +# using the same syntax as the packages field. +# (e.g., acme-missiles-0.3) +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=1.9" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/test/Spec.hs b/test/Spec.hs new file mode 100644 index 0000000..8c3d29e --- /dev/null +++ b/test/Spec.hs @@ -0,0 +1,81 @@ +import Control.Exception +import Test.Hspec +import Test.Hspec.Megaparsec + +import Parser.Utils +import Parser.TypeDefs +import Parser.Parser +import Control.Monad +import Text.Megaparsec (runParser, parse) + + +main :: IO () +main = + hspec $ + describe "Parser" $ do + describe "arithmetic parser" $ do + it "parses integer literals" $ do + parse program "" "type :: a =3;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 3)] + parse program "" "type :: a =31234;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 31234)] + parse program "" "type :: a= 145674653;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 145674653)] + parse program "" "type ::a = 1234112343423413;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 1234112343423413)] + parse program "" "type:: a = 123412343;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 123412343)] + parse program "" "type :: a = 31234153423451243;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 31234153423451243)] + parse program "" "type::a=8567643737876983;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 8567643737876983)] + parse program "" "type::a=00000002137;" `shouldParse` AST [] [FunDecl TInt "a" [] (EInt 2137)] + it "parses addition" $ do + parse program "" "type :: a=aAaAaAaA+bBbBbBbB;" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EVar "aAaAaAaA") (EVar "bBbBbBbB"))] + parse program "" "type :: a=123412341243+aadfawevxz4231313245;" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EInt 123412341243) (EVar "aadfawevxz4231313245"))] + parse program "" "type :: a=31423+a12341234;" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EInt 31423) (EVar "a12341234"))] + parse program "" "type :: a=0039679887+a0000000kkkk;" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EInt 39679887) (EVar "a0000000kkkk"))] + parse program "" "type :: a=0+0+3+9+67+a+0+k+k+k+k;" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EAdd (EAdd (EAdd (EAdd (EAdd (EAdd (EAdd (EAdd (EAdd (EInt 0) (EInt 0)) (EInt 3)) (EInt 9)) (EInt 67)) (EVar "a")) (EInt 0)) (EVar "k")) (EVar "k")) (EVar "k")) (EVar "k")) ] + parse program "" "type :: a=2137+(-a0000000kkkk);" `shouldParse` AST [] [FunDecl TInt "a" [] (EAdd (EInt 2137) (ENeg(EVar "a0000000kkkk")))] + it "parses subtraction" $ + parse program "" "type :: a=3-a;" `shouldParse` AST [] [FunDecl TInt "a" [] (ESub (EInt 3) (EVar "a"))] + it "parses multiplication" $ + parse program "" "type :: a=3*a;" `shouldParse` AST [] [FunDecl TInt "a" [] (EMul (EInt 3) (EVar "a"))] + it "parses complex arithmetic expressions" $ + parse program "" "type :: a = ((b + 1) * 3);" `shouldParse` AST [] [FunDecl TInt "a" [] (EMul (EAdd (EVar "b") (EInt 1)) (EInt 3))] + describe "function application parser" $ do + it "parses simple expression application" $ do + parse program "" "type::a=a b;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EVar "a") (EVar "b")] + parse program "" "type::a=a 1;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EVar "a") (EInt 1)] + parse program "" "type::a=3 1;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EInt 3) (EInt 1)] + parse program "" "type::a=1234 1;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EInt 1234) (EInt 1)] + parse program "" "type::a=a a12341;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EVar "a") (EVar "a12341")] + it "parser complex application" $ do + parse program "" "type::a= f g h;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EApply (EVar "f") (EVar "g")) (EVar "h")] + parse program "" "type::a= a b c d e f g h;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EApply (EApply (EApply (EApply (EApply (EApply (EVar "a") (EVar "b")) (EVar "c")) (EVar "d")) (EVar "e")) (EVar "f")) (EVar "g")) (EVar "h")] + parse program "" "type::a= f (2137 + g) h;" `shouldParse` AST [] [FunDecl TInt "a" [] $ EApply (EApply (EVar "f") (EAdd (EInt 2137) (EVar "g"))) (EVar "h")] + + +{- + +data Test a = Assert String a | ExpectError String + + +parserTests :: [Test AST] +parserTests = + [ Assert "type :: a =3;" (AST [] [FunDecl TInt "a" [] (EInt 3)]) + , Assert "type :: a = 3+ a;" (AST [] [FunDecl TInt "a" [] (EAdd (EInt 3) (EVar "a"))]) + , Assert "type :: a = ((b + 1) * 3) 2137;" (AST [] [FunDecl TInt "a" [] (EApply (EMul (EAdd (EVar "b") (EInt 1)) (EInt 3)) (EInt 2137))]) + , Assert "type :: a = fn x y . y x;" (AST [] [FunDecl TInt "a" [] (ELambda ["x","y"] (EApply (EVar "y") (EVar "x")))]) + , ExpectError "type :: " + , ExpectError "type :: a" + , ExpectError "type :: a =" + , ExpectError "type :: a =;" + ] + +runTest :: (Eq a, Show a) => Parser a -> Test a -> IO () +runTest p (Assert str x) = either print verify (runParser p "Test" str) + where + verify res = + if res == x + then return () + else putStrLn $ "Error when parsing \"" ++ str ++ "\": expected " ++ show x ++ ", got " ++ show res +runTest p (ExpectError str) = either (const $ return ()) (putStrLn . ("Expected an error, got: " ++) . show) (runParser p "Test" str) + + +runTests :: (Eq a, Show a) => Parser a -> [Test a] -> IO () +runTests parser suite = putStrLn "\nStarting tests..." >> mapM_ (runTest parser) suite +-} \ No newline at end of file