diff options
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
| -rw-r--r-- | lib/Language/Elna/NameAnalysis.hs | 20 |
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 |
