summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/Expansion.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Fiddle/Compiler/Expansion.hs')
-rw-r--r--src/Language/Fiddle/Compiler/Expansion.hs32
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')