module Parser (
parse,
)
where
import AST
parse' :: String -> Either String (AST, String)
parse' :: String -> Either String (AST, String)
parse' [] = (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right ([], [])
parse' (Char
']' : String
resto) = (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right ([], Char
']' Char -> String -> String
forall a. a -> [a] -> [a]
: String
resto)
parse' (Char
'[' : String
resto) =
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astLoop, String
restoFora) ->
case String
restoFora of
[] -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
"Erro: loop '[' nao foi fechado!"
(Char
']' : String
restoDepoisDoLoop) ->
case String -> Either String (AST, String)
parse' String
restoDepoisDoLoop of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astFinal, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (AST -> Cmd
Loop AST
astLoop Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astFinal, String
strFinal)
String
_ -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
"Erro de sintaxe: ']' esperado para fechar o loop."
parse' (Char
c : String
resto) =
case Char
c of
Char
'+' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Incr Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
'-' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Decr Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
'>' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Next Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
'<' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Prev Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
'.' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Print Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
',' ->
case String -> Either String (AST, String)
parse' String
resto of
Left String
err -> String -> Either String (AST, String)
forall a b. a -> Either a b
Left String
err
Right (AST
astResto, String
strFinal) -> (AST, String) -> Either String (AST, String)
forall a b. b -> Either a b
Right (Cmd
Input Cmd -> AST -> AST
forall a. a -> [a] -> [a]
: AST
astResto, String
strFinal)
Char
_ -> String -> Either String (AST, String)
parse' String
resto
parse :: String -> Either String AST
parse :: String -> Either String AST
parse String
input =
case String -> Either String (AST, String)
parse' String
input of
Left String
err -> String -> Either String AST
forall a b. a -> Either a b
Left String
err
Right (AST
ast, String
resto) ->
if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
resto
then
AST -> Either String AST
forall a b. b -> Either a b
Right AST
ast
else
String -> Either String AST
forall a b. a -> Either a b
Left String
"Erro de Sintaxe"