From aaf95f2838f1b4328c54bbe540371c450f239708 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@nokia.com> Date: Tue, 21 Sep 2010 18:41:09 +0200 Subject: [PATCH] C++ dump: terminals not contained in the AST are now also shown. --- tests/manual/cplusplus-dump/main.cpp | 40 +++++++++++++++++++++------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/tests/manual/cplusplus-dump/main.cpp b/tests/manual/cplusplus-dump/main.cpp index f8f246aa0da..a15049965c5 100644 --- a/tests/manual/cplusplus-dump/main.cpp +++ b/tests/manual/cplusplus-dump/main.cpp @@ -76,6 +76,8 @@ public: out << "digraph AST { ordering=out;" << std::endl; // std::cout << "rankdir = \"LR\";" << std::endl; + + generateTokens(); accept(ast); typedef QPair<QByteArray, QByteArray> Pair; @@ -113,17 +115,35 @@ protected: return name; } + QByteArray terminalId(unsigned token) + { return 't' + QByteArray::number(token); } + void terminal(unsigned token, AST *node) { - static int count = 1; - QByteArray id = 't' + QByteArray::number(count++); - _connections.append(qMakePair(_id[node], id)); - - QByteArray t; - t.append(id); - t.append(" [label = \""); - t.append(spell(token)); - t.append("\" shape=rect]"); - _terminalShapes.append(t); + _connections.append(qMakePair(_id[node], terminalId(token))); + } + + void generateTokens() { + for (unsigned token = 1; token < translationUnit()->tokenCount(); ++token) { + if (translationUnit()->tokenKind(token) == T_EOF_SYMBOL) + break; + + QByteArray t; + + t.append(terminalId(token)); + t.append(" [shape=rect label = \""); + t.append(spell(token)); + t.append("\"]"); + + if (token > 1) { + t.append("; "); + t.append(terminalId(token - 1)); + t.append(" -> "); + t.append(terminalId(token)); + t.append(" [arrowhead=\"vee\" color=\"transparent\"]"); + } + + _terminalShapes.append(t); + } } virtual void nonterminal(AST *ast) { -- GitLab