00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef UTAP_SYSTEMBUILDER_HH
00023 #define UTAP_SYSTEMBUILDER_HH
00024
00025 #include <cassert>
00026 #include <vector>
00027 #include <inttypes.h>
00028
00029 #include "utap/builder.hh"
00030 #include "utap/utap.hh"
00031
00032 namespace UTAP
00033 {
00034
00073 class SystemBuilder : public ParserBuilder
00074 {
00075 protected:
00076
00077 static const char *const unsupported;
00078 static const char *const invalid_type;
00079
00080
00081
00082
00083
00084 bool strict_range;
00085
00086
00087 TimedAutomataSystem *system;
00088
00089
00090 ErrorHandler *errorHandler;
00091
00092 position_t position;
00093
00094 private:
00095
00096
00097
00098 class ExpressionFragments
00099 {
00100 private:
00101 std::vector<expression_t> data;
00102 public:
00103 expression_t &operator[] (int idx)
00104 { return data[data.size() - idx - 1]; }
00105 void push(expression_t e)
00106 { data.push_back(e); }
00107 void pop()
00108 { data.pop_back(); }
00109 void pop(int n);
00110 uint32_t size() { return data.size(); }
00111 } fragments;
00112
00113
00114
00115
00116
00117
00118 class TypeFragments
00119 {
00120 private:
00121 std::vector<std::pair<type_t, char *> > data;
00122 public:
00123 ~TypeFragments()
00124 { while (!data.empty()) pop(); }
00125 std::pair<type_t, char *> &operator[] (int idx)
00126 { return data[data.size() - idx - 1]; }
00127 void push(type_t value)
00128 { data.push_back(std::make_pair(value, (char*)NULL)); }
00129 void pop()
00130 { assert(!data.empty()); free(data.back().second); data.pop_back(); }
00131 } typeFragments;
00132
00133
00134
00135
00136
00137
00138 frame_t params;
00139
00140
00141 frame_t frame;
00142
00143
00144 function_t *currentFun;
00145
00146
00147 std::vector<BlockStatement*> blocks;
00148
00149
00150
00151
00152 int32_t guard;
00153 int32_t sync;
00154 int32_t update;
00155
00156
00157
00158
00159
00160
00161 std::list<std::vector<type_t> > expectedArguments;
00162
00163
00164 std::vector<symbol_t> identifierStack;
00165
00166
00167
00168
00169
00170 type_t buildArrayType(type_t type, uint32_t dim);
00171 type_t getElementTypeOfArray(type_t type);
00172 type_t applyPrefix(uint32_t prefix, type_t type);
00173
00174
00175
00176
00177
00178 expression_t makeConstant(int value);
00179
00180 protected:
00181
00183
00185
00186
00187
00188
00189
00190
00191 virtual bool allowProcessReferences() { return false; }
00192
00194
00196
00197
00198
00199 virtual void property(Constants::kind_t, int line, expression_t) {};
00200
00201 public:
00202
00203 SystemBuilder(TimedAutomataSystem *);
00204
00205 virtual void setErrorHandler(ErrorHandler *);
00206 virtual void setPosition(const position_t &);
00207
00208
00209
00210
00211 virtual bool isType(const char*);
00212 virtual bool isLocation(const char*);
00213
00214
00215
00216
00217 virtual void declType(uint32_t prefix, const char* name, bool range);
00218
00219 virtual void declStruct(uint32_t prefix, uint32_t fields);
00220 virtual void declField(const char* name, uint32_t dim);
00221
00222 virtual void declFieldEnd();
00223 virtual void declTypeDef(const char* name, uint32_t dim);
00224
00225 virtual void declTypeDefEnd();
00226
00227
00228
00229
00230 virtual void declVar(const char* name, uint32_t dim, bool init);
00231
00232 virtual void declVarEnd();
00233 virtual void declInitialiserList(uint32_t num);
00234 virtual void declFieldInit(const char* name);
00235
00236
00237
00238
00239 virtual void declParameter(const char* name, bool reference, uint32_t dim);
00240
00241 virtual void declParameterEnd();
00242
00243 virtual void declFuncBegin(const char* name, uint32_t n);
00244 virtual void declFuncEnd();
00245
00246
00247
00248
00249 virtual void procBegin(const char* name, uint32_t n);
00250 virtual void procEnd();
00251 virtual void procState(const char* name, bool hasInvariant);
00252 virtual void procStateCommit(const char* name);
00253 virtual void procStateUrgent(const char* name);
00254 virtual void procStateInit(const char* name);
00255 virtual void procTransition(const char* from, const char* to);
00256
00257 virtual void procGuard();
00258 virtual void procSync(Constants::synchronisation_t type);
00259 virtual void procUpdate();
00260
00261
00262
00263
00264 virtual void blockBegin();
00265 virtual void blockEnd();
00266 virtual void emptyStatement();
00267 virtual void forBegin();
00268 virtual void forEnd();
00269 virtual void whileBegin();
00270 virtual void whileEnd();
00271 virtual void doWhileBegin();
00272 virtual void doWhileEnd();
00273 virtual void ifBegin();
00274 virtual void ifElse();
00275 virtual void ifEnd(bool);
00276 virtual void breakStatement();
00277 virtual void continueStatement();
00278 virtual void switchBegin();
00279 virtual void switchEnd();
00280 virtual void caseBegin();
00281 virtual void caseEnd();
00282 virtual void defaultBegin();
00283 virtual void defaultEnd();
00284 virtual void exprStatement();
00285 virtual void returnStatement(bool);
00286
00287
00288
00289
00290 virtual void exprTrue();
00291 virtual void exprFalse();
00292 virtual void exprId(const char * varName);
00293 virtual void exprNat(int32_t);
00294 virtual void exprCallBegin(const char * functionName);
00295 virtual void exprCallEnd(uint32_t n);
00296 virtual void exprArg(uint32_t n);
00297 virtual void exprArray();
00298 virtual void exprPostIncrement();
00299 virtual void exprPreIncrement();
00300 virtual void exprPostDecrement();
00301 virtual void exprPreDecrement();
00302 virtual void exprAssignment(Constants::kind_t op);
00303 virtual void exprUnary(Constants::kind_t unaryop);
00304 virtual void exprBinary(Constants::kind_t binaryop);
00305 virtual void exprInlineIf();
00306 virtual void exprComma();
00307 virtual void exprDot(const char *);
00308 virtual void exprDeadlock();
00309
00310
00311
00312
00313 virtual void instantiationBegin(const char*, const char*);
00314 virtual void instantiationEnd(const char *, const char *, uint32_t n);
00315 virtual void process(const char*);
00316
00317 virtual void done();
00318
00319 virtual void property(Constants::kind_t, int line);
00320
00321
00322
00323
00324
00325 virtual void beforeUpdate();
00326 virtual void afterUpdate();
00327 };
00328 }
00329 #endif