OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
Macro.cpp
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2// $RCSfile: Macro.cpp,v $
3// ------------------------------------------------------------------------
4// $Revision: 1.1.1.1 $
5// ------------------------------------------------------------------------
6// Copyright: see Copyright.readme
7// ------------------------------------------------------------------------
8//
9// Class: Macro/
10// Abstract base class for OPAL macro-like commands.
11//
12// ------------------------------------------------------------------------
13//
14// $Date: 2000/03/27 09:33:43 $
15// $Author: Andreas Adelmann $
16//
17// ------------------------------------------------------------------------
18
19#include "OpalParser/Macro.h"
23
24// Class Macro
25// ------------------------------------------------------------------------
26
27Macro::Macro(int size, const char* name, const char* help)
28 : Object(size, name, help), formals(), actuals() {}
29
30Macro::Macro(const std::string& name, Object* parent)
31 : Object(name, parent), formals(), actuals() {}
32
34
35Macro* Macro::clone(const std::string&) {
36 throw ParseError(
37 "Macro::clone()",
38 "You cannot execute the command \"" + getOpalName() + "\" without parameters.");
39}
40
41const std::string Macro::getCategory() const { return "MACRO"; }
42
43bool Macro::shouldTrace() const { return false; }
44
45bool Macro::shouldUpdate() const { return false; }
46
48 // We start after the opening '('.
49 actuals.clear();
50
51 if (!stat.delimiter(')')) {
52 int level = 1;
53 std::vector<Token> act;
54
55 while (true) {
56 Token token = stat.getCurrent();
57
58 if (token.isDel(',')) {
59 // Comma at level=1 terminates an actual argument.
60 if (level == 1) {
61 actuals.push_back(act);
62 act.clear();
63 continue;
64 }
65 } else if (token.isDel('(')) {
66 level++;
67 } else if (token.isDel(')')) {
68 // Closing parenthesis at level=1 terminates the actuals list.
69 if (--level == 0) {
70 actuals.push_back(act);
71 act.clear();
72 break;
73 }
74 }
75
76 // In all other casses append token to current actual.
77 act.push_back(token);
78 }
79 }
80}
81
83 // We start after the opening '('.
84 formals.clear();
85 if (!stat.delimiter(')')) {
86 do {
87 std::string form = Expressions::parseString(stat, "Expected formal argument name.");
88 formals.push_back(form);
89 } while (stat.delimiter(','));
90
92 }
93
95}
Abstract base class for macros.
Definition Macro.h:33
std::vector< std::vector< Token > > actuals
The actual argument list.
Definition Macro.h:77
virtual const std::string getCategory() const
Return the object category as a string.
Definition Macro.cpp:41
virtual Macro * clone(const std::string &name)
Make clone.
Definition Macro.cpp:35
virtual bool shouldUpdate() const
Update flag.
Definition Macro.cpp:45
virtual ~Macro()
Definition Macro.cpp:33
virtual void parseFormals(Statement &)
Parse formal arguments.
Definition Macro.cpp:82
std::vector< std::string > formals
The formal argument list.
Definition Macro.h:73
virtual void parseActuals(Statement &)
Parse actual arguments.
Definition Macro.cpp:47
virtual bool shouldTrace() const
Trace flag.
Definition Macro.cpp:43
The base class for all OPAL objects.
Definition Object.h:45
const std::string & getOpalName() const
Return object name.
Definition Object.cpp:267
Parse exception.
Definition ParseError.h:31
Interface for statements.
Definition Statement.h:37
Token & getCurrent()
Return current token and skip it.
Definition Statement.cpp:61
bool delimiter(char c)
Test for delimiter.
Definition Statement.cpp:83
Representation of a single input token.
Definition Token.h:32
bool isDel(char del) const
Test for delimiter.
Definition Token.cpp:81
std::string parseString(Statement &, const char msg[])
Parse string value.
void parseDelimiter(Statement &stat, char delim)
Test for one-character delimiter.