diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-12-02 13:57:03 +0100 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-12-02 13:57:03 +0100 |
| commit | 0c40bca60b343bb289f0a567ec9ec9e9382bad2a (patch) | |
| tree | bd0906d21a34afcd571e1b1489f3982c2c98151e /lib/Language/Elna/Frontend | |
| parent | 147967c04b0efeec4246b8ba0ff9b6961c9fe6cd (diff) | |
| download | elna-0c40bca60b343bb289f0a567ec9ec9e9382bad2a.tar.gz | |
Add array assignment to the IR
Diffstat (limited to 'lib/Language/Elna/Frontend')
| -rw-r--r-- | lib/Language/Elna/Frontend/AST.hs | 8 | ||||
| -rw-r--r-- | lib/Language/Elna/Frontend/NameAnalysis.hs | 14 | ||||
| -rw-r--r-- | lib/Language/Elna/Frontend/Parser.hs | 4 | ||||
| -rw-r--r-- | lib/Language/Elna/Frontend/TypeAnalysis.hs | 19 |
4 files changed, 18 insertions, 27 deletions
diff --git a/lib/Language/Elna/Frontend/AST.hs b/lib/Language/Elna/Frontend/AST.hs index df00d4b..c9e05ef 100644 --- a/lib/Language/Elna/Frontend/AST.hs +++ b/lib/Language/Elna/Frontend/AST.hs @@ -176,16 +176,16 @@ instance Show Expression show (DivisionExpression lhs rhs) = concat [show lhs, " / ", show rhs] show (VariableExpression variable) = show variable -newtype VariableAccess +data VariableAccess = VariableAccess Identifier - -- | ArrayAccess VariableAccess Expression + | ArrayAccess VariableAccess Expression deriving Eq instance Show VariableAccess where show (VariableAccess variableName) = show variableName - {- show (ArrayAccess arrayAccess elementIndex) = - concat [show arrayAccess, "[", show elementIndex, "]"] -} + show (ArrayAccess arrayAccess elementIndex) = + concat [show arrayAccess, "[", show elementIndex, "]"] data Condition = EqualCondition Expression Expression diff --git a/lib/Language/Elna/Frontend/NameAnalysis.hs b/lib/Language/Elna/Frontend/NameAnalysis.hs index fbf5d51..596ffb2 100644 --- a/lib/Language/Elna/Frontend/NameAnalysis.hs +++ b/lib/Language/Elna/Frontend/NameAnalysis.hs @@ -202,18 +202,6 @@ condition globalTable (AST.GreaterOrEqualCondition lhs rhs) variableAccess :: SymbolTable -> AST.VariableAccess -> NameAnalysis () variableAccess globalTable (AST.VariableAccess identifier) = checkSymbol globalTable identifier -{- variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression) +variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression) = variableAccess globalTable arrayExpression >> expression globalTable indexExpression - -enter :: Identifier -> Info -> SymbolTable -> NameAnalysis SymbolTable -enter identifier info table - = maybe (identifierAlreadyDefinedError identifier) pure - $ SymbolTable.enter identifier info table - -identifierAlreadyDefinedError :: Identifier -> NameAnalysis a -identifierAlreadyDefinedError = NameAnalysis - . lift - . throwE - . IdentifierAlreadyDefinedError --} diff --git a/lib/Language/Elna/Frontend/Parser.hs b/lib/Language/Elna/Frontend/Parser.hs index 570c91f..4878b28 100644 --- a/lib/Language/Elna/Frontend/Parser.hs +++ b/lib/Language/Elna/Frontend/Parser.hs @@ -93,10 +93,10 @@ expressionP :: Parser Expression expressionP = makeExprParser termP operatorTable variableAccessP :: Parser VariableAccess -variableAccessP = VariableAccess <$> identifierP {- do +variableAccessP = do identifier <- identifierP indices <- many $ bracketsP expressionP - pure $ foldr (flip ArrayAccess) (VariableAccess identifier) indices -} + pure $ foldr (flip ArrayAccess) (VariableAccess identifier) indices conditionP :: Parser Condition conditionP = do diff --git a/lib/Language/Elna/Frontend/TypeAnalysis.hs b/lib/Language/Elna/Frontend/TypeAnalysis.hs index c43e80e..48be782 100644 --- a/lib/Language/Elna/Frontend/TypeAnalysis.hs +++ b/lib/Language/Elna/Frontend/TypeAnalysis.hs @@ -11,7 +11,7 @@ import Control.Monad.Trans.Reader (ReaderT, runReaderT, withReaderT, ask, asks) import Data.Foldable (traverse_) import qualified Data.Vector as Vector import qualified Language.Elna.Frontend.AST as AST -import Language.Elna.Frontend.SymbolTable (Info(..), {-ParameterInfo(..), -}SymbolTable) +import Language.Elna.Frontend.SymbolTable (Info(..), ParameterInfo(..), SymbolTable) import qualified Language.Elna.Frontend.SymbolTable as SymbolTable import Language.Elna.Frontend.Types (Type(..), booleanType, intType) import Language.Elna.Location (Identifier(..)) @@ -31,11 +31,10 @@ data Error | ArithmeticExpressionError Type | ComparisonExpressionError Type Type | InvalidConditionTypeError Type -{- | InvalidAssignmentError Type - | ExpectedLvalueError AST.Expression - | ArgumentTypeMismatchError Type Type + {- | ExpectedLvalueError AST.Expression + | ArgumentTypeMismatchError Type Type -} | ArrayIndexError Type - | ArrayAccessError Type -} + | ArrayAccessError Type deriving Eq instance Show Error @@ -56,6 +55,10 @@ instance Show Error <> show lhs <> "\" and \"" <> show rhs <> "\"" show (InvalidConditionTypeError got) = "Expected a condition to be a boolean, got: " <> show got + show (ArrayIndexError got) = + "Expected an array index expression to be an integer, got: " <> show got + show (ArrayAccessError got) = + "Expected to encounter an array, got: " <> show got newtype TypeAnalysis a = TypeAnalysis { runTypeAnalysis :: ReaderT SymbolTable (Except Error) a @@ -127,7 +130,7 @@ statement globalTable = \case Nothing -> TypeAnalysis $ lift $ throwE $ UndefinedSymbolError procedureName where - checkArgument SymbolTable.ParameterInfo{} _argument = pure () {- + checkArgument ParameterInfo{} _argument = pure () {- argumentType <- expression globalTable argument unless (argumentType == type') $ TypeAnalysis $ lift $ throwE $ ArgumentTypeMismatchError type' argumentType @@ -145,7 +148,7 @@ variableAccess globalTable (AST.VariableAccess identifier) = do $ UnexpectedVariableInfoError anotherInfo Nothing -> TypeAnalysis $ lift $ throwE $ UndefinedSymbolError identifier -{-variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression) = do +variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression) = do arrayType <- variableAccess globalTable arrayExpression indexType <- expression globalTable indexExpression unless (indexType == intType) @@ -154,7 +157,7 @@ variableAccess globalTable (AST.VariableAccess identifier) = do ArrayType _ baseType -> pure baseType nonArrayType -> TypeAnalysis $ lift $ throwE $ ArrayAccessError nonArrayType --} + expression :: SymbolTable -> AST.Expression -> TypeAnalysis Type expression globalTable = \case AST.VariableExpression variableExpression -> |
