summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/Frontend/NameAnalysis.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-10-17 00:37:42 +0200
committerEugen Wissner <belka@caraus.de>2024-10-17 00:37:42 +0200
commitbf5ec1f3e2325e28154b9796532d37ee84753349 (patch)
tree247eb0160bb7a415d1210c8a6246c8c49abc6231 /lib/Language/Elna/Frontend/NameAnalysis.hs
parent582040e5d3f6a5fb5b9046964b6823891d2802dd (diff)
downloadelna-bf5ec1f3e2325e28154b9796532d37ee84753349.tar.gz
Parse type declarations
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')