diff --git a/lvtc/src/Expression.hs b/lvtc/src/Expression.hs index aedd839..427a103 100644 --- a/lvtc/src/Expression.hs +++ b/lvtc/src/Expression.hs @@ -6,9 +6,10 @@ -} module Expression ( - Expression (..), - parseExpresion, - ) where + Expression (..), + parseExpresion, + parseAllExpression, +) where import Parser import Control.Applicative @@ -38,3 +39,8 @@ parseComment = Comment <$> ((++) <$> parseString "//" <*> parseAllCharUntil "\n" parseExpresion :: Parser Expression parseExpresion = parseAlias <|> parseFunction <|> parseComment + +parseAllExpression :: Parser [Expression] +parseAllExpression = some p + where + p = parseExpresion <* many (parseAnyChar "\n") diff --git a/lvtc/src/ParseUtil.hs b/lvtc/src/ParseUtil.hs index cb71290..ce43a45 100644 --- a/lvtc/src/ParseUtil.hs +++ b/lvtc/src/ParseUtil.hs @@ -6,17 +6,17 @@ -} module ParseUtil ( - parseChar, - parseAnyChar, - parseUInt, - parseSign, - parseInt, - parseString, - parseBetween, - parseAfter, - parseBefore, - parseAllCharUntil, - ) where + parseChar, + parseAnyChar, + parseUInt, + parseSign, + parseInt, + parseString, + parseBetween, + parseAfter, + parseBefore, + parseAllCharUntil, +) where import Parser import Data.Int (Int32) diff --git a/lvtc/src/Parser.hs b/lvtc/src/Parser.hs index 77420e0..5bf4bde 100644 --- a/lvtc/src/Parser.hs +++ b/lvtc/src/Parser.hs @@ -6,8 +6,8 @@ -} module Parser ( - Parser (..), - ) where + Parser (..), +) where import Control.Applicative diff --git a/lvtc/test/Spec.hs b/lvtc/test/Spec.hs index 0a62b11..5782ad9 100644 --- a/lvtc/test/Spec.hs +++ b/lvtc/test/Spec.hs @@ -15,17 +15,21 @@ main :: IO () main = defaultMain tests tests :: TestTree -tests = testGroup "Leviator Tests - Compiler" [ utParserExpression ] +tests = testGroup "Leviator Tests - Compiler" + [ + utParserExpression, + utParserExpressions + ] testParserHelper :: String -> String -> Expression -> IO () testParserHelper str restExpected expressionExpected = - case runParser (parseExpresion) str of - Just (parsed, rest) -> assertEqual str restExpected rest >>= - (\_ -> assertEqual str expressionExpected parsed) + case runParser parseExpresion str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed Nothing -> assertFailure ("Parsing failed: " ++ str) testParserHelperFail :: String -> IO () -testParserHelperFail str = case runParser (parseExpresion) str of +testParserHelperFail str = case runParser parseExpresion str of Just _ -> assertFailure ("Parsing should have failed: " ++ str) Nothing -> assertEqual str "" "" @@ -87,3 +91,50 @@ utParserExpression = testGroup "Parse Expression" testParserHelperFail "export abc()" ] + + +testParserHelpers :: String -> String -> [Expression] -> IO () +testParserHelpers str restExpected expressionExpected = + case runParser parseAllExpression str of + Just (parsed, rest) -> assertEqual str restExpected rest >> + assertEqual str expressionExpected parsed + Nothing -> assertFailure ("Parsing failed: " ++ str) + +testParserHelperFails :: String -> IO () +testParserHelperFails str = case runParser parseAllExpression str of + Just (x, _) -> assertFailure ("Parsing should have failed: `" ++ str ++ "` But got: `" ++ show x ++ "`") + Nothing -> assertEqual str "" "" + +utParserExpressions :: TestTree +utParserExpressions = testGroup "Parse Expressions" + [ +-- function + testCase "function main" $ + testParserHelpers + "fn main() -> Int \n{\n <- 0;\n};\nexport fn main() -> Int \n{\n <- 0;\n};\n" + "" + [Function "fn main() -> Int \n{\n <- 0;\n};\n", Function "export fn main() -> Int \n{\n <- 0;\n};\n"] + , testCase "function bad formated (no end `}`)" $ + testParserHelperFails + "fn main() -> Int \n{\n <- 0;\n};\nfn main() -> Int \n{\n <- 0;\n" + , testCase "function bad formated (no end `;`)" $ + testParserHelperFails + "fn main() -> Int \n{\n <- 0;\n}\nfn main() -> Int \n{\n <- 0;\n};\n" +-- alias + , testCase "alias" $ + testParserHelpers + "alias abc def;\nalias def def;\n" + "" + [Alias "alias abc def;\n", Alias "alias def def;\n"] + , testCase "alias multiline" $ + testParserHelpers + "alias abc def\nefg hij;\n" + "" + [Alias "alias abc def\nefg hij;\n"] +-- comment + , testCase "comment" $ + testParserHelpers + "// this is a comment\nalias abc def;\n" + "" + [Comment "// this is a comment\n", Alias "alias abc def;\n"] + ]