diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-08-15 20:13:56 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-08-15 20:13:56 +0200 |
| commit | d405072dbf166cc8c0f9ed49e4edb26afff498b3 (patch) | |
| tree | e272aaf60e2c3edf2388a29c75aa086c03b8bff0 /lib/Language/Elna/NameAnalysis.hs | |
| parent | f78592378a815bcc2dfabac4538c1ce612d4878d (diff) | |
| download | elna-d405072dbf166cc8c0f9ed49e4edb26afff498b3.tar.gz | |
Access multidimensional arrays
Diffstat (limited to 'lib/Language/Elna/NameAnalysis.hs')
| -rw-r--r-- | lib/Language/Elna/NameAnalysis.hs | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/lib/Language/Elna/NameAnalysis.hs b/lib/Language/Elna/NameAnalysis.hs index 7078691..0034628 100644 --- a/lib/Language/Elna/NameAnalysis.hs +++ b/lib/Language/Elna/NameAnalysis.hs @@ -83,23 +83,23 @@ declaration globalTable (AST.ProcedureDefinition identifier parameters variables statement :: SymbolTable -> AST.Statement -> NameAnalysis () statement _ AST.EmptyStatement = pure () statement globalTable (AST.AssignmentStatement lvalue rvalue) - = expression globalTable lvalue + = variableAccess globalTable lvalue >> expression globalTable rvalue -statement globalTable (AST.IfStatement condition ifStatement elseStatement) - = expression globalTable condition +statement globalTable (AST.IfStatement ifCondition ifStatement elseStatement) + = condition globalTable ifCondition >> statement globalTable ifStatement >> maybe (pure ()) (statement globalTable) elseStatement -statement globalTable (AST.WhileStatement condition loop) - = expression globalTable condition +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 name globalTable + = checkSymbol globalTable name >> traverse_ (expression globalTable) arguments -checkSymbol :: Identifier -> SymbolTable -> NameAnalysis () -checkSymbol identifier globalTable = +checkSymbol :: SymbolTable -> Identifier -> NameAnalysis () +checkSymbol globalTable identifier = let undefinedSymbolError = NameAnalysis $ lift $ throwE @@ -109,8 +109,8 @@ checkSymbol identifier globalTable = >>= (flip unless undefinedSymbolError . (isDefined ||)) expression :: SymbolTable -> AST.Expression -> NameAnalysis () -expression globalTable (AST.VariableExpression identifier) = - checkSymbol identifier globalTable +expression globalTable (AST.VariableExpression variableExpression) = + variableAccess globalTable variableExpression expression _ (AST.LiteralExpression _) = pure () expression globalTable (AST.NegationExpression negation) = expression globalTable negation @@ -126,27 +126,33 @@ expression globalTable (AST.ProductExpression lhs rhs) expression globalTable (AST.DivisionExpression lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.EqualExpression lhs rhs) + +variableAccess :: SymbolTable -> AST.VariableAccess -> NameAnalysis () +variableAccess globalTable (AST.ArrayAccess arrayExpression indexExpression) + = variableAccess globalTable arrayExpression + >> expression globalTable indexExpression +variableAccess globalTable (AST.VariableAccess identifier) = + checkSymbol globalTable identifier + +condition :: SymbolTable -> AST.Condition -> NameAnalysis () +condition globalTable (AST.EqualCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.NonEqualExpression lhs rhs) +condition globalTable (AST.NonEqualCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.LessExpression lhs rhs) +condition globalTable (AST.LessCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.GreaterExpression lhs rhs) +condition globalTable (AST.GreaterCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.LessOrEqualExpression lhs rhs) +condition globalTable (AST.LessOrEqualCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.GreaterOrEqualExpression lhs rhs) +condition globalTable (AST.GreaterOrEqualCondition lhs rhs) = expression globalTable lhs >> expression globalTable rhs -expression globalTable (AST.ArrayExpression arrayExpression indexExpression) - = expression globalTable arrayExpression - >> expression globalTable indexExpression enter :: Identifier -> Info -> SymbolTable -> NameAnalysis SymbolTable enter identifier info table |
