Abbie's Haskell compiler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.3 KiB

  1. {-# LANGUAGE DeriveGeneric #-}
  2. {-# LANGUAGE DeriveAnyClass #-}
  3. module Frontend.Syntax.Var where
  4. import qualified Data.Text as T
  5. import Data.Text (Text)
  6. import Development.Shake.Classes
  7. import Frontend.Parser.Posn
  8. import GHC.Generics (Generic)
  9. data ParsedVar
  10. = UnqualVar
  11. { varId :: Text
  12. , varBegin :: Posn
  13. , varEnd :: Posn
  14. }
  15. | QualVar
  16. { varId :: Text
  17. , varPrefix :: Text
  18. , varBegin :: Posn
  19. , varEnd :: Posn
  20. }
  21. | ModId
  22. { varId :: Text
  23. , varBegin :: Posn
  24. , varEnd :: Posn
  25. }
  26. | BuiltinId
  27. { varId :: Text
  28. , varBuiltin :: BuiltinIdClass
  29. , varBegin :: Posn
  30. , varEnd :: Posn
  31. }
  32. deriving (Eq, Show, Generic, Binary, Hashable, NFData)
  33. data BuiltinIdClass
  34. = BuiltinTuple !Int
  35. | BuiltinNil
  36. | BuiltinArrow
  37. deriving (Eq, Show, Generic, Binary, Hashable, NFData)
  38. toModId :: ParsedVar -> ParsedVar
  39. toModId x@ModId{} = x
  40. toModId (UnqualVar x y z) = ModId x y z
  41. toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
  42. toModId BuiltinId{} =
  43. error "Built-in variable can not be a module identifier!"
  44. splitModuleIdentifier :: Text -> [Text]
  45. splitModuleIdentifier t
  46. | T.null fst = []
  47. | otherwise = fst:splitModuleIdentifier (T.drop 1 snd)
  48. where (fst, snd) = T.span (/= '.') t