module Preprocess (preprocess) where import Pos import Parse import System.Environment import LexerPappy preprocess :: String -> Maybe String preprocess src = do (is, ws) <- lexwords src return $ is ++ wordsToString ws wordsToString :: [(String, String)] -> String wordsToString [] = "" wordsToString (("zoi", s1) : (q, s2) : rest) = "zoi" ++ s1 ++ " \NUL" ++ s2 ++ quoteInside q rest wordsToString (("la'o", s1) : (q, s2) : rest) = "la'o" ++ s1 ++ " \NUL" ++ s2 ++ quoteInside q rest wordsToString ((w, s) : rest) = w ++ s ++ wordsToString rest quoteInside :: String -> [(String, String)] -> String quoteInside q0 ((q1, s) : rest) | q0 == q1 = "\NUL" ++ s ++ wordsToString rest | otherwise = q1 ++ s ++ quoteInside q0 rest lexwords :: String -> Maybe (String, [(String, String)]) lexwords src = case lexerPappytest_words $ lexerPappyParse "test_words" src of Parsed v _ _ -> Just v NoParse e -> Nothing main = do [str] <- getArgs print $ preprocess str