kostenloser Webspace werbefrei: lima-city


Qt mit foreach + Parsing von Strings

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    robbmaster

    Kostenloser Webspace von robbmaster

    robbmaster hat kostenlosen Webspace.

    Hallo :]
    Ich hoffe mal, die Überschrift hat euch nicht abgeschreckt, ich wusste jedoch nicht gut wie ich es kurz zusammenfassen kann. Es geht um ein Programm, welches ich derzeit in meiner Freizeit mit Qt programmiere.

    Aufbauen auf den Syntax Highlither in der Demo, bin ich dabei einen für die Webscript Sprache PHP aufzusetzen. Dabei trete ich jedoch immer wieder auf mehrere Probleme.

    In der Demo von dem Programm wird mit zwei Methoden das Highlithen betrieben. Beim ersten arbeitet eine foreach-Schleife eine ganze Liste von Schlüsselwörtern ab, bei der zweiten werden Texte innerhalb bzw. nach bestimmten Buchstaben gefärbt (beste Beispiel: " und ', sowie //).

    Das Problem ist, dass ich mehrere Schlüsselwörter listen in PHP habe, die ich verschieden farbig makieren will. :] Problem: Wenn ich das ganze foreach script kopiere, hängt sich das Programm beim schreiben eines Wortes in einer Liste auf. Logisch. Da das Programm ja zwei mal nach jedem Tippen alles überprüfen will. Es überläd sich. Nur weiß ich keinen umweg.

    Ich werde es hier mal zeigen. Die Schlüsselwörter werden über folgenden Befehl hervorgehoben:
    keywordFormat.setForeground(Qt::darkGreen);
        // keywordFormat.setFontWeight(QFont::Bold);
        QStringList keywordPatterns;
        keywordPatterns << "\\babstract\\b" << "\\bas\\b" << "\\bbreak\\b"
                        << "\\bcase\\b" << "\\bcatch\\b" << "\\bclass\\b"
                        << "\\bclone\\b" << "\\bconst\\b" << "\\bcontinue\\b"
                        << "\\bdeclare\\b" << "\\bdefault\\b" << "\\bdo\\b"
                        << "\\belse\\b" << "\\belseif\\b" << "\\benddeclare\\b"
                        << "\\bendfor\\b" << "\\endforeach\\b" << "\\bendif\\b"
                        << "\\bendswitch\\b" << "\\bendwhile\\b" << "\\bextends\\b"
                        << "\\bfinal\\b" << "\\bfor\\b" << "\\bforeach\\b"
                        << "\\bglobal\\b" << "\\bgoto\\b" << "\\bif\\b"
                        << "\\bimplements\\b" << "\\binterface\\b" << "\\binstanceof\\b"
                        << "\\bnamespace\\b" << "\\bnew\\b" << "\\bprivate\\b"
                        << "\\bprotected\\b" << "\\bpublic\\b" << "\\bstatic\\b"
                        << "\\bswitch\\b" << "\\bthrow\\b" << "\\btry\\b"
                        << "\\buse\\b" << "\\bvar\\b" << "\\bwhile\\b";
    
        foreach (const QString &pattern, keywordPatterns) {
            rule.pattern = QRegExp(pattern);
            rule.format = keywordFormat;
            highlightingRules.append(rule);
        }


    Die hier in dem Ausschnitt nicht definierten bzw. deklarierten Abschnitt werden im Headerfile definiert.

    Jetzt möchte ich das ganze auch für die Liste startPatterns machen. Wenn ich da kopiere geht das aber nicht. Nur möchte ich startPatterns eben bold das heißt fett machen und in einer anderen Farbe machen. :] Wie kann ich das machen?


    Desweiteren habe ich dann versucht den Befehl '<?php' [ohne ' ] zu parsen. Es funktioniert nicht. Er ignoriert das < und das ? und hebt nur php hervor. Das weg escapen funktioniert nicht wirklich. :] Wie geht das?

    Vielen Dank schonmal für alle, die dies gelesen haben?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich würd mal vom groben Drübergucken sagen, dass das Suchen und Ersetzen-Prinzip nach obigem Beispiel bei nem dynamischen Text ab ner bestimmten Länge stark an seine Grenzen stoßen wird:

    Die keywordPatterns sind allesamt (sehr ähnliche) reguläre Ausdrücke (siehe: http://doc.trolltech.com/4.6/qregexp.html. Das nagt allerdings sehr an der CPU-Last - und das nach jedem Tastendruck. Du könntest den regulären Ausdruck evtl. optimieren, z.B.
    sowas wie "\\b(abstract|as|break|...)\\b", um die Anzahl der Suchvorgänge zu verringern. Könnte sein, dass das noch nicht die gewünschte Performance bringt.

    Evtl. wird dafür ein Lexer benötigt (siehe http://de.wikipedia.org/wiki/Lexikalischer_Scanner), der den Text zuerst in seine definierten Bausteine (sog. Token, also Element der Sprache PHP) zerlegt, und sie dann an ein Modul weiterreicht, dass sie formatiert wieder zusammensetzt.
  4. everydaynormalguy

    everydaynormalguy hat kostenlosen Webspace.

    Hi, kannst auch mal nen QTimer versuchen, der alle paar millisekunden updatet.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!