222
228
return parseNumberOfExpression(element->parent());
223
229
} else if (strcmp(element->name(), "subterm") == 0 || strcmp(element->name(), "structure") == 0) {
224
230
return parseArcExpression(element->first_node());
231
} else if (strcmp(element->name(), "tuple") == 0) {
232
std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> collectedColors;
233
collectColorsInTuple(element, collectedColors);
234
auto expr = constructAddExpressionFromTupleExpression(element, collectedColors);
235
std::cout << expr->toString() << std::endl;
226
238
printf("Could not parse '%s' as an arc expression\n", element->name());
231
PetriEngine::Colored::GuardExpression_ptr PNMLParser::parseGuardExpression(rapidxml::xml_node<>* element) {
232
if (strcmp(element->name(), "lt") == 0 || strcmp(element->name(), "lessthan") == 0) {
233
auto left = element->first_node();
234
auto right = left->next_sibling();
235
return std::make_shared<PetriEngine::Colored::LessThanExpression>(parseColorExpression(left), parseColorExpression(right));
236
} else if (strcmp(element->name(), "gt") == 0 || strcmp(element->name(), "greaterthan") == 0) {
237
auto left = element->first_node();
238
auto right = left->next_sibling();
239
return std::make_shared<PetriEngine::Colored::GreaterThanExpression>(parseColorExpression(left), parseColorExpression(right));
240
} else if (strcmp(element->name(), "leq") == 0 || strcmp(element->name(), "lessthanorequal") == 0) {
241
auto left = element->first_node();
242
auto right = left->next_sibling();
243
return std::make_shared<PetriEngine::Colored::LessThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
244
} else if (strcmp(element->name(), "geq") == 0 || strcmp(element->name(), "greaterthanorequal") == 0) {
245
auto left = element->first_node();
246
auto right = left->next_sibling();
247
return std::make_shared<PetriEngine::Colored::GreaterThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
248
} else if (strcmp(element->name(), "eq") == 0 || strcmp(element->name(), "equality") == 0) {
249
auto left = element->first_node();
250
auto right = left->next_sibling();
251
return std::make_shared<PetriEngine::Colored::EqualityExpression>(parseColorExpression(left), parseColorExpression(right));
252
} else if (strcmp(element->name(), "neq") == 0 || strcmp(element->name(), "inequality") == 0) {
253
auto left = element->first_node();
254
auto right = left->next_sibling();
255
return std::make_shared<PetriEngine::Colored::InequalityExpression>(parseColorExpression(left), parseColorExpression(right));
256
} else if (strcmp(element->name(), "not") == 0) {
257
return std::make_shared<PetriEngine::Colored::NotExpression>(parseGuardExpression(element->first_node()));
258
} else if (strcmp(element->name(), "and") == 0) {
259
auto left = element->first_node();
260
auto right = left->next_sibling();
261
return std::make_shared<PetriEngine::Colored::AndExpression>(parseGuardExpression(left), parseGuardExpression(right));
262
} else if (strcmp(element->name(), "or") == 0) {
263
auto left = element->first_node();
264
auto right = left->next_sibling();
265
return std::make_shared<PetriEngine::Colored::OrExpression>(parseGuardExpression(left), parseGuardExpression(right));
266
} else if (strcmp(element->name(), "subterm") == 0 || strcmp(element->name(), "structure") == 0) {
267
return parseGuardExpression(element->first_node());
270
printf("Could not parse '%s' as a guard expression\n", element->name());
243
PetriEngine::Colored::ArcExpression_ptr PNMLParser::constructAddExpressionFromTupleExpression(rapidxml::xml_node<>* element,std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> collectedColors){
244
auto initCartesianSet = cartesianProduct(collectedColors[0], collectedColors[1]);
245
for(uint32_t i = 2; i < collectedColors.size(); i++){
246
initCartesianSet = cartesianProduct(initCartesianSet, collectedColors[i]);
248
std::vector<PetriEngine::Colored::NumberOfExpression_ptr> numberOfExpressions;
249
for(auto set : initCartesianSet){
250
std::vector<PetriEngine::Colored::ColorExpression_ptr> colors;
251
for (auto color : set) {
252
colors.push_back(color);
254
std::shared_ptr<PetriEngine::Colored::TupleExpression> tupleExpr = std::make_shared<PetriEngine::Colored::TupleExpression>(std::move(colors));
255
tupleExpr->setColorType(tupleExpr->getColorType(colorTypes));
256
std::vector<PetriEngine::Colored::ColorExpression_ptr> placeholderVector;
257
placeholderVector.push_back(tupleExpr);
258
numberOfExpressions.push_back(std::make_shared<PetriEngine::Colored::NumberOfExpression>(std::move(placeholderVector),1));
260
std::vector<PetriEngine::Colored::ArcExpression_ptr> constituents;
261
for (auto expr : numberOfExpressions) {
262
constituents.push_back(expr);
264
return std::make_shared<PetriEngine::Colored::AddExpression>(std::move(constituents));
267
std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> PNMLParser::cartesianProduct(std::vector<PetriEngine::Colored::ColorExpression_ptr> rightSet, std::vector<PetriEngine::Colored::ColorExpression_ptr> leftSet){
268
std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> returnSet;
269
for(auto expr : rightSet){
270
for(auto expr2 : leftSet){
271
std::vector<PetriEngine::Colored::ColorExpression_ptr> toAdd;
272
toAdd.push_back(expr);
273
toAdd.push_back(expr2);
274
returnSet.push_back(toAdd);
279
std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> PNMLParser::cartesianProduct(std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> rightSet, std::vector<PetriEngine::Colored::ColorExpression_ptr> leftSet){
280
std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>> returnSet;
281
for(auto set : rightSet){
282
for(auto expr2 : leftSet){
283
set.push_back(expr2);
284
returnSet.push_back(set);
290
void PNMLParser::collectColorsInTuple(rapidxml::xml_node<>* element, std::vector<std::vector<PetriEngine::Colored::ColorExpression_ptr>>& collectedColors){
291
if (strcmp(element->name(), "tuple") == 0) {
292
for (auto it = element->first_node(); it; it = it->next_sibling()) {
293
collectColorsInTuple(it->first_node(), collectedColors);
295
} else if (strcmp(element->name(), "all") == 0) {
296
std::vector<PetriEngine::Colored::ColorExpression_ptr> expressionsToAdd;
297
auto expr = parseAllExpression(element);
298
std::unordered_map<uint32_t, std::vector<const PetriEngine::Colored::Color *>> constantMap;
300
expr->getConstants(constantMap, index);
301
for(auto positionColors : constantMap){
302
for(auto color : positionColors.second){
303
expressionsToAdd.push_back(std::make_shared<PetriEngine::Colored::UserOperatorExpression>(color));
306
collectedColors.push_back(expressionsToAdd);
308
} else if (strcmp(element->name(), "subterm") == 0 || strcmp(element->name(), "structure") == 0) {
309
collectColorsInTuple(element->first_node(), collectedColors);
310
} else if (strcmp(element->name(), "userOperator") == 0 || strcmp(element->name(), "dotconstant") == 0 || strcmp(element->name(), "variable") == 0
311
|| strcmp(element->name(), "successor") == 0 || strcmp(element->name(), "predecessor") == 0) {
312
std::vector<PetriEngine::Colored::ColorExpression_ptr> expressionsToAdd;
313
auto color = parseColorExpression(element);
314
expressionsToAdd.push_back(color);
315
collectedColors.push_back(expressionsToAdd);
318
printf("Could not parse '%s' as an arc expression\n", element->name());
323
PetriEngine::Colored::GuardExpression_ptr PNMLParser::parseGuardExpression(rapidxml::xml_node<>* element, bool notFlag) {
324
if (strcmp(element->name(), "lt") == 0 || strcmp(element->name(), "lessthan") == 0) {
325
auto left = element->first_node();
326
auto right = left->next_sibling();
328
return std::make_shared<PetriEngine::Colored::GreaterThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
330
return std::make_shared<PetriEngine::Colored::LessThanExpression>(parseColorExpression(left), parseColorExpression(right));
332
} else if (strcmp(element->name(), "gt") == 0 || strcmp(element->name(), "greaterthan") == 0) {
333
auto left = element->first_node();
334
auto right = left->next_sibling();
337
return std::make_shared<PetriEngine::Colored::LessThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
339
return std::make_shared<PetriEngine::Colored::GreaterThanExpression>(parseColorExpression(left), parseColorExpression(right));
341
} else if (strcmp(element->name(), "leq") == 0 || strcmp(element->name(), "lessthanorequal") == 0) {
342
auto left = element->first_node();
343
auto right = left->next_sibling();
346
return std::make_shared<PetriEngine::Colored::GreaterThanExpression>(parseColorExpression(left), parseColorExpression(right));
348
return std::make_shared<PetriEngine::Colored::LessThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
350
} else if (strcmp(element->name(), "geq") == 0 || strcmp(element->name(), "greaterthanorequal") == 0) {
351
auto left = element->first_node();
352
auto right = left->next_sibling();
355
return std::make_shared<PetriEngine::Colored::LessThanExpression>(parseColorExpression(left), parseColorExpression(right));
357
return std::make_shared<PetriEngine::Colored::GreaterThanEqExpression>(parseColorExpression(left), parseColorExpression(right));
359
} else if (strcmp(element->name(), "eq") == 0 || strcmp(element->name(), "equality") == 0) {
360
auto left = element->first_node();
361
auto right = left->next_sibling();
363
return std::make_shared<PetriEngine::Colored::InequalityExpression>(parseColorExpression(left), parseColorExpression(right));
365
return std::make_shared<PetriEngine::Colored::EqualityExpression>(parseColorExpression(left), parseColorExpression(right));
367
} else if (strcmp(element->name(), "neq") == 0 || strcmp(element->name(), "inequality") == 0) {
368
auto left = element->first_node();
369
auto right = left->next_sibling();
372
return std::make_shared<PetriEngine::Colored::EqualityExpression>(parseColorExpression(left), parseColorExpression(right));
374
return std::make_shared<PetriEngine::Colored::InequalityExpression>(parseColorExpression(left), parseColorExpression(right));
376
} else if (strcmp(element->name(), "not") == 0) {
377
return parseGuardExpression(element->first_node(), true);
378
} else if (strcmp(element->name(), "and") == 0) {
379
auto left = element->first_node();
380
auto right = left->next_sibling();
382
return std::make_shared<PetriEngine::Colored::OrExpression>(parseGuardExpression(left, true), parseGuardExpression(right, true));
384
return std::make_shared<PetriEngine::Colored::AndExpression>(parseGuardExpression(left, false), parseGuardExpression(right, false));
386
} else if (strcmp(element->name(), "or") == 0) {
387
auto left = element->first_node();
388
auto right = left->next_sibling();
389
//There must only be one constituent
390
if(right == nullptr){
391
return parseGuardExpression(left, notFlag);
394
auto parentAnd = std::make_shared<PetriEngine::Colored::AndExpression>(parseGuardExpression(left, true), parseGuardExpression(right, true));
395
for (auto it = right->next_sibling(); it; it = it->next_sibling()) {
396
parentAnd = std::make_shared<PetriEngine::Colored::AndExpression>(parentAnd, parseGuardExpression(it, true));
400
auto parentOr = std::make_shared<PetriEngine::Colored::OrExpression>(parseGuardExpression(left, false), parseGuardExpression(right, false));
401
for (auto it = right->next_sibling(); it; it = it->next_sibling()) {
402
parentOr = std::make_shared<PetriEngine::Colored::OrExpression>(parentOr, parseGuardExpression(it, false));
406
} else if (strcmp(element->name(), "subterm") == 0 || strcmp(element->name(), "structure") == 0) {
407
return parseGuardExpression(element->first_node(), notFlag);
410
printf("Could not parse '%s' as a guard expression\n", element->name());
275
415
PetriEngine::Colored::ColorExpression_ptr PNMLParser::parseColorExpression(rapidxml::xml_node<>* element) {