summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/NameAnalysis.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
-rw-r--r--lib/Language/Elna/NameAnalysis.hs20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/Language/Elna/NameAnalysis.hs b/lib/Language/Elna/NameAnalysis.hs
index 0ef702d..c4b7391 100644
--- a/lib/Language/Elna/NameAnalysis.hs
+++ b/lib/Language/Elna/NameAnalysis.hs
@@ -25,7 +25,23 @@ data Error
| IdentifierAlreadyDefinedError Identifier
| UndefinedSymbolError Identifier
| UnexpectedArrayByValue Identifier
- deriving (Eq, Show)
+ deriving Eq
+
+instance Show Error
+ where
+ show (UndefinedTypeError identifier) =
+ concat ["Type \"", show identifier, "\" is not defined"]
+ show (UnexpectedTypeInfoError info) = show info
+ <> " expected to be a type"
+ show (IdentifierAlreadyDefinedError identifier) =
+ concat ["The identifier \"", show identifier, "\" is already defined"]
+ show (UndefinedSymbolError identifier) =
+ concat ["Symbol \"", show identifier, "\" is not defined"]
+ show (UnexpectedArrayByValue identifier) = concat
+ [ "Array \""
+ , show identifier
+ , "\" cannot be passed by value, only by reference"
+ ]
newtype NameAnalysis a = NameAnalysis
{ runNameAnalysis :: Except Error a
@@ -61,7 +77,7 @@ procedureDeclaration globalTable (AST.ProcedureDeclaration identifier parameters
$ Vector.fromList parametersInfo
maybe (NameAnalysis $ throwE $ IdentifierAlreadyDefinedError identifier) pure
$ SymbolTable.enter identifier procedureInfo globalTable
-
+
declaration :: SymbolTable -> AST.Declaration -> NameAnalysis SymbolTable
declaration globalTable (AST.ProcedureDeclaration identifier parameters variables body) = do
variableInfo <- mapM (variableDeclaration globalTable) variables