From c1b7f370daece2016a325d9439275140c6325874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Nowak?= Date: Thu, 30 Oct 2014 16:36:55 +0100 Subject: [PATCH] Add proper parsing of applications (using a bifold!). --- Main.hs | 13 +++++++++---- syntax-example.cabal | 4 ++-- test.txt | 2 ++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Main.hs b/Main.hs index 6b2ed72..b014e4d 100644 --- a/Main.hs +++ b/Main.hs @@ -3,6 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} import Control.Applicative +import Control.Lens.SemiIso import Control.Lens.TH import qualified Data.Attoparsec.Text as AP import Data.Char @@ -11,6 +12,7 @@ import Data.Syntax (Syntax) import qualified Data.Syntax as S import qualified Data.Syntax.Attoparsec.Text as S import qualified Data.Syntax.Char as S +import qualified Data.Syntax.Combinator as S import qualified Data.Syntax.Pretty as S import Data.Text (Text) import qualified Data.Text.IO as T @@ -37,14 +39,17 @@ atom :: Syntax syn Text => syn AST atom = _Var /$/ name /|/ parens expr +-- | Parsers a list of applications. +apps :: Syntax syn Text => syn AST +apps = bifoldl1 (attemptAp_ _App) /$/ S.sepBy1 atom S.spaces1 + -- | An expression of our lambda calculus. expr :: Syntax syn Text => syn AST -expr = _App /$/ atom /* S.spaces1 /*/ atom - /|/ _Abs /$/ S.char '\\' /* S.spaces_ +expr = _Abs /$/ S.char '\\' /* S.spaces_ */ name /* S.spaces /* S.string "->" /* S.spaces - /*/ expr - /|/ atom + /*/ expr + /|/ apps main :: IO () main = do diff --git a/syntax-example.cabal b/syntax-example.cabal index edbe482..122f966 100644 --- a/syntax-example.cabal +++ b/syntax-example.cabal @@ -16,7 +16,7 @@ source-repository head executable syntax-example main-is: Main.hs - build-depends: base >= 4 && < 5, lens, semi-iso, - syntax, syntax-attoparsec, syntax-pretty, + build-depends: base >= 4 && < 5, lens, semi-iso >= 0.3, + syntax >= 0.1.1, syntax-attoparsec, syntax-pretty, attoparsec, pretty, text default-language: Haskell2010 diff --git a/test.txt b/test.txt index 7cf178a..8014942 100644 --- a/test.txt +++ b/test.txt @@ -3,3 +3,5 @@ -> f (x x)) (\x -> f (x x) ) +(\x -> x) +(\y -> y y)