diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-08-04 12:23:19 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-08-04 12:23:19 +0200 |
| commit | 9cb9ab536f51978b8251a651d77d955cb8b794e1 (patch) | |
| tree | 872e398f23726d80afea7079c6951d2d9baccc02 /lib/Language/Elna/NameAnalysis.hs | |
| parent | 5f8d9abe76187669cd7d4f691a2c40db2b4c8a6f (diff) | |
| download | elna-9cb9ab536f51978b8251a651d77d955cb8b794e1.tar.gz | |
Create procedure local symbol table
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
| -rw-r--r-- | lib/Language/Elna/NameAnalysis.hs | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/Language/Elna/NameAnalysis.hs b/lib/Language/Elna/NameAnalysis.hs index 4acde39..bd1b854 100644 --- a/lib/Language/Elna/NameAnalysis.hs +++ b/lib/Language/Elna/NameAnalysis.hs @@ -8,7 +8,7 @@ import Control.Monad.Trans.Reader (ReaderT(..), ask, runReaderT, withReaderT) import Data.Functor ((<&>)) import qualified Language.Elna.AST as AST import Language.Elna.Location (Identifier(..)) -import Language.Elna.SymbolTable (Info(..), SymbolTable, symbolTable) +import Language.Elna.SymbolTable (Info(..), SymbolTable, builtInSymbolTable) import qualified Language.Elna.SymbolTable as SymbolTable import Language.Elna.Types (Type(..)) import Control.Monad.Trans.Class (MonadTrans(..)) @@ -38,7 +38,7 @@ instance Monad NameAnalysis nameAnalysis :: AST.Program -> Either Error SymbolTable nameAnalysis = runExcept - . flip runReaderT symbolTable + . flip runReaderT builtInSymbolTable . runNameAnalysis . program @@ -51,9 +51,21 @@ declaration :: SymbolTable -> AST.Declaration -> NameAnalysis SymbolTable declaration globalTable (AST.TypeDefinition identifier typeExpression) = flip (SymbolTable.enter identifier) globalTable . TypeInfo <$> withSymbolTable globalTable (dataType typeExpression) -declaration globalTable (AST.ProcedureDefinition identifier _parameters _variables _body) = - let localTable = SymbolTable.empty - in pure $ SymbolTable.enter identifier (ProcedureInfo localTable mempty) globalTable +declaration globalTable (AST.ProcedureDefinition identifier parameters variables _body) = do + parametersInfo <- mapM parameter parameters + variableInfo <- mapM variableDeclaration variables + let localTable = SymbolTable.fromList $ parametersInfo <> variableInfo + pure $ SymbolTable.enter identifier (ProcedureInfo localTable mempty) globalTable + +variableDeclaration :: AST.VariableDeclaration -> NameAnalysis (Identifier, Info) +variableDeclaration (AST.VariableDeclaration identifier typeExpression) + = (identifier,) . flip VariableInfo False + <$> dataType typeExpression + +parameter :: AST.Parameter -> NameAnalysis (Identifier, Info) +parameter (AST.Parameter identifier typeExpression isReferenceParameter') + = (identifier,) . flip VariableInfo isReferenceParameter' + <$> dataType typeExpression withSymbolTable :: forall a. SymbolTable -> NameAnalysis a -> NameAnalysis a withSymbolTable symbolTable' = NameAnalysis |
