module Happy.Frontend where
import Happy.Frontend.AbsSyn
import Happy.Frontend.Parser
import Happy.Frontend.ParseMonad.Class
parseYFileContents :: String -> ParseResult BookendedAbsSyn
parseYFileContents :: String -> ParseResult BookendedAbsSyn
parseYFileContents String
contents = ReaderT (String, Int) ParseResult BookendedAbsSyn
-> String -> Int -> ParseResult BookendedAbsSyn
forall a.
ReaderT (String, Int) ParseResult a
-> String -> Int -> ParseResult a
forall (p :: * -> *) a.
ParseMonad p =>
p a -> String -> Int -> ParseResult a
runFromStartP ReaderT (String, Int) ParseResult BookendedAbsSyn
ourParser String
contents Int
1
data FileType = Y | LY
fileNameAndType :: String -> Maybe (String, FileType)
fileNameAndType :: String -> Maybe (String, FileType)
fileNameAndType = String -> Maybe (String, FileType)
nameType (String -> Maybe (String, FileType))
-> (String -> String) -> String -> Maybe (String, FileType)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse where
nameType :: String -> Maybe (String, FileType)
nameType (Char
'y':Char
'.':String
f) = (String, FileType) -> Maybe (String, FileType)
forall a. a -> Maybe a
Just (String -> String
forall a. [a] -> [a]
reverse String
f, FileType
Y)
nameType (Char
'y':Char
'l':Char
'.':String
f) = (String, FileType) -> Maybe (String, FileType)
forall a. a -> Maybe a
Just (String -> String
forall a. [a] -> [a]
reverse String
f, FileType
LY)
nameType String
_ = Maybe (String, FileType)
forall a. Maybe a
Nothing
deLitify :: String -> String
deLitify :: String -> String
deLitify = String -> String
deLit where
deLit :: String -> String
deLit (Char
'>':Char
' ':String
r) = String -> String
deLit1 String
r
deLit (Char
'>':Char
'\t':String
r) = Char
'\t' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
deLit1 String
r
deLit (Char
'>':Char
'\n':String
r) = String -> String
deLit String
r
deLit (Char
'>':String
_) = String -> String
forall a. HasCallStack => String -> a
error String
"Error when de-litify-ing"
deLit (Char
'\n':String
r) = Char
'\n' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
deLit String
r
deLit String
r = String -> String
deLit2 String
r
deLit1 :: String -> String
deLit1 (Char
'\n':String
r) = Char
'\n' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
deLit String
r
deLit1 (Char
c:String
r) = Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
deLit1 String
r
deLit1 [] = []
deLit2 :: String -> String
deLit2 (Char
'\n':String
r) = Char
'\n' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
deLit String
r
deLit2 (Char
_:String
r) = String -> String
deLit2 String
r
deLit2 [] = []