File: FunctionCall.hpp

package info (click to toggle)
fauhdlc 20180504-2
  • links: PTS
  • area: main
  • in suites: buster
  • size: 2,956 kB
  • sloc: cpp: 23,188; ansic: 6,077; yacc: 3,764; lex: 763; makefile: 605; sh: 494; xml: 403
file content (136 lines) | stat: -rw-r--r-- 3,518 bytes parent folder | download | duplicates (3)
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
129
130
131
132
133
134
135
136
/* $Id$ 
 *
 * AST node representing a function call.
 *
 * Copyright (C) 2007-2009 FAUmachine Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */


#ifndef __FUNCTION_CALL_HPP_INCLUDED
#define __FUNCTION_CALL_HPP_INCLUDED

#include <list>
#include <cassert>
#include "frontend/ast/Name.hpp"
#include "frontend/ast/Expression.hpp"
#include "frontend/ast/FunctionDeclaration.hpp"
#include "frontend/ast/AssociationElement.hpp"

namespace ast {

//! represents a function call
/** This class represents one VHDL Function call.
 */
class FunctionCall : public Expression {
public:
	//! c'tor Functions with various arguments.
	/** @param fName name referring to the function declaration.
	 *  @param args argument list.
	 *  @param loc Location of the function call.
	 */
	FunctionCall(
		Name *fName,
		std::list<AssociationElement*> *args,
		Location loc
		) : 	Expression(loc),
			subprog(fName),
			arguments(args),
			definition(NULL) {}

	//! c'tor for unary Operator.
	/** @param fName name referring to the operator declaration.
	 *  @param operand operand of the unary operator.
	 *  @param loc Location of the operator symbol.
	 */
	FunctionCall(
		Name *fName,
		Expression *operand,
		Location loc
		) : 	Expression(loc),
			subprog(fName),
			arguments(new std::list<AssociationElement*>()),
			definition(NULL) {

			assert(operand);

			AssociationElement *elem = 
				new AssociationElement(NULL, operand, 
							operand->location);
			this->arguments->push_back(elem);
	}

	//! c'tor for binary Operator.
	/** @param fName name referring to the operator declaration.
	 *  @param left left operand of the binary operator.
	 *  @param right right operand of the binary operator.
	 *  @param loc Location of the operator symbol.
	 */
	FunctionCall(
		Name *fName,
		Expression *left,
		Expression *right,
		Location loc
		) : 	Expression(loc),
			subprog(fName),
			arguments(new std::list<AssociationElement*>()),
			definition(NULL) {

			assert(left);
			assert(right);

			AssociationElement *elem = 
				new AssociationElement(NULL, left, 
							left->location);
			this->arguments->push_back(elem);
			elem = new AssociationElement(NULL, right, 
							right->location);

			this->arguments->push_back(elem);
	}


	//! Accept a Visitor.
 	/** All leaf AST nodes need to implement this method.
         *
         *  @param visitor the Visitor that can visit this node.
         */
	virtual void accept(Visitor& visitor) {
		visitor.visit(*this);
	}

	/** Put a textual representation of the AstNode on the stream.
	 *  @param stream stream to put the textual representation to.
	 */
	virtual void put(std::ostream &stream) const {
		stream << this->subprog;
		if (  (this->arguments != NULL) 
		   && (this->arguments->size() > 1)) {
		   	stream << "(";
			util::MiscUtil::listPut(this->arguments, stream, ", ");
			stream << ')';
		}
	}


	/** name of the called function. */
	Name *subprog;
	/** arguments of the function call. */
	std::list<AssociationElement*> *arguments;
	/** definition of the FunctionCall */
	FunctionDeclaration *definition;

protected:
	/** Destructor */
	virtual ~FunctionCall() {
		util::MiscUtil::terminate(subprog);
		util::MiscUtil::lterminate(arguments);
		util::MiscUtil::terminate(definition);
	}
};

}; /* namespace ast */

#endif /* __FUNCTION_CALL_HPP_INCLUDED */