1
/* PeTe - Petri Engine exTremE
2
* Copyright (C) 2011 Jonas Finnemann Jensen <jopsen@gmail.com>,
3
* Thomas Søndersø Nielsen <primogens@gmail.com>,
4
* Lars Kærlund Østergaard <larsko@gmail.com>,
6
* This program is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#include "PNMLParser.h"
25
using namespace PetriEngine;
26
using namespace XMLSP;
29
void PNMLParser::parse(const std::string& xml,
30
AbstractPetriNetBuilder* builder){
31
//Clear any left overs
38
this->builder = builder;
41
DOMElement* root = DOMElement::loadXML(xml);
44
//Create inhibitor arcs
45
for(InhibitorArcIter inhb = inhibarcs.begin(); inhb != inhibarcs.end(); inhb++){
46
//Check that source id exists
47
if(id2name.find(inhb->source) == id2name.end()){
49
"XML Parsing error: Inhibitor arc source with id=\"%s\" wasn't found!\n",
50
inhb->source.c_str());
53
//Check that target id exists
54
if(id2name.find(inhb->target) == id2name.end()){
56
"XML Parsing error: Inhibitor arc target with id=\"%s\" wasn't found!\n",
57
inhb->target.c_str());
60
//Find source and target
61
NodeName source = id2name[inhb->source];
62
NodeName target = id2name[inhb->target];
64
//Find target transition
65
for(TransitionIter it = transitions.begin(); it != transitions.end(); it++){
66
if(it->name == target.name){
68
it->cond = source.name + " == 0";
70
it->cond = source.name + " == 0 and ( " + it->cond + " )";
75
//Add all the transition
76
for(TransitionIter it = transitions.begin(); it != transitions.end(); it++)
77
builder->addTransition(it->name, it->cond, it->assign, it->x, it->y);
80
for(ArcIter it = arcs.begin(); it != arcs.end(); it++){
81
//Check that source id exists
82
if(id2name.find(it->source) == id2name.end()){
84
"XML Parsing error: Arc source with id=\"%s\" wasn't found!\n",
88
//Check that target id exists
89
if(id2name.find(it->target) == id2name.end()){
91
"XML Parsing error: Arc target with id=\"%s\" wasn't found!\n",
95
//Find source and target
96
NodeName source = id2name[it->source];
97
NodeName target = id2name[it->target];
99
if(source.isPlace && !target.isPlace){
100
builder->addInputArc(source.name, target.name, it->weight);
101
}else if(!source.isPlace && target.isPlace){
102
builder->addOutputArc(source.name, target.name, it->weight);
105
"XML Parsing error: Arc from \"%s\" to \"%s\" is neight input nor output!\n",
107
target.name.c_str());
115
this->builder = NULL;
124
void PNMLParser::makePetriNet(){
128
void PNMLParser::parseElement(DOMElement* element){
129
DOMElements elements = element->getChilds();
130
DOMElements::iterator it;
131
for(it = elements.begin(); it != elements.end(); it++){
132
if((*it)->getElementName() == "place"){
134
}else if((*it)->getElementName() == "transition"){
135
parseTransition(*it);
136
}else if((*it)->getElementName() == "arc" ||
137
(*it)->getElementName() == "inputArc" ||
138
(*it)->getElementName() == "outputArc"){
140
}else if((*it)->getElementName() == "transportArc"){
141
parseTransportArc(*it);
142
}else if((*it)->getElementName() == "inhibitorArc"){
143
parseInhibitorArc(*it);
144
}else if((*it)->getElementName() == "variable"){
146
} else if((*it)->getElementName() == "queries"){
153
void PNMLParser::parseQueries(DOMElement* element){
156
DOMElements elements = element->getChilds();
157
DOMElements::iterator it;
158
for(it = elements.begin(); it != elements.end(); it++){
159
name = element->getAttribute("name");
160
parseValue(element,query);
164
this->queries.push_back(q);
168
void PNMLParser::parsePlace(DOMElement* element){
170
string name = element->getAttribute("name"),
171
id = element->getAttribute("id");
172
int initialMarking = atoi(element->getAttribute("initialMarking").c_str());
174
DOMElements elements = element->getChilds();
175
DOMElements::iterator it;
176
for(it = elements.begin(); it != elements.end(); it++){
177
if((*it)->getElementName() == "name"){
178
parseValue(*it, name);
179
}else if((*it)->getElementName() == "graphics"){
180
parsePosition(*it, x, y);
181
}else if((*it)->getElementName() == "initialMarking"){
183
parseValue(*it, text);
184
initialMarking = atoi(text.c_str());
188
builder->addPlace(name, initialMarking, x, y);
196
void PNMLParser::parseTransportArc(DOMElement* element){
197
string source = element->getAttribute("source"),
198
transiton = element->getAttribute("transition"),
199
target = element->getAttribute("target");
203
inArc.source = source;
204
inArc.target = transiton;
205
inArc.weight = weight;
206
arcs.push_back(inArc);
209
outArc.source = transiton;
210
outArc.target = target;
211
outArc.weight = weight;
212
arcs.push_back(outArc);
215
void PNMLParser::parseInhibitorArc(DOMElement* element){
217
arc.source = element->getAttribute("source");
218
arc.target = element->getAttribute("target");
220
inhibarcs.push_back(arc);
223
void PNMLParser::parseArc(DOMElement* element){
224
string source = element->getAttribute("source"),
225
target = element->getAttribute("target");
228
DOMElements elements = element->getChilds();
229
DOMElements::iterator it;
230
for(it = elements.begin(); it != elements.end(); it++){
231
if((*it)->getElementName() == "inscription"){
233
parseValue(*it, text);
234
weight = atoi(text.c_str());
245
void PNMLParser::parseTransition(DOMElement* element){
248
t.name = element->getAttribute("name");
249
string id = element->getAttribute("id");
251
DOMElements elements = element->getChilds();
252
DOMElements::iterator it;
253
for(it = elements.begin(); it != elements.end(); it++){
254
if((*it)->getElementName() == "name"){
255
parseValue(*it, t.name);
256
}else if((*it)->getElementName() == "graphics"){
257
parsePosition(*it, t.x, t.y);
258
}else if((*it)->getElementName() == "conditions"){
259
t.cond = (*it)->getCData();
260
}else if((*it)->getElementName() == "assignments"){
261
t.assign = (*it)->getCData();
264
//Add transition to list
265
transitions.push_back(t);
273
void PNMLParser::parseVariable(DOMElement* element){
274
string name = element->getAttribute("name");
275
int initialValue = atoi(element->getAttribute("initial-value").c_str());
276
int range = atoi(element->getAttribute("range").c_str());
279
builder->addVariable(name, initialValue, range);
283
void PNMLParser::parseValue(DOMElement* element, string& text){
284
DOMElements elements = element->getChilds();
285
DOMElements::iterator it;
286
for(it = elements.begin(); it != elements.end(); it++){
287
if((*it)->getElementName() == "value" || (*it)->getElementName() == "text")
288
text = (*it)->getCData();
290
parseValue(*it, text);
294
void PNMLParser::parsePosition(DOMElement* element, double& x, double& y){
295
DOMElements elements = element->getChilds();
296
DOMElements::iterator it;
297
for(it = elements.begin(); it != elements.end(); it++){
298
if((*it)->getElementName() == "position"){
299
x = atof((*it)->getAttribute("x").c_str());
300
y = atof((*it)->getAttribute("y").c_str());
302
parsePosition(*it, x, y);