Project

General

Profile

root / trunk / compiler / cppAst / ast / statements / Assignment.hpp @ 7

1
/**
2
  *
3
  *                  OOAS Compiler - C++ AST
4
  *
5
  * Copyright 2015, AIT Austrian Institute of Technology.
6
  * All rights reserved.
7
  *
8
  * SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
9
  *
10
  * If you modify the file please update the list of contributors below to in-
11
  * clude your name. Please also stick to the coding convention of using TABs
12
  * to do the basic (block-level) indentation and spaces for anything after
13
  * that. (Enable the display of special chars and it should be pretty obvious
14
  * what this means.) Also, remove all trailing whitespace.
15
  *
16
  * Contributors:
17
  *               Willibald Krenn (AIT)
18
  *               Stephan Zimmerer (AIT)
19
  *               Christoph Czurda (AIT)
20
  *
21
  */
22

    
23

    
24

    
25

    
26
#pragma once
27

    
28
#include <ast/statements/Statement.hpp>
29
#include <ast/IScope.hpp>
30
#include <deque>
31
#include <ast/SymbolTable.hpp>
32
#include <ast/IAstVisitor.hpp>
33
#include <base/Exceptions.hpp>
34

    
35
namespace Ast {
36

    
37
class Assignment final
38
        : public Statement
39
        , public IScope
40
{
41
protected:
42
        SymbolTable* m_symbols;
43
        Expression* m_nondetExpression;
44
        IScope* m_parentScope;
45
        ExpressionList m_places;
46
        ExpressionList m_values;
47

    
48
        Assignment():
49
                Statement(StatementKind::Assignment),
50
                m_symbols (nullptr),
51
                m_nondetExpression (nullptr),
52
                m_parentScope (nullptr),
53
                m_places (),
54
                m_values ()
55
        {};
56
        Assignment(const Assignment& toCopy):
57
                Statement(toCopy),
58
                m_symbols (toCopy.m_symbols),
59
                m_nondetExpression (toCopy.m_nondetExpression),
60
                m_parentScope (toCopy.m_parentScope),
61
                m_places (toCopy.m_places),
62
                m_values (toCopy.m_values)
63
        {};
64

    
65
        static Assignment* create() {return new Assignment();}
66
        static Assignment* createCopy(const Assignment& toCopy) {return new Assignment(toCopy);}
67
public:
68
        friend class Ast;
69
        friend class Statement;
70

    
71
        void init(std::int32_t line, std::int32_t pos, IScope* scopeRef,
72
                                Expression* nonDetExprRef, ExpressionList* placeExprListRef,
73
                                ExpressionList* valueExprListRef, SymbolTable*symTabRef)
74
        {
75
                Statement::init(line,pos);
76
                m_parentScope = scopeRef;
77
                m_nondetExpression = nonDetExprRef;
78
                m_places = std::move(*placeExprListRef);
79
                m_values = std::move(*valueExprListRef);
80
                m_symbols = symTabRef;
81
        }
82

    
83
        ExpressionList& places() {return m_places;};
84
        ExpressionList& values() {return m_values;};
85
        Expression* nondetExpression() {return m_nondetExpression;};
86
        SymbolTable* symbols() {return m_symbols;};
87

    
88
        void addPlace(Expression* aPlace) {m_places.push_back(aPlace);};
89
        void addValue(Expression* aValue) {m_values.push_back(aValue);};
90
        void setNondetExpression(Expression* anExpr) {m_nondetExpression = anExpr;};
91
        void accept(IAstVisitor& visitor) override {visitor.visit(this);};
92
        Identifier* resolveIdentifier(const std::string& aName) const override { return m_symbols->get(aName); };
93
        IScope* getParentScope() const override {return m_parentScope;};
94
        std::string getScopeName() const override {return "";}
95
        void setParentScope(IScope* parentScope) override {m_parentScope = parentScope;};
96
        void addIdentifier(Identifier* anIdentifier, void* ) override {m_symbols->addIdentifier(anIdentifier);};
97

    
98
        IScope* asScope() final {return (IScope*) this;}
99
};
100
}