diff options
Diffstat (limited to 'lib/Language/Elna/Frontend/NameAnalysis.hs')
| -rw-r--r-- | lib/Language/Elna/Frontend/NameAnalysis.hs | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/Language/Elna/Frontend/NameAnalysis.hs b/lib/Language/Elna/Frontend/NameAnalysis.hs index 393ab0d..8a183e1 100644 --- a/lib/Language/Elna/Frontend/NameAnalysis.hs +++ b/lib/Language/Elna/Frontend/NameAnalysis.hs @@ -71,12 +71,19 @@ program symbolTable (AST.Program declarations) = do foldM declaration globalTable declarations procedureDeclaration :: SymbolTable -> AST.Declaration -> NameAnalysis SymbolTable -procedureDeclaration globalTable (AST.ProcedureDeclaration identifier parameters _ _) = do - parametersInfo <- mapM (parameter globalTable) parameters - let procedureInfo = ProcedureInfo SymbolTable.empty - $ Vector.fromList parametersInfo - maybe (NameAnalysis $ throwE $ IdentifierAlreadyDefinedError identifier) pure - $ SymbolTable.enter identifier procedureInfo globalTable +procedureDeclaration globalTable = \case + (AST.ProcedureDeclaration identifier parameters _ _) + -> mapM (parameter globalTable) parameters + >>= enterOrFail identifier + . ProcedureInfo SymbolTable.empty + . Vector.fromList + (AST.TypeDefinition identifier typeExpression) + -> dataType globalTable typeExpression + >>= enterOrFail identifier . SymbolTable.TypeInfo + where + enterOrFail identifier declarationInfo = + maybe (NameAnalysis $ throwE $ IdentifierAlreadyDefinedError identifier) pure + $ SymbolTable.enter identifier declarationInfo globalTable declaration :: SymbolTable -> AST.Declaration -> NameAnalysis SymbolTable declaration globalTable (AST.ProcedureDeclaration identifier parameters variables body) = do @@ -92,6 +99,7 @@ declaration globalTable (AST.ProcedureDeclaration identifier parameters variable updater procedureTable (ProcedureInfo _ parameters') = Just $ ProcedureInfo procedureTable parameters' updater _ _ = Nothing +declaration globalTable (AST.TypeDefinition _ _) = pure globalTable parameterToVariableInfo :: SymbolTable -> AST.Parameter -> NameAnalysis (Identifier, Info) parameterToVariableInfo symbolTable (AST.Parameter identifier typeExpression isReferenceParameter') |
