diff options
Diffstat (limited to 'src/Language/Fiddle/Compiler/Expansion.hs')
-rw-r--r-- | src/Language/Fiddle/Compiler/Expansion.hs | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/Language/Fiddle/Compiler/Expansion.hs b/src/Language/Fiddle/Compiler/Expansion.hs index 11a68be..d9bce1e 100644 --- a/src/Language/Fiddle/Compiler/Expansion.hs +++ b/src/Language/Fiddle/Compiler/Expansion.hs @@ -8,17 +8,17 @@ module Language.Fiddle.Compiler.Expansion (expandAst, expansionPhase) where import Control.Monad.Identity (Identity (..)) import Control.Monad.State (get, modify, put) +import qualified Data.Char as Char import Data.List (intercalate) +import qualified Data.List.NonEmpty as NonEmpty import Data.Text (Text) +import qualified Data.Text as Text import Language.Fiddle.Ast import Language.Fiddle.Compiler import Language.Fiddle.Compiler.Qualification () +import Language.Fiddle.Internal.UnitNumbers import Language.Fiddle.Types -import qualified Data.Char as Char -import qualified Data.List.NonEmpty as NonEmpty -import qualified Data.Text as Text - type M = Compile State type Annot = Commented SourceSpan @@ -108,10 +108,11 @@ instance AdvanceStage CurrentStage FiddleUnit where advanceStage path (FiddleUnit v decls a) = FiddleUnit v <$> reconfigureFiddleDecls path decls <*> pure a -instance AdvanceStage CurrentStage Expression where +instance AdvanceStage CurrentStage (Expression u) where advanceStage _ = \case (Var i a) -> return $ Var i a - (LitNum t a) -> LitNum <$> parseNum (unCommented a) t <*> pure a + (LitNum (LeftV t) a) -> + LitNum . RightV <$> parseNum (unCommented a) t <*> pure a instance AdvanceStage CurrentStage RegisterBitsTypeRef where advanceStage path = \case @@ -146,18 +147,19 @@ instance AdvanceStage CurrentStage ObjType where <*> advanceStage path expr <*> pure a -parseNum :: SourceSpan -> Text -> Compile s Integer -parseNum span txt = fromMayberOrFail span "Unable to parse number" $ - case Text.unpack (Text.take 2 txt) of - "0b" -> toNumWithRadix (Text.drop 2 txt) 2 - "0x" -> toNumWithRadix (Text.drop 2 txt) 16 - ('0' : _) -> toNumWithRadix (Text.tail txt) 8 - _ -> toNumWithRadix txt 10 +parseNum :: SourceSpan -> Text -> Compile s (N u) +parseNum span txt = fmap NumberWithUnit $ + fromMayberOrFail span "Unable to parse number" $ + case Text.unpack (Text.take 2 txt) of + "0b" -> toNumWithRadix (Text.drop 2 txt) 2 + "0x" -> toNumWithRadix (Text.drop 2 txt) 16 + ('0' : _) -> toNumWithRadix (Text.tail txt) 8 + _ -> toNumWithRadix txt 10 where removeUnders :: Text -> Text removeUnders = Text.replace (Text.pack "_") Text.empty - toNumWithRadix :: Text -> Int -> Maybe Integer + toNumWithRadix :: Text -> Int -> Maybe Int toNumWithRadix (removeUnders -> txt) (fromIntegral -> radix) = Text.foldl ( \mAcc x -> @@ -166,7 +168,7 @@ parseNum span txt = fromMayberOrFail span "Unable to parse number" $ (Just 0) txt - digitToInt :: Char -> Integer -> Maybe Integer + digitToInt :: Char -> Int -> Maybe Int digitToInt (Char.toLower -> ch) radix = let a | Char.isDigit ch = Just (Char.ord ch - Char.ord '0') |