diff options
Diffstat (limited to 'src/data')
-rw-r--r-- | src/data/project.cpp | 13 | ||||
-rw-r--r-- | src/data/project.h | 21 | ||||
-rw-r--r-- | src/data/tikzassembler.cpp | 54 | ||||
-rw-r--r-- | src/data/tikzassembler.h | 42 | ||||
-rw-r--r-- | src/data/tikzdocument.cpp | 4 | ||||
-rw-r--r-- | src/data/tikzgraphassembler.cpp | 33 | ||||
-rw-r--r-- | src/data/tikzgraphassembler.h | 31 | ||||
-rw-r--r-- | src/data/tikzlexer.l | 3 | ||||
-rw-r--r-- | src/data/tikzparser.y | 15 | ||||
-rw-r--r-- | src/data/tikzparserdefs.h | 2 |
10 files changed, 148 insertions, 70 deletions
diff --git a/src/data/project.cpp b/src/data/project.cpp new file mode 100644 index 0000000..b129dc0 --- /dev/null +++ b/src/data/project.cpp @@ -0,0 +1,13 @@ +#include "project.h" + +#include "QDebug" + +Project::Project(QObject *parent) : QObject(parent) +{ + +} + +void Project::addStyle(QString name, GraphElementData *properties) +{ + qDebug() << "got style {" << name << "} = [" << properties << "]"; +} diff --git a/src/data/project.h b/src/data/project.h new file mode 100644 index 0000000..cbc2cb9 --- /dev/null +++ b/src/data/project.h @@ -0,0 +1,21 @@ +#ifndef PROJECT_H +#define PROJECT_H + +#include "graphelementdata.h" + +#include <QObject> +#include <QString> + +class Project : public QObject +{ + Q_OBJECT +public: + explicit Project(QObject *parent = 0); + void addStyle(QString name, GraphElementData *properties); + +signals: + +public slots: +}; + +#endif // PROJECT_H diff --git a/src/data/tikzassembler.cpp b/src/data/tikzassembler.cpp new file mode 100644 index 0000000..456464a --- /dev/null +++ b/src/data/tikzassembler.cpp @@ -0,0 +1,54 @@ +#include "tikzassembler.h" + +#include "tikzparserdefs.h" +#include "tikzparser.parser.hpp" +#include "tikzlexer.h" + +int yyparse(void *scanner); + +TikzAssembler::TikzAssembler(Graph *graph, QObject *parent) : + QObject(parent), _graph(graph), _project(0) +{ + yylex_init(&scanner); + yyset_extra(this, scanner); +} + +TikzAssembler::TikzAssembler(Project *project, QObject *parent) : + QObject(parent), _graph(0), _project(project) +{ + yylex_init(&scanner); + yyset_extra(this, scanner); +} + +void TikzAssembler::addNodeToMap(Node *n) { _nodeMap.insert(n->name(), n); } +Node *TikzAssembler::nodeWithName(QString name) { return _nodeMap[name]; } + +bool TikzAssembler::parse(const QString &tikz) +{ + yy_scan_string(tikz.toLatin1().data(), scanner); + int result = yyparse(scanner); + + if (result == 0) return true; + else return false; +} + +Graph *TikzAssembler::graph() const +{ + return _graph; +} + +Project *TikzAssembler::project() const +{ + return _project; +} + +bool TikzAssembler::isGraph() const +{ + return _graph != 0; +} + +bool TikzAssembler::isProject() const +{ + return _project != 0; +} + diff --git a/src/data/tikzassembler.h b/src/data/tikzassembler.h new file mode 100644 index 0000000..8dbbc9b --- /dev/null +++ b/src/data/tikzassembler.h @@ -0,0 +1,42 @@ +/** + * Convenience class to hold the parser state while loading tikz graphs or projects. + */ + +#ifndef TIKZASSEMBLER_H +#define TIKZASSEMBLER_H + +#include "node.h" +#include "graph.h" +#include "project.h" + +#include <QObject> +#include <QHash> + +class TikzAssembler : public QObject +{ + Q_OBJECT +public: + explicit TikzAssembler(Graph *graph, QObject *parent = 0); + explicit TikzAssembler(Project *project, QObject *parent = 0); + void addNodeToMap(Node *n); + Node *nodeWithName(QString name); + bool parse(const QString &tikz); + + Graph *graph() const; + Project *project() const; + bool isGraph() const; + bool isProject() const; + + +signals: + +public slots: + +private: + QHash<QString,Node*> _nodeMap; + Graph *_graph; + Project *_project; + void *scanner; +}; + +#endif // TIKZASSEMBLER_H diff --git a/src/data/tikzdocument.cpp b/src/data/tikzdocument.cpp index 13d4c6e..a3fa961 100644 --- a/src/data/tikzdocument.cpp +++ b/src/data/tikzdocument.cpp @@ -5,7 +5,7 @@ #include <QMessageBox> #include "tikzdocument.h" -#include "tikzgraphassembler.h" +#include "tikzassembler.h" TikzDocument::TikzDocument(QObject *parent) : QObject(parent) { @@ -58,7 +58,7 @@ void TikzDocument::open(QString fileName) file.close(); Graph *newGraph = new Graph(this); - TikzGraphAssembler ass(newGraph); + TikzAssembler ass(newGraph); if (ass.parse(_tikz)) { delete _graph; _graph = newGraph; diff --git a/src/data/tikzgraphassembler.cpp b/src/data/tikzgraphassembler.cpp deleted file mode 100644 index c05a5c8..0000000 --- a/src/data/tikzgraphassembler.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "tikzgraphassembler.h" - -#include "tikzparserdefs.h" -#include "tikzparser.parser.hpp" -#include "tikzlexer.h" - -int yyparse(void *scanner); - - -TikzGraphAssembler::TikzGraphAssembler(Graph *graph, QObject *parent) : - QObject(parent), _graph(graph) -{ - yylex_init(&scanner); - yyset_extra(this, scanner); -} - -void TikzGraphAssembler::addNodeToMap(Node *n) { _nodeMap.insert(n->name(), n); } -Node *TikzGraphAssembler::nodeWithName(QString name) { return _nodeMap[name]; } - -bool TikzGraphAssembler::parse(const QString &tikz) -{ - yy_scan_string(tikz.toLatin1().data(), scanner); - int result = yyparse(scanner); - - if (result == 0) return true; - else return false; -} - -Graph *TikzGraphAssembler::graph() const -{ - return _graph; -} - diff --git a/src/data/tikzgraphassembler.h b/src/data/tikzgraphassembler.h deleted file mode 100644 index 79b89b0..0000000 --- a/src/data/tikzgraphassembler.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef TIKZGRAPHASSEMBLER_H -#define TIKZGRAPHASSEMBLER_H - -#include "node.h" -#include "graph.h" - -#include <QObject> -#include <QHash> - -class TikzGraphAssembler : public QObject -{ - Q_OBJECT -public: - explicit TikzGraphAssembler(Graph *graph, QObject *parent = 0); - void addNodeToMap(Node *n); - Node *nodeWithName(QString name); - bool parse(const QString &tikz); - - Graph *graph() const; - -signals: - -public slots: - -private: - QHash<QString,Node*> _nodeMap; - Graph *_graph; - void *scanner; -}; - -#endif // TIKZGRAPHASSEMBLER_H diff --git a/src/data/tikzlexer.l b/src/data/tikzlexer.l index 800ef8e..faf0d43 100644 --- a/src/data/tikzlexer.l +++ b/src/data/tikzlexer.l @@ -38,11 +38,12 @@ %} %option reentrant bison-bridge bison-locations 8bit +%option bison-locations 8bit %option nounput %option yylineno %option noyywrap %option header-file="tikzlexer.h" -%option extra-type="TikzGraphAssembler *" +%option extra-type="TikzAssembler *" %s props %s xcoord diff --git a/src/data/tikzparser.y b/src/data/tikzparser.y index aa6ac76..a4db3dd 100644 --- a/src/data/tikzparser.y +++ b/src/data/tikzparser.y @@ -62,7 +62,7 @@ #include "graphelementproperty.h" #include "tikzlexer.h" -#import "tikzgraphassembler.h" +#import "tikzassembler.h" /* the assembler (used by this parser) is stored in the lexer state as "extra" data */ #define assembler yyget_extra(scanner) @@ -127,9 +127,20 @@ void yyerror(YYLTYPE *yylloc, void *scanner, const char *str) { %% + +tikz: tikzstyles | tikzpicture; + +tikzstyles: tikzstyles tikzstyle | ; +tikzstyle: "\\tikzstyle" DELIMITEDSTRING "=" "[" properties "]" + { + if (assembler->isProject()) { + assembler->project()->addStyle(QString($2), $5); + } + } + tikzpicture: "\\begin{tikzpicture}" optproperties tikzcmds "\\end{tikzpicture}" { - if ($2) { + if (assembler->isGraph() && $2) { assembler->graph()->setData($2); } }; diff --git a/src/data/tikzparserdefs.h b/src/data/tikzparserdefs.h index 9d4bfe8..b51a8c9 100644 --- a/src/data/tikzparserdefs.h +++ b/src/data/tikzparserdefs.h @@ -4,7 +4,7 @@ #include "graphelementproperty.h" #include "graphelementdata.h" #include "node.h" -#include "tikzgraphassembler.h" +#include "tikzassembler.h" #include <QString> #include <QRectF> |