From 6a1e2039778b083d1c665bb9fa6baa8f5455be4b Mon Sep 17 00:00:00 2001 From: Anton Kesy Date: Wed, 6 Mar 2024 18:24:46 +0100 Subject: [PATCH] fix variable and assigment not working together --- app/Main.hs | 1 - peter.cabal | 1 + src/Parser/Statement.hs | 4 +- test/Spec.hs | 2 + test/Unit/Parser/Program.hs | 86 +++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 test/Unit/Parser/Program.hs diff --git a/app/Main.hs b/app/Main.hs index 24cea76..b60e2a8 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -6,7 +6,6 @@ import Text.Parsec (parse) developProgram :: String developProgram = - -- "int i = 1; int j = 2; int l = 3 + 4; int k = i + j + l;" "int i = 1; int j = 2; int l = 3 + 4; int k = i + j + l; k = k * 0;" main :: IO () diff --git a/peter.cabal b/peter.cabal index fb5b3c8..c4248c2 100644 --- a/peter.cabal +++ b/peter.cabal @@ -75,6 +75,7 @@ test-suite peter-test Unit.Parser.Assignment Unit.Parser.Comment Unit.Parser.Expression + Unit.Parser.Program Unit.Parser.Statement Paths_peter hs-source-dirs: diff --git a/src/Parser/Statement.hs b/src/Parser/Statement.hs index cda6fac..79fc1c9 100644 --- a/src/Parser/Statement.hs +++ b/src/Parser/Statement.hs @@ -11,8 +11,8 @@ import Text.Parsec.String parseStatement :: Parser Statement parseStatement = - ( (VariableStatement <$> (spaces' *> (try parseVariable))) - <|> (AssignmentStatement <$> (spaces' *> (try parseAssignment))) + ( (VariableStatement <$> try (spaces' *> (try parseVariable))) + <|> (AssignmentStatement <$> try (spaces' *> (try parseAssignment))) ) <* endOfStatement diff --git a/test/Spec.hs b/test/Spec.hs index 63dda56..368ecd6 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -3,6 +3,7 @@ import Test.HUnit (Test (TestList), runTestTTAndExit) import Unit.Parser.Assignment import Unit.Parser.Comment import Unit.Parser.Expression +import Unit.Parser.Program import Unit.Parser.Statement main :: IO () @@ -12,6 +13,7 @@ main = ( Unit.Parser.Assignment.allTests ++ Unit.Parser.Comment.allTests ++ Unit.Parser.Expression.allTests + ++ Unit.Parser.Program.allTests ++ Unit.Parser.Statement.allTests ++ E2E.Placeholder.allTests ) diff --git a/test/Unit/Parser/Program.hs b/test/Unit/Parser/Program.hs new file mode 100644 index 0000000..52633c3 --- /dev/null +++ b/test/Unit/Parser/Program.hs @@ -0,0 +1,86 @@ +module Unit.Parser.Program (allTests) where + +import AST +import Data.Either (fromRight, isRight) +import Parser.Program +import Test.HUnit +import Text.Parsec (parse) + +allTests :: [Test] +allTests = + [ TestLabel "simple" testSimple + ] + +emptyProgram :: Program +emptyProgram = Program [] + +testSimple :: Test +testSimple = TestCase $ do + assertEqual + "empty" + True + (isRight (parse parseProgram "" "")) + assertEqual + "Single variable statement" + ( Program + [ VariableStatement + ( Variable + "k" + IntType + ( AtomicExpression (LiteralAtomic (IntLiteral 1)) + ) + ) + ] + ) + (fromRight emptyProgram (parse parseProgram "" "int k = 1;")) + assertEqual + "Multiple variable statements" + ( Program + [ VariableStatement + ( Variable + "k" + IntType + ( AtomicExpression (LiteralAtomic (IntLiteral 1)) + ) + ), + VariableStatement + ( Variable + "j" + IntType + ( AtomicExpression (LiteralAtomic (IntLiteral 2)) + ) + ) + ] + ) + (fromRight emptyProgram (parse parseProgram "" "int k = 1; int j = 2;")) + assertEqual + "Single assignment statement" + ( Program + [ AssignmentStatement + ( Assignment + "k" + ( AtomicExpression (LiteralAtomic (IntLiteral 1)) + ) + ) + ] + ) + (fromRight emptyProgram (parse parseProgram "" "k = 1;")) + assertEqual + "variable statement and assignment statement" + ( Program + [ VariableStatement + ( Variable + "k" + IntType + ( AtomicExpression (LiteralAtomic (IntLiteral 1)) + ) + ), + AssignmentStatement + ( Assignment + "j" + ( AtomicExpression (LiteralAtomic (IntLiteral 2)) + ) + ) + ] + ) + (fromRight emptyProgram (parse parseProgram "" "int k = 1; j = 2;"))