fortran-src-0.10.0: src/Language/Fortran/Parser/Fixed/Utils.hs
{-# LANGUAGE CPP #-}
module Language.Fortran.Parser.Fixed.Utils where
import Language.Fortran.Parser.Fixed.Lexer
import Language.Fortran.AST
import Language.Fortran.AST.Literal.Real
import Language.Fortran.Util.Position
import Language.Fortran.Parser.Monad
import Control.Monad.State
-- | UNSAFE. Must be called with expected token types (see usage sites). Will
-- cause a runtime exception if it doesn't form a valid REAL literal.
makeRealLit
:: Maybe Token -> Maybe Token -> Maybe Token -> Maybe (SrcSpan, String)
-> Expression A0
makeRealLit i1 dot i2 expr =
let span1 = getSpan (i1, dot, i2)
span2 = case expr of
Just e -> getTransSpan span1 (fst e)
Nothing -> span1
i1Str = case i1 of { Just (TInt _ s) -> s ; _ -> "" }
dotStr = case dot of { Just (TDot _) -> "." ; _ -> "" }
i2Str = case i2 of { Just (TInt _ s) -> s ; _ -> "" }
exprStr = case expr of { Just (_, s) -> s ; _ -> "" }
litStr = i1Str ++ dotStr ++ i2Str ++ exprStr
in ExpValue () span2 $ ValReal (parseRealLit litStr) Nothing
parseError :: Token -> LexAction a
parseError _ = do
parseState <- get
#ifdef DEBUG
tokens <- reverse <$> aiPreviousTokensInLine <$> getAlex
#endif
fail $ psFilename parseState ++ ": parsing failed. "
#ifdef DEBUG
++ '\n' : show tokens
#endif
convCmts :: [Block a] -> [ProgramUnit a]
convCmts = map convCmt
where convCmt (BlComment a s c) = PUComment a s c
convCmt _ = error "convCmt applied to something that is not a comment"