summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/NameAnalysis.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-08-04 12:23:19 +0200
committerEugen Wissner <belka@caraus.de>2024-08-04 12:23:19 +0200
commit9cb9ab536f51978b8251a651d77d955cb8b794e1 (patch)
tree872e398f23726d80afea7079c6951d2d9baccc02 /lib/Language/Elna/NameAnalysis.hs
parent5f8d9abe76187669cd7d4f691a2c40db2b4c8a6f (diff)
downloadelna-9cb9ab536f51978b8251a651d77d955cb8b794e1.tar.gz
Create procedure local symbol table
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
-rw-r--r--lib/Language/Elna/NameAnalysis.hs22
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