diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-09-24 22:20:57 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-09-24 22:20:57 +0200 |
| commit | b30bbcab2892f9c41d6b1057eb09804e2d9be4e6 (patch) | |
| tree | bd6db707f8bef38be0ac967f170e0d822142422f /lib/Language/Elna/NameAnalysis.hs | |
| parent | e66ccf46f445f04fbbeb1b0bfb273b806d22f65b (diff) | |
| download | elna-b30bbcab2892f9c41d6b1057eb09804e2d9be4e6.tar.gz | |
Parse call statements
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
| -rw-r--r-- | lib/Language/Elna/NameAnalysis.hs | 54 |
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) |
