diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-10-17 00:37:42 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-10-17 00:37:42 +0200 |
| commit | bf5ec1f3e2325e28154b9796532d37ee84753349 (patch) | |
| tree | 247eb0160bb7a415d1210c8a6246c8c49abc6231 /lib/Language/Elna/Frontend/NameAnalysis.hs | |
| parent | 582040e5d3f6a5fb5b9046964b6823891d2802dd (diff) | |
| download | elna-bf5ec1f3e2325e28154b9796532d37ee84753349.tar.gz | |
Parse type declarations
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') |
