commit e7d47ffc3c6ffedff42848e789cc9562a1953468
parent b14d7b8b2c61646cf0a282e16c40bbb2cca497dc
Author: James Eversole <james@eversole.co>
Date: Thu, 19 Dec 2024 19:53:32 -0600
Additional test cases and bug fixes for subtle issues
Diffstat:
2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/src/Parser.hs b/src/Parser.hs
@@ -20,6 +20,7 @@ data SaplingAST
deriving (Show, Eq, Ord)
parseSapling :: String -> SaplingAST
+parseSapling "" = error "Empty input provided to parseSapling"
parseSapling input = case runParser parseExpression "" (lexSapling input) of
Left err -> error "Failed to parse input"
Right ast -> ast
@@ -122,8 +123,14 @@ parseListLiteral = do
satisfy (== LCloseBracket)
return (SList elements)
+--parseListItem :: Parser SaplingAST
+--parseListItem = parseGroupedItem <|> parseSingleItem
parseListItem :: Parser SaplingAST
-parseListItem = parseGroupedItem <|> parseSingleItem
+parseListItem = choice
+ [ parseGroupedItem -- Handle expressions inside parentheses
+ , parseListLiteral -- Allow nested lists
+ , parseSingleItem -- Handle single tokens like `t` or identifiers
+ ]
parseGroupedItem :: Parser SaplingAST
parseGroupedItem = do
diff --git a/test/Spec.hs b/test/Spec.hs
@@ -5,6 +5,7 @@ import Lexer
import Parser
import Research
+import Control.Exception (evaluate, try, SomeException)
import qualified Data.Map as Map
import Test.Tasty
import Test.Tasty.HUnit
@@ -58,6 +59,27 @@ parserTests = testGroup "Parser Tests"
let input = "t t t"
let expected = TFork TLeaf TLeaf
parseSapling input @?= expected
+
+ , testCase "Parse mixed list literals" $ do
+ -- You must put non-listliterals in parentheses
+ let input = "[t (\"hello\") t]"
+ let expected = SList [TLeaf, SStr "hello", TLeaf]
+ parseSapling input @?= expected
+
+ , testCase "Parse function with applications" $ do
+ let input = "f x = t x"
+ let expected = SFunc "f" ["x"] (SApp TLeaf [SVar "x"])
+ parseSapling input @?= expected
+
+ , testCase "Parse nested lists" $ do
+ let input = "[t [(t t)]]"
+ let expected = SList [TLeaf, SList [TStem TLeaf]]
+ parseSapling input @?= expected
+
+ , testCase "Parse complex parentheses" $ do
+ let input = "t (t t (t t))"
+ let expected = TStem (TFork TLeaf (TStem TLeaf))
+ parseSapling input @?= expected
]
integrationTests :: TestTree
@@ -138,4 +160,3 @@ propertyTests = testGroup "Property Tests"
Left _ -> property True
Right ast -> parseSapling input === ast
]
-