• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

rocs/RocsCore

  • sources
  • kde-4.12
  • kdeedu
  • rocs
  • RocsCore
  • LoadSave
  • Plugins
  • dotFileFormat
DotGrammar.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Rocs.
3  Copyright 2012 Andreas Cord-Landwehr <cola@uni-paderborn.de>
4 
5  This program is free software; you can redistribute it and/or
6  modify it under the terms of the GNU General Public License as
7  published by the Free Software Foundation; either version 2 of
8  the License, or (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include "DotGrammar.h"
20 #include "DotGraphParsingHelper.h"
21 #include <Document.h>
22 
23 #include <KDebug>
24 
25 #include <boost/spirit/include/qi.hpp>
26 #include <boost/spirit/include/qi_int.hpp>
27 #include <boost/spirit/include/qi_real.hpp>
28 #include <boost/spirit/include/qi_string.hpp>
29 #include <boost/spirit/repository/include/qi_distinct.hpp>
30 #include <boost/spirit/repository/include/qi_confix.hpp>
31 #include <boost/spirit/include/phoenix_core.hpp>
32 #include <boost/spirit/include/phoenix_operator.hpp>
33 #include <boost/spirit/include/phoenix_stl.hpp>
34 
35 using namespace DotParser;
36 
37 #define KGV_MAX_ITEMS_TO_LOAD std::numeric_limits<size_t>::max()
38 
39 // get debug output for parser generator
40 #define BOOST_SPIRIT_DEBUG 1
41 
42 // define skipper for spaces, c style comments, and c++ style comments
43 #define SKIPPER space | confix("//", eol)[*(char_ - eol)] | confix("/*", "*/")[*(char_ - "*/")]
44 
45 // create distinct parser for dot keywords
46 namespace distinct
47 {
48  //[qi_distinct_encapsulation
49  namespace spirit = boost::spirit;
50  namespace standard = boost::spirit::standard;
51  namespace repo = boost::spirit::repository;
52 
53  // Define metafunctions allowing to compute the type of the distinct()
54  // and standard::char_() constructs
55  namespace traits
56  {
57  // Metafunction allowing to get the type of any repository::distinct(...)
58  // construct
59  template <typename Tail>
60  struct distinct_spec
61  : spirit::result_of::terminal<repo::tag::distinct(Tail)>
62  {};
63 
64  // Metafunction allowing to get the type of any standard::char_(...) construct
65  template <typename String>
66  struct char_spec
67  : spirit::result_of::terminal<spirit::tag::standard::char_(String)>
68  {};
69  };
70 
71  // Define a helper function allowing to create a distinct() construct from
72  // an arbitrary tail parser
73  template <typename Tail>
74  inline typename traits::distinct_spec<Tail>::type
75  distinct_spec(Tail const& tail)
76  {
77  return repo::qi::distinct(tail);
78  }
79 
80  // Define a helper function allowing to create a standard::char_() construct
81  // from an arbitrary string representation
82  template <typename String>
83  inline typename traits::char_spec<String>::type
84  char_spec(String const& str)
85  {
86  return standard::char_(str);
87  }
88 
89  // the following constructs the type of a distinct_spec holding a
90  // charset("0-9a-zA-Z_") as its tail parser
91  typedef traits::char_spec<std::string>::type charset_tag_type;
92  typedef traits::distinct_spec<charset_tag_type>::type keyword_tag_type;
93 
94  // Define a new Qi 'keyword' directive usable as a shortcut for a
95  // repository::distinct(char_(std::string("0-9a-zA-Z_")))
96  std::string const keyword_spec("0-9a-zA-Z_");
97  keyword_tag_type const keyword = distinct_spec(char_spec(keyword_spec));
98  //]
99 }
100 
101 // The parser is implemented to fulfull exactly the DOT file specification. For details on the DOT
102 // file format see /usr/share/doc/graphviz/html/info/lang.html or the graphviz website. The used
103 // specification is as follows:
104 //
105 // graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'
106 // stmt_list : [ stmt [ ';' ] [ stmt_list ] ]
107 // stmt : node_stmt
108 // | edge_stmt
109 // | attr_stmt
110 // | ID '=' ID
111 // | subgraph
112 // attr_stmt : (graph | node | edge) attr_list
113 // attr_list : '[' [ a_list ] ']' [ attr_list ]
114 // a_list : ID [ '=' ID ] [ ',' ] [ a_list ]
115 // edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ]
116 // edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ]
117 // node_stmt : node_id [ attr_list ]
118 // node_id : ID [ port ]
119 // port : ':' ID [ ':' compass_pt ]
120 // | ':' compass_pt
121 // subgraph : [ subgraph [ ID ] ] '{' stmt_list '}'
122 // compass_pt : (n | ne | e | se | s | sw | w | nw | c | _)
123 //
124 // Definition for the ID non-terminal: any of
125 // * any string of alphabetic ([a-zA-Z'200-'377]) characters, underscores ('_') or digits ([0-9]), not beginning with a digit;
126 // * a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? );
127 // * any double-quoted string ("...") possibly containing escaped quotes ('")1;
128 // * an <A NAME=html>HTML string</a> (<...>).
129 //
130 // Current problems of the parser:
131 // * parsing of HTML/XML tags not completely implemented
132 // * use of non ascii identifiers can cause parser errors
133 
134 namespace DotParser {
135 
136 namespace phx = boost::phoenix;
137 
138 using boost::phoenix::ref;
139 using boost::phoenix::push_back;
140 using boost::spirit::standard::alpha;
141 using boost::spirit::standard::digit;
142 using boost::spirit::standard::string;
143 using boost::spirit::standard::space;
144 using boost::spirit::qi::_1;
145 using boost::spirit::qi::_val;
146 using boost::spirit::qi::char_;
147 using boost::spirit::qi::eol;
148 using boost::spirit::qi::int_;
149 using boost::spirit::qi::lexeme;
150 using boost::spirit::qi::phrase_parse;
151 using boost::spirit::qi::rule;
152 using boost::spirit::qi::standard::space_type;
153 using boost::spirit::repository::qi::confix;
154 
155 typedef BOOST_TYPEOF(SKIPPER) skipper_type;
156 
157 DotGraphParsingHelper* phelper = 0;
158 
159 template <typename Iterator, typename Skipper = space_type>
160 struct DotGrammar : boost::spirit::qi::grammar<Iterator, Skipper> {
161 
162  DotGrammar() : DotGrammar::base_type(graph) {
163 
164  graph = -distinct::keyword["strict"][&setStrict]
165  >> (distinct::keyword["graph"][&undirectedDataStructure] | distinct::keyword["digraph"][&directedDataStructure])
166  >> -ID[&dataStructureId]
167  >> '{'
168  >> stmt_list
169  >> '}';
170 
171  stmt_list = stmt >> -char_(';') >> -stmt_list;
172 
173  stmt = ( (ID[&attributeId] >> '=' >> ID[&valid])[&applyAttributeList]
174  | attr_stmt
175  | edge_stmt
176  | node_stmt
177  | subgraph
178  );
179 
180  attr_stmt = ( (distinct::keyword["graph"][phx::ref(phelper->attributed)="graph"] >> attr_list[&applyAttributeList])[&setDataStructureAttributes]
181  | (distinct::keyword["node"][phx::ref(phelper->attributed)="node"] >> attr_list[&applyAttributeList])
182  | (distinct::keyword["edge"][phx::ref(phelper->attributed)="edge"] >> attr_list[&applyAttributeList])
183  );
184 
185  attr_list = '[' >> -a_list >>']';
186 
187  a_list = (ID[&attributeId] >> -('=' >> ID[&valid]))[&insertAttributeIntoAttributeList]
188  >> -char_(',') >> -a_list;
189 
190  edge_stmt = (
191  (node_id[&edgebound] | subgraph) >> edgeRHS >> -(attr_list[phx::ref(phelper->attributed)="edge"])
192  )[&createAttributeList][&applyAttributeList][&createPointers][&removeAttributeList];
193 
194  edgeRHS = edgeop[&checkEdgeOperator] >> (node_id[&edgebound] | subgraph) >> -edgeRHS;
195 
196  node_stmt = (
197  node_id[&createData] >> -attr_list
198  )[phx::ref(phelper->attributed)="node"][&createAttributeList][&applyAttributeList][&setDataAttributes][&removeAttributeList];
199 
200  node_id = ID >> -port;
201 
202  port = (':' >> ID >> -(':' >> compass_pt))
203  | (':' >> compass_pt);
204 
205  subgraph = -(distinct::keyword["subgraph"] >> -ID[&subDataStructureId])
206  >> char_('{')[&createSubDataStructure][&createAttributeList]
207  >> stmt_list
208  >> char_('}')[&leaveSubDataStructure][&removeAttributeList];
209 
210  compass_pt = (distinct::keyword["n"] | distinct::keyword["ne"] | distinct::keyword["e"]
211  | distinct::keyword["se"] | distinct::keyword["s"] | distinct::keyword["sw"]
212  | distinct::keyword["w"] | distinct::keyword["nw"]);
213 
214  edgeop = string("->") | string("--");
215 
216  ID = lexeme[
217  // parse alpha-numberic sequence that is not a keyword
218  ( !(distinct::keyword["graph"] | distinct::keyword["edge"] | distinct::keyword["node"])
219  >> char_("a-zA-Z0-9") >> *char_("a-zA-Z0-9_")
220  )
221  // parse number
222  | (-char_('-') >> ('.' >> +digit) | (+digit >> -('.' >> *digit)))
223  // parse anything that is in quotation marks
224  | ('"' >> *(char_ - '"') >> '"')
225  // parse XML attribute sequence
226  | ('<' >> *(char_ - '>') >> '>') //TODO xml parser does not parse interlaced tags
227  ];
228  }
229 
230  rule<Iterator, Skipper> graph;
231  rule<Iterator, std::string(), Skipper> ID;
232  rule<Iterator, Skipper> stmt_list;
233  rule<Iterator, Skipper> stmt;
234  rule<Iterator, Skipper> attr_stmt;
235  rule<Iterator, Skipper> attr_list;
236  rule<Iterator, Skipper> a_list;
237  rule<Iterator, Skipper> edge_stmt;
238  rule<Iterator, std::string(), Skipper> edgeop;
239  rule<Iterator, Skipper> edgeRHS;
240  rule<Iterator, Skipper> node_stmt;
241  rule<Iterator, std::string(), Skipper> node_id;
242  rule<Iterator, std::string(), Skipper> port;
243  rule<Iterator, Skipper> subgraph;
244  rule<Iterator, std::string(), Skipper> compass_pt;
245 };
246 
247 void leaveSubDataStructure()
248 {
249  if (!phelper) {
250  return;
251  }
252  phelper->leaveSubDataStructure();
253 }
254 
255 void setStrict()
256 {
257  kWarning() << "Graphviz \"strict\" keyword is not implemented.";
258 }
259 
260 void undirectedDataStructure()
261 {
262  kDebug() << "Create new data structure of type: Graph undirected";
263  if(!phelper->dataStructure) {
264  DataStructurePtr dataStructure = phelper->gd->addDataStructure("");
265  phelper->dataStructure = boost::static_pointer_cast<Rocs::GraphStructure>(dataStructure);
266  }
267  phelper->gd->pointerType(0)->setDirection(PointerType::Bidirectional);
268 }
269 
270 void directedDataStructure()
271 {
272  kDebug() << "Create new data structure of type: Graph directed";
273  if (!phelper->dataStructure) {
274  DataStructurePtr dataStructure = phelper->gd->addDataStructure("");
275  phelper->dataStructure = boost::static_pointer_cast<Rocs::GraphStructure>(dataStructure);
276  }
277  phelper->gd->pointerType(0)->setDirection(PointerType::Unidirectional);
278 }
279 
280 void dataStructureId(const std::string& str)
281 {
282  QString name = QString::fromStdString(str);
283  kDebug() << "Set data structure name: " << name;
284  if (!phelper->dataStructure) {
285  DataStructurePtr dataStructure = phelper->gd->addDataStructure(name);
286  phelper->dataStructure = boost::static_pointer_cast<Rocs::GraphStructure>(dataStructure);
287  }
288  phelper->dataStructure->setName(name);
289 }
290 
291 void attributeId(const std::string& str)
292 {
293  if (!phelper) {
294  return;
295  }
296  // remove quotation marks
297  QString id = QString::fromStdString(str);
298  if (id.endsWith('"')) {
299  id.remove(id.length()-1, 1);
300  }
301  if (id.startsWith('"')) {
302  id.remove(0, 1);
303  }
304  phelper->attributeId = id;
305  phelper->valid.clear();
306 }
307 
308 void subDataStructureId(const std::string& str)
309 {
310  if (!phelper) {
311  return;
312  }
313  // remove quotation marks
314  QString id = QString::fromStdString(str);
315  if (id.endsWith('"')) {
316  id.remove(id.length()-1, 1);
317  }
318  if (id.startsWith('"')) {
319  id.remove(0, 1);
320  }
321  phelper->setSubDataStructureId(id);
322 }
323 
324 void valid(const std::string& str)
325 {
326  if (!phelper) {
327  return;
328  }
329  // remove quotation marks
330  QString id = QString::fromStdString(str);
331  if (id.endsWith('"')) {
332  id.remove(id.length()-1, 1);
333  }
334  if (id.startsWith('"')) {
335  id.remove(0, 1);
336  }
337  phelper->valid = id;
338 }
339 
340 void insertAttributeIntoAttributeList()
341 {
342  if (!phelper) {
343  return;
344  }
345  phelper->unprocessedAttributes.insert(phelper->attributeId, phelper->valid);
346 }
347 
348 
349 void createAttributeList()
350 {
351  if (!phelper) {
352  return;
353  }
354  phelper->dataStructureAttributeStack.push_back(phelper->dataStructureAttributes);
355  phelper->dataAttributeStack.push_back(phelper->dataAttributes);
356  phelper->pointerAttributeStack.push_back(phelper->pointerAttributes);
357 }
358 
359 void removeAttributeList()
360 {
361  if (!phelper) {
362  return;
363  }
364  phelper->dataStructureAttributes = phelper->dataStructureAttributeStack.back();
365  phelper->dataStructureAttributeStack.pop_back();
366  phelper->dataAttributes = phelper->dataAttributeStack.back();
367  phelper->dataAttributeStack.pop_back();
368  phelper->pointerAttributes = phelper->pointerAttributeStack.back();
369  phelper->pointerAttributeStack.pop_back();
370 }
371 
372 void createData(const std::string& str)
373 {
374  QString id = QString::fromStdString(str);
375  if (!phelper || id.length()==0) {
376  return;
377  }
378  // remove quotation marks
379  if (id.endsWith('"')) {
380  id.remove(id.length()-1, 1);
381  }
382  if (id.startsWith('"')) {
383  id.remove(0, 1);
384  }
385  if (!phelper->dataMap.contains(id)) {
386  phelper->createData(id);
387  }
388 }
389 
390 void createSubDataStructure()
391 {
392  if (!phelper) {
393  return;
394  }
395  phelper->createSubDataStructure();
396 }
397 
398 void setDataStructureAttributes()
399 {
400  if (!phelper) {
401  return;
402  }
403  phelper->setDataStructureAttributes();
404 }
405 
406 void setDataAttributes()
407 {
408  if (!phelper) {
409  return;
410  }
411  phelper->setDataAttributes();
412 }
413 
414 void applyAttributeList()
415 {
416  if (!phelper) {
417  return;
418  }
419  phelper->applyAttributedList();
420 }
421 
422 void checkEdgeOperator(const std::string& str)
423 {
424  if (!phelper) {
425  return;
426  }
427 
428  if (((phelper->gd->pointerType(0)->direction() == PointerType::Unidirectional) && (str.compare("->") == 0)) ||
429  ((phelper->gd->pointerType(0)->direction() == PointerType::Bidirectional) && (str.compare("--") == 0)))
430  {
431  return;
432  }
433 
434  kError() << "Error: incoherent edge direction relation" << endl;
435 }
436 
437 void edgebound(const std::string& str)
438 {
439  if (!phelper) {
440  return;
441  }
442  // remove quotation marks
443  QString id = QString::fromStdString(str);
444  if (id.endsWith('"')) {
445  id.remove(id.length()-1, 1);
446  }
447  if (id.startsWith('"')) {
448  id.remove(0, 1);
449  }
450  phelper->addEdgeBound(id);
451 }
452 
453 void createPointers()
454 {
455  if (!phelper) {
456  return;
457  }
458  phelper->createPointers();
459 }
460 
461 bool parseIntegers(const std::string& str, std::vector<int>& v)
462 {
463  return phrase_parse(str.begin(), str.end(),
464  // Begin grammar
465  (
466  int_[phx::push_back(phx::ref(v), _1)]
467  >> *(',' >> int_[phx::push_back(phx::ref(v), _1)])
468  )
469  ,
470  // End grammar
471  space);
472 }
473 
474 bool parse(const std::string& str, Document * graphDoc)
475 {
476  delete phelper;
477  phelper = new DotGraphParsingHelper;
478  phelper->gd = graphDoc;
479 
480  std::string input(str);
481  std::string::iterator iter = input.begin();
482  DotGrammar<std::string::iterator, skipper_type> r;
483 
484  if (phrase_parse(iter, input.end(), r, SKIPPER)) {
485  kDebug() << "Complete dot file was parsed successfully.";
486  return true;
487  } else {
488  kWarning() << "Dot file parsing failed. Unable to parse:";
489  kDebug() << "///// FILE CONTENT BEGIN /////";
490  kDebug() << QString::fromStdString(std::string(iter, input.end()));
491  kDebug() << "///// FILE CONTENT END /////";
492  }
493  return false;
494 }
495 
496 }
497 
DotParser::dataStructureId
void dataStructureId(const std::string &str)
Definition: DotGrammar.cpp:280
DotParser::parseIntegers
bool parseIntegers(const std::string &str, std::vector< int > &v)
Definition: DotGrammar.cpp:461
DotParser::DotGraphParsingHelper::applyAttributedList
void applyAttributedList()
Generates a new attribute list from all unprocessed attributes and set the corresponding attribute li...
Definition: DotGraphParsingHelper.cpp:93
DotParser::undirectedDataStructure
void undirectedDataStructure()
Definition: DotGrammar.cpp:260
distinct::distinct_spec
traits::distinct_spec< Tail >::type distinct_spec(Tail const &tail)
Definition: DotGrammar.cpp:75
Rocs::GraphStructure
Definition: GraphStructure.h:29
SKIPPER
#define SKIPPER
Definition: DotGrammar.cpp:43
PointerType::Bidirectional
Definition: PointerType.h:48
DotParser::DotGraphParsingHelper::pointerAttributes
AttributesMap pointerAttributes
Definition: DotGraphParsingHelper.h:81
DotParser::setStrict
void setStrict()
Definition: DotGrammar.cpp:255
distinct::char_spec
traits::char_spec< String >::type char_spec(String const &str)
Definition: DotGrammar.cpp:84
DotParser::DotGraphParsingHelper::valid
QString valid
Definition: DotGraphParsingHelper.h:75
DotParser::DotGraphParsingHelper::unprocessedAttributes
AttributesMap unprocessedAttributes
Definition: DotGraphParsingHelper.h:78
DataStructurePtr
boost::shared_ptr< DataStructure > DataStructurePtr
Definition: CoreTypes.h:38
DotParser::createSubDataStructure
void createSubDataStructure()
Definition: DotGrammar.cpp:390
DotParser::createData
void createData(const std::string &str)
Definition: DotGrammar.cpp:372
DotParser::insertAttributeIntoAttributeList
void insertAttributeIntoAttributeList()
Definition: DotGrammar.cpp:340
DotParser::removeAttributeList
void removeAttributeList()
Definition: DotGrammar.cpp:359
DotParser::createPointers
void createPointers()
Definition: DotGrammar.cpp:453
DotParser::edgebound
void edgebound(const std::string &str)
Definition: DotGrammar.cpp:437
DotParser::phelper
DotGraphParsingHelper * phelper
Definition: DotGrammar.cpp:157
DotParser::DotGraphParsingHelper::gd
Document * gd
Definition: DotGraphParsingHelper.h:94
DotParser::setDataStructureAttributes
void setDataStructureAttributes()
Definition: DotGrammar.cpp:398
DotParser::DotGraphParsingHelper::dataStructure
boost::shared_ptr< Rocs::GraphStructure > dataStructure
Definition: DotGraphParsingHelper.h:88
DotParser::setDataAttributes
void setDataAttributes()
Definition: DotGrammar.cpp:406
Document.h
PointerType::Unidirectional
Definition: PointerType.h:47
DotGraphParsingHelper.h
DotParser::DotGraphParsingHelper::attributed
std::string attributed
Definition: DotGraphParsingHelper.h:76
DotParser::createAttributeList
void createAttributeList()
Definition: DotGrammar.cpp:349
DotParser::DotGraphParsingHelper::dataStructureAttributeStack
QList< AttributesMap > dataStructureAttributeStack
Definition: DotGraphParsingHelper.h:82
distinct::keyword
keyword_tag_type const keyword
Definition: DotGrammar.cpp:97
Document::addDataStructure
DataStructurePtr addDataStructure(const QString &name=QString())
Add data structure to graph document with name name.
Definition: Document.cpp:333
DotParser::attributeId
void attributeId(const std::string &str)
Definition: DotGrammar.cpp:291
DotParser::directedDataStructure
void directedDataStructure()
Definition: DotGrammar.cpp:270
distinct::charset_tag_type
traits::char_spec< std::string >::type charset_tag_type
Definition: DotGrammar.cpp:91
DotParser::DotGraphParsingHelper
Definition: DotGraphParsingHelper.h:35
distinct::keyword_tag_type
traits::distinct_spec< charset_tag_type >::type keyword_tag_type
Definition: DotGrammar.cpp:92
DotGrammar.h
DotParser::DotGraphParsingHelper::setSubDataStructureId
void setSubDataStructureId(QString identifier)
Definition: DotGraphParsingHelper.cpp:152
DotParser::checkEdgeOperator
void checkEdgeOperator(const std::string &str)
Definition: DotGrammar.cpp:422
DotParser::DotGraphParsingHelper::leaveSubDataStructure
void leaveSubDataStructure()
Leaves current group, i.e., leave current sub data structure and switches focus to ancestor group or ...
Definition: DotGraphParsingHelper.cpp:163
DotParser::DotGraphParsingHelper::pointerAttributeStack
QList< AttributesMap > pointerAttributeStack
Definition: DotGraphParsingHelper.h:84
Document
Definition: Document.h:41
DotParser::DotGraphParsingHelper::setDataStructureAttributes
void setDataStructureAttributes()
Definition: DotGraphParsingHelper.cpp:68
DotParser::DotGraphParsingHelper::dataAttributeStack
QList< AttributesMap > dataAttributeStack
Definition: DotGraphParsingHelper.h:83
distinct::keyword_spec
std::string const keyword_spec("0-9a-zA-Z_")
subgraph
static const std::string subgraph
Definition: DotFileFormatTest.cpp:35
DotParser::BOOST_TYPEOF
typedef BOOST_TYPEOF(SKIPPER) skipper_type
Document::pointerType
PointerTypePtr pointerType(int pointerType) const
Definition: Document.cpp:207
DotParser::DotGraphParsingHelper::dataAttributes
AttributesMap dataAttributes
Definition: DotGraphParsingHelper.h:80
DotParser::DotGraphParsingHelper::createData
void createData(QString identifier)
Creates new data element and registers the identifier in data map.
Definition: DotGraphParsingHelper.cpp:127
DotParser::applyAttributeList
void applyAttributeList()
Definition: DotGrammar.cpp:414
DotParser::valid
void valid(const std::string &str)
Definition: DotGrammar.cpp:324
DotParser::leaveSubDataStructure
void leaveSubDataStructure()
Definition: DotGrammar.cpp:247
DotParser::DotGraphParsingHelper::dataMap
QMap< QString, DataPtr > dataMap
Definition: DotGraphParsingHelper.h:95
DotParser::parse
bool parse(const std::string &str, Document *graphDoc)
Parse the given string str that represents the textual respresentation of a graph in DOT/Graphviz for...
Definition: DotGrammar.cpp:474
DotParser::subDataStructureId
void subDataStructureId(const std::string &str)
Definition: DotGrammar.cpp:308
DotParser::DotGraphParsingHelper::addEdgeBound
void addEdgeBound(QString bound)
Definition: DotGraphParsingHelper.h:69
DotParser::DotGraphParsingHelper::setDataAttributes
void setDataAttributes()
Definition: DotGraphParsingHelper.cpp:77
DotParser::DotGraphParsingHelper::dataStructureAttributes
AttributesMap dataStructureAttributes
Definition: DotGraphParsingHelper.h:79
DotParser::DotGraphParsingHelper::createSubDataStructure
void createSubDataStructure()
Creates new sub data structure and enters it.
Definition: DotGraphParsingHelper.cpp:145
DotParser::DotGraphParsingHelper::createPointers
void createPointers()
Definition: DotGraphParsingHelper.cpp:172
DotParser::DotGraphParsingHelper::attributeId
QString attributeId
Definition: DotGraphParsingHelper.h:74
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:25 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

rocs/RocsCore

Skip menu "rocs/RocsCore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal