summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Frontend/NameAnalysis.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Language/Elna/Frontend/NameAnalysis.hs')
-rw-r--r--lib/Language/Elna/Frontend/NameAnalysis.hs20
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')