summaryrefslogtreecommitdiff
path: root/src/ast/nodes/SimpleStmtNode.java
blob: 39522425bdb503a8d0b9d93d6de008f65b05faf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package ast.nodes;

import ast.types.*;
import java.util.ArrayList;
import semanticanalysis.SemanticError;
import semanticanalysis.SymbolTable;

/**
 * Node for the `simple_stmt` statement of the grammar.
 */
public class SimpleStmtNode implements Node {

    private final Node assignment;
    private final Node expr;
    private final Node returnStmt;
    private final Node importStmt;

    public SimpleStmtNode(Node assignment, Node expr, Node returnStmt, Node importStmt) {
        this.assignment = assignment;
        this.expr = expr;
        this.returnStmt = returnStmt;
        this.importStmt = importStmt;
    }

    @Override
    public ArrayList<SemanticError> checkSemantics(SymbolTable ST, int _nesting, FunctionType ft) {
        ArrayList<SemanticError> errors = new ArrayList<>();

        if (assignment != null) {
            errors.addAll(assignment.checkSemantics(ST, _nesting, ft));
        }

        if (expr != null) {
            errors.addAll(expr.checkSemantics(ST, _nesting, ft));
        }

        if (returnStmt != null) {
            errors.addAll(returnStmt.checkSemantics(ST, _nesting, ft));
        }

        if (importStmt != null) {
            errors.addAll(importStmt.checkSemantics(ST, _nesting, ft));
        }

        return errors;
    }

    @Override
    public Type typeCheck() {
        return new VoidType();
    }

    @Override
    public String codeGeneration() {
        if (assignment != null) {
            return assignment.codeGeneration();
        }

        if (expr != null) {
            return expr.codeGeneration();
        }

        if (returnStmt != null) {
            return returnStmt.codeGeneration();
        }

        // Not supported
        // if (importStmt != null) {
        // return importStmt.codeGeneration();
        // }

        return "Error: everything is null in Compound node";
    }

    @Override
    public String printAST(String prefix) {
        String str = prefix + "SimpleStmt\n";

        prefix += "  ";

        if (assignment != null) {
            str += assignment.printAST(prefix);
        } else if (expr != null) {
            str += expr.printAST(prefix);
        } else if (returnStmt != null) {
            str += returnStmt.printAST(prefix);
        } else if (importStmt != null) {
            str += importStmt.printAST(prefix);
        }

        return str;
    }

    @Override
    public String toPrint(String prefix) {
        
        String str = prefix;

        if (assignment != null) {
            str += assignment.toPrint("");
        } else if (expr != null) {
            str += expr.toPrint("");
        } else if (returnStmt != null) {
            str += returnStmt.toPrint("");
        } else if (importStmt != null) {
            str += importStmt.toPrint("");
        }

        return str;
    }

    public Node getImportStmt() {
        return importStmt;
    }

    public Node getReturnStmt() {
        return returnStmt;
    }
    
    public Node getAssignment() {
        return assignment;
    }

    public Node getExpr() {
        return expr;
    }

}