summaryrefslogtreecommitdiff
path: root/lib/Language/Elna/NameAnalysis.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-09-24 22:20:57 +0200
committerEugen Wissner <belka@caraus.de>2024-09-24 22:20:57 +0200
commitb30bbcab2892f9c41d6b1057eb09804e2d9be4e6 (patch)
treebd6db707f8bef38be0ac967f170e0d822142422f /lib/Language/Elna/NameAnalysis.hs
parente66ccf46f445f04fbbeb1b0bfb273b806d22f65b (diff)
downloadelna-b30bbcab2892f9c41d6b1057eb09804e2d9be4e6.tar.gz
Parse call statements
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
-rw-r--r--lib/Language/Elna/NameAnalysis.hs54
1 files changed, 25 insertions, 29 deletions
diff --git a/lib/Language/Elna/NameAnalysis.hs b/lib/Language/Elna/NameAnalysis.hs
index c4b7391..6cb2f5c 100644
--- a/lib/Language/Elna/NameAnalysis.hs
+++ b/lib/Language/Elna/NameAnalysis.hs
@@ -17,7 +17,7 @@ import Data.Functor ((<&>))
import Language.Elna.Location (Identifier(..))
import Language.Elna.Types (Type(..))
import Data.Foldable (traverse_)
-import Control.Monad (foldM)
+import Control.Monad (foldM, unless)
data Error
= UndefinedTypeError Identifier
@@ -128,38 +128,16 @@ dataType environmentSymbolTable (AST.NamedType baseType) = do
dataType environmentSymbolTable (AST.ArrayType arraySize baseType) =
dataType environmentSymbolTable baseType <&> ArrayType arraySize
-statement :: SymbolTable -> AST.Statement -> NameAnalysis ()
-statement _ AST.EmptyStatement = pure ()
-{- statement globalTable (AST.AssignmentStatement lvalue rvalue)
- = variableAccess globalTable lvalue
- >> expression globalTable rvalue
-statement globalTable (AST.IfStatement ifCondition ifStatement elseStatement)
- = condition globalTable ifCondition
- >> statement globalTable ifStatement
- >> maybe (pure ()) (statement globalTable) elseStatement
-statement globalTable (AST.WhileStatement whileCondition loop)
- = condition globalTable whileCondition
- >> statement globalTable loop
-statement globalTable (AST.CompoundStatement statements) =
- traverse_ (statement globalTable) statements
-statement globalTable (AST.CallStatement name arguments)
- = checkSymbol globalTable name
- >> traverse_ (expression globalTable) arguments
-
checkSymbol :: SymbolTable -> Identifier -> NameAnalysis ()
-checkSymbol globalTable identifier =
- let undefinedSymbolError = NameAnalysis
- $ lift
- $ throwE
- $ UndefinedSymbolError identifier
- isDefined = SymbolTable.member identifier globalTable
- in NameAnalysis (asks (SymbolTable.member identifier))
- >>= (flip unless undefinedSymbolError . (isDefined ||))
+checkSymbol globalTable identifier
+ = unless (SymbolTable.member identifier globalTable)
+ $ NameAnalysis $ throwE
+ $ UndefinedSymbolError identifier
expression :: SymbolTable -> AST.Expression -> NameAnalysis ()
-expression globalTable (AST.VariableExpression variableExpression) =
- variableAccess globalTable variableExpression
expression _ (AST.LiteralExpression _) = pure ()
+{- expression globalTable (AST.VariableExpression variableExpression) =
+ variableAccess globalTable variableExpression
expression globalTable (AST.NegationExpression negation) =
expression globalTable negation
expression globalTable (AST.SumExpression lhs rhs)
@@ -174,6 +152,24 @@ expression globalTable (AST.ProductExpression lhs rhs)
expression globalTable (AST.DivisionExpression lhs rhs)
= expression globalTable lhs
>> expression globalTable rhs
+-}
+statement :: SymbolTable -> AST.Statement -> NameAnalysis ()
+statement _ AST.EmptyStatement = pure ()
+statement globalTable (AST.CallStatement name arguments)
+ = checkSymbol globalTable name
+ >> traverse_ (expression globalTable) arguments
+{- statement globalTable (AST.AssignmentStatement lvalue rvalue)
+ = variableAccess globalTable lvalue
+ >> expression globalTable rvalue
+statement globalTable (AST.IfStatement ifCondition ifStatement elseStatement)
+ = condition globalTable ifCondition
+ >> statement globalTable ifStatement
+ >> maybe (pure ()) (statement globalTable) elseStatement
+statement globalTable (AST.WhileStatement whileCondition loop)
+ = condition globalTable whileCondition
+ >> statement globalTable loop
+statement globalTable (AST.CompoundStatement statements) =
+ traverse_ (statement globalTable) statements
variableAccess :: SymbolTable -> AST.VariableAccess -> NameAnalysis ()
variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression)