summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Frontend/AST.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Frontend/AST.hs')
-rw-r--r--lib/Language/Elna/Frontend/AST.hs53
1 files changed, 48 insertions, 5 deletions
diff --git a/lib/Language/Elna/Frontend/AST.hs b/lib/Language/Elna/Frontend/AST.hs
index 0925f6f..037e6ca 100644
--- a/lib/Language/Elna/Frontend/AST.hs
+++ b/lib/Language/Elna/Frontend/AST.hs
@@ -15,9 +15,10 @@ module Language.Elna.Frontend.AST
import Data.Char (chr)
import Data.Int (Int32)
import Data.List (intercalate)
-import Data.Word (Word8, Word32)
+import Data.Word (Word8)
import Language.Elna.Location (Identifier(..), showArrayType)
import Numeric (showHex)
+import Data.Bifunctor (Bifunctor(bimap))
newtype Program = Program [Declaration]
deriving Eq
@@ -57,13 +58,14 @@ showParameters parameters =
data TypeExpression
= NamedType Identifier
- | ArrayType Word32 TypeExpression
+ | ArrayType Literal TypeExpression
deriving Eq
instance Show TypeExpression
where
show (NamedType typeName) = show typeName
- show (ArrayType elementCount typeName) = showArrayType elementCount typeName
+ show (ArrayType elementCount typeName) =
+ showArrayType elementCount typeName
data Statement
= EmptyStatement
@@ -96,18 +98,59 @@ data VariableDeclaration =
deriving Eq
data Literal
- = IntegerLiteral Int32
+ = DecimalLiteral Int32
| HexadecimalLiteral Int32
| CharacterLiteral Word8
deriving Eq
instance Show Literal
where
- show (IntegerLiteral integer) = show integer
+ show (DecimalLiteral integer) = show integer
show (HexadecimalLiteral integer) = '0' : 'x' : showHex integer ""
show (CharacterLiteral character) =
'\'' : chr (fromEnum character) : ['\'']
+instance Ord Literal
+ where
+ compare x y = compare (int32Literal x) (int32Literal y)
+
+instance Num Literal
+ where
+ x + y = DecimalLiteral $ int32Literal x + int32Literal y
+ x * y = DecimalLiteral $ int32Literal x * int32Literal y
+ abs (DecimalLiteral x) = DecimalLiteral $ abs x
+ abs (HexadecimalLiteral x) = HexadecimalLiteral $ abs x
+ abs (CharacterLiteral x) = CharacterLiteral $ abs x
+ negate (DecimalLiteral x) = DecimalLiteral $ negate x
+ negate (HexadecimalLiteral x) = HexadecimalLiteral $ negate x
+ negate (CharacterLiteral x) = CharacterLiteral $ negate x
+ signum (DecimalLiteral x) = DecimalLiteral $ signum x
+ signum (HexadecimalLiteral x) = HexadecimalLiteral $ signum x
+ signum (CharacterLiteral x) = CharacterLiteral $ signum x
+ fromInteger = DecimalLiteral . fromInteger
+
+instance Real Literal
+ where
+ toRational (DecimalLiteral integer) = toRational integer
+ toRational (HexadecimalLiteral integer) = toRational integer
+ toRational (CharacterLiteral integer) = toRational integer
+
+instance Enum Literal
+ where
+ toEnum = DecimalLiteral . fromIntegral
+ fromEnum = fromEnum . int32Literal
+
+instance Integral Literal
+ where
+ toInteger = toInteger . int32Literal
+ quotRem x y = bimap DecimalLiteral DecimalLiteral
+ $ quotRem (int32Literal x) (int32Literal y)
+
+int32Literal :: Literal -> Int32
+int32Literal (DecimalLiteral integer) = integer
+int32Literal (HexadecimalLiteral integer) = integer
+int32Literal (CharacterLiteral integer) = fromIntegral integer
+
instance Show VariableDeclaration
where
show (VariableDeclaration identifier typeExpression) =