diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-10-30 14:12:51 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-10-30 14:12:51 +0100 |
| commit | 43882a3a0697945b35194c2b5940605e9f4dd846 (patch) | |
| tree | 494bde0fec422937f26b7b1a954adbcd477f7a9b /lib/Language/Elna/Frontend/AST.hs | |
| parent | 6b92e5059c04709b3506bb4e7bef29872b16811f (diff) | |
| download | elna-43882a3a0697945b35194c2b5940605e9f4dd846.tar.gz | |
Generate a call to _divide_by_zero_error on RiscV
Diffstat (limited to 'lib/Language/Elna/Frontend/AST.hs')
| -rw-r--r-- | lib/Language/Elna/Frontend/AST.hs | 53 |
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) = |
