A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
Some switch statements (uVisualGears.pas) are not lined up on the : so the internal code blocks are not aligned (lined up on the start of the label instead). Some function contents are indented against begin/end of function, some are not, some function begin/end are themselves indented (adler32). Also inconsistency in things like assigning of variables (whitespace before :=) and use of brackets in tests. Probably needs further review for possible code errors.
+ − {-# LANGUAGE FlexibleContexts #-}
+ − module PascalBasics where
+ −
+ − import Text.Parsec.Combinator
+ − import Text.Parsec.Char
+ − import Text.Parsec.Prim
+ − import Text.Parsec.Token
+ − import Text.Parsec.Language
+ − import Data.Char
+ −
+ − builtin = ["succ", "pred", "low", "high", "ord"]
+ −
+ − pascalLanguageDef
+ − = emptyDef
+ − { commentStart = "(*"
+ − , commentEnd = "*)"
+ − , commentLine = "//"
+ − , nestedComments = False
+ − , identStart = letter <|> oneOf "_"
+ − , identLetter = alphaNum <|> oneOf "_"
+ − , reservedNames = [
+ − "begin", "end", "program", "unit", "interface"
+ − , "implementation", "and", "or", "xor", "shl"
+ − , "shr", "while", "do", "repeat", "until", "case", "of"
+ − , "type", "var", "const", "out", "array", "packed"
+ − , "procedure", "function", "with", "for", "to"
+ − , "downto", "div", "mod", "record", "set", "nil"
+ − , "cdecl", "external", "if", "then", "else"
+ − ] -- ++ builtin
+ − , reservedOpNames= []
+ − , caseSensitive = False
+ − }
+ −
+ − preprocessorSwitch :: Stream s m Char => ParsecT s u m String
+ − preprocessorSwitch = do
+ − try $ string "{$"
+ − s <- manyTill (noneOf "\n") $ char '}'
+ − return s
+ −
+ − caseInsensitiveString s = do
+ − mapM_ (\a -> satisfy (\b -> toUpper a == toUpper b)) s <?> s
+ − return s
+ −
+ − pas = patch $ makeTokenParser pascalLanguageDef
+ − where
+ − patch tp = tp {stringLiteral = stringL}
+ −
+ − comment = choice [
+ − char '{' >> notFollowedBy (char '$') >> manyTill anyChar (try $ char '}')
+ − , (try $ string "(*") >> manyTill anyChar (try $ string "*)")
+ − , (try $ string "//") >> manyTill anyChar (try newline)
+ − ]
+ −
+ − comments = do
+ − spaces
+ − skipMany $ do
+ − preprocessorSwitch <|> comment
+ − spaces
+ −
+ − stringL = do
+ − (char '\'')
+ − s <- (many $ noneOf "'")
+ − (char '\'')
+ − ss <- many $ do
+ − (char '\'')
+ − s' <- (many $ noneOf "'")
+ − (char '\'')
+ − return $ '\'' : s'
+ − comments
+ − return $ concat (s:ss)