From 95af38e652710195d0acee03bd7d6c2e477a9772 Mon Sep 17 00:00:00 2001 From: Adam Sampson Date: Sun, 18 Mar 2007 02:34:31 +0000 Subject: [PATCH] Handle whitespace better --- fco2/Parse.hs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/fco2/Parse.hs b/fco2/Parse.hs index 23065a0..3061e1b 100644 --- a/fco2/Parse.hs +++ b/fco2/Parse.hs @@ -108,6 +108,9 @@ occamStyle "VAL", "VALOF", "WHILE", + indentMarker, + outdentMarker, + eolMarker, mainMarker ] , P.caseSensitive = True @@ -143,6 +146,9 @@ sAmp = try $ symbol "&" sQuest = try $ symbol "?" sBang = try $ symbol "!" sEq = try $ symbol "=" +sApos = try $ symbol "'" +sQuote = try $ symbol "\"" +sHash = try $ symbol "#" --}}} --{{{ keywords sAFTER = reserved "AFTER" @@ -212,11 +218,11 @@ sWHILE = reserved "WHILE" -- XXX could handle VALOF by translating each step to one { and matching multiple ones? mainMarker = "__main" -sMainMarker = reserved mainMarker +sMainMarker = do { whiteSpace; reserved mainMarker } -indent = symbol indentMarker -outdent = symbol outdentMarker -eol = symbol eolMarker +indent = do { whiteSpace; reserved indentMarker } +outdent = do { whiteSpace; reserved outdentMarker } +eol = do { whiteSpace; reserved eolMarker } --}}} --{{{ helper functions @@ -432,7 +438,7 @@ occamExponent integer :: OccParser A.LiteralRepr integer = try (do { m <- md; d <- lexeme digits; return $ A.IntLiteral m d }) - <|> do { m <- md; char '#'; d <- many1 hexDigit; return $ A.HexLiteral m d } + <|> do { m <- md; sHash; d <- many1 hexDigit; return $ A.HexLiteral m d } "integer" digits :: OccParser String @@ -442,7 +448,7 @@ digits byte :: OccParser A.LiteralRepr byte - = do { m <- md; char '\''; s <- character; char '\''; return $ A.ByteLiteral m s } + = do { m <- md; char '\''; s <- character; sApos; return $ A.ByteLiteral m s } "byte" -- i.e. array literal @@ -460,7 +466,7 @@ table' stringLiteral :: OccParser A.LiteralRepr stringLiteral - = do { m <- md; char '"'; cs <- manyTill character (char '"'); return $ A.StringLiteral m (concat cs) } + = do { m <- md; char '"'; cs <- manyTill character sQuote; return $ A.StringLiteral m (concat cs) } "stringLiteral" character :: OccParser String @@ -843,7 +849,7 @@ variant output :: OccParser A.Process output = do m <- md - c <- channel + c <- try channel sBang (try (do { sCASE; t <- tagName; sSemi; os <- sepBy1 outputItem sSemi; eol; return $ A.OutputCase m c t os }) <|> do { sCASE; t <- tagName; eol; return $ A.OutputCase m c t [] }