On Sun, Jan 23, 2011 at 4:31 PM, Chung-chieh Shan <[email protected]>wrote:
> Maybe Text.Show.Pretty.parseValue in the pretty-show package can help? > That's what I was looking for, thanks! On Sun, Jan 23, 2011 at 5:23 PM, Stephen Tetley <[email protected]> wrote: > I don't think you can do this "simply" as you think you would always > have to build a parse tree. Isn't it enough to maintain a stack of open parens, brackets, char- and string-terminators and escape chars? Below is my attempt at solving the problem without an expression parser. In practice, if you follow the skeleton syntax tree style you might > find "not caring" about the details of syntax is almost as much work > as caring about them. I've tried a couple of times to make a skeleton > parser that does paren nesting and little else, but always given up > and just used a proper parser as the skeleton parser never seemed > robust. > Indeed I doubt that the implementation below is robust and it's too tricky to be easily maintainable. I include it for reference. Let me know if you spot an obvious mistake.. Sebastian splitTLC :: String -> [String] splitTLC = parse "" type Stack = String parse :: Stack -> String -> [String] parse _ "" = [] parse st (c:cs) = next c st $ parse (updStack c st) cs next :: Char -> Stack -> [String] -> [String] next c [] xs = if c==',' then [] : xs else c <: xs next c (_:_) xs = c <: xs infixr 0 <: (<:) :: Char -> [String] -> [String] c <: [] = [[c]] c <: (x:xs) = (c:x):xs updStack :: Char -> Stack -> Stack updStack char stack = case (char,stack) of -- char is an escaped character (_ ,'\\':xs) -> xs -- the next character is not -- char is the escape character ('\\', xs) -> '\\':xs -- push it on the stack -- char is the string terminator ('"' , '"':xs) -> xs -- closes current string literal ('"' , ''':xs) -> ''':xs -- ignored inside character ('"' , xs) -> '"':xs -- opens a new string -- char is the character terminator (''' , ''':xs) -> xs -- closes current character literal (''' , '"':xs) -> '"':xs -- ignored inside string (''' , xs) -> ''':xs -- opens a new character -- parens and brackets (_ , '"':xs) -> '"':xs -- are ignored inside strings (_ , ''':xs) -> ''':xs -- and characters ('(' , xs) -> '(':xs -- new opening paren (')' , '(':xs) -> xs -- closing paren ('[' , xs) -> '[':xs -- opening bracket (']' , '[':xs) -> xs -- closing bracket -- other character don't modify the stack (ignoring record syntax) (_ , xs) -> xs
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
