Interpretieren von Scripts



  • Hi.
    Ich suche einen Weg um Text zu interpretieren.
    Als Bsp:
    The quick :brown: Fox jumps _over_ the fence.
    Jetzt soll an dem Satz alles zwischen : dick, zwischen _ unterstrichen und ^ italic dargestellt werden in HTML.
    Ich hab soweit Routinen die das ganz gut hinbekommen mit find, find_first_of und find_last_of etc. Ersetzt wird mit replace an der Stelle, wo die Token auftreten.
    Nur ist mir das alles ein wenig zu langsam und umständlich, so wie ich es geschrieben habe. Hab leider grad kein Code, weil ich @Arbyte bin.
    Ich suche jetzt allgemein Infos und Hilfen zum Thema Scriptinterpretation usw.
    Könntet Ihr mir da mal weiterhelfen?
    Vielen Dank Ihr lieben!
    lg



  • Was du suchst sind Regular Expression. Pasende Libraries wären zb boost oder pcre.



  • ok, das wäre hier tatsächlcih eine Option.
    Hast du noch ne gute Lektüre zur Hand wenns um richtiges Verstehen von Scripts geht? Also dass das Programm das richtig versteht.
    lg



  • Such mal allgemein nach dem Thema "Parser" und "syntaxgesteuerte Übersetzung" ("syntax directed translation")

    Lektüre über Compilerbau behandelt das Thema auch, aber ich denke das geht dann shcon zu weit 😉



  • Scriptnoob schrieb:

    ok, das wäre hier tatsächlcih eine Option.
    Hast du noch ne gute Lektüre zur Hand wenns um richtiges Verstehen von Scripts geht? Also dass das Programm das richtig versteht.
    lg

    Was meinst du mit versteht? Wenn du mit regulären Ausdrücken arbeitest versteht dein Programm diese Teile "wirklich".



  • Eine Umsetzung des Skripts in einen abstrakten Semantikbaum könnte helfen. Aber was willst du hier überhaupt mit Skripten?



  • man kann doch auch einfach durch den string iterieren, auf alte C-Style Art und Weise...

    #include <iostream>
    #include <string>
    
    const std::string THE_TEXT = "The quick :brown: Fox jumps _over_ the ^fence^.";
    
    const char BOLD_CHAR = ':';
    const char ITALIC_CHAR = '^';
    const char UNDERLINED_CHAR = '_';
    
    int main()
    {
            bool in_bold = false;
            bool in_italic = false;
            bool in_underlined = false;
    
            std::string out;
    
            for(std::string::size_type i = 0; i < THE_TEXT.length(); ++i) {
                    if(THE_TEXT[i] == BOLD_CHAR) {
                            if(!in_bold) { 
                                    out += "<b>";
                                    in_bold = true;
                            } else {
                                    out += "</b>";
                                    in_bold = false;
                            }
                    } else if(THE_TEXT[i] == ITALIC_CHAR) {
                            if(!in_italic) {
                                    out += "<i>";
                                    in_italic = true;
                            } else {
                                    out += "</i>";
                                    in_italic = false;
                            }
                    } else if(THE_TEXT[i] == UNDERLINED_CHAR) {
                            if(!in_underlined) {
                                    out += "<u>"; 
                                    in_underlined = true;
                            } else {
                                    out += "</u>";
                                    in_underlined = false;
                            }
                    } else {
                            out += THE_TEXT[i];
                    }
            }
    
            std::cout << THE_TEXT << std::endl;
            std::cout << out << std::endl;
    }
    

    solange die Formatierungszeichen eben nur 1 Charakter haben, und nicht mehr, da muss man dann std::string::find() und konsorten arbeiten.
    so spart man sich zumindest ne zusätzliche RegExp-Library.

    schau mal den Xml Parser in der ASL von Adobe (OpenSource) an, wie die das gemacht haben (die gehen, soweit ich das durchblickt hab, auch sequentiell durch)



  • Kann ich mir kaum vorstellen (na gut als thedailywtf.com Leser kann ich es mir schon vorstellen), ein (deterministischer) endlicher Automat der aus einem regulären Ausdruck erzeugt wird ist effizienter als das was du da hast.



  • Definiere Bitte schrieb:

    Scriptnoob schrieb:

    ok, das wäre hier tatsächlcih eine Option.
    Hast du noch ne gute Lektüre zur Hand wenns um richtiges Verstehen von Scripts geht? Also dass das Programm das richtig versteht.
    lg

    Was meinst du mit versteht? Wenn du mit regulären Ausdrücken arbeitest versteht dein Programm diese Teile "wirklich".

    Ich möchte einfach ein wenig lernen, wie Compiler oder Scriptinterpreter Ihre Scripts parsen und verstehen :).
    lg



  • Dann solltest du doch mal nach Tutorials und uni-scripten zum Thema Parser, Compilerbau, Syntaxgesteuerte Übersetzung, kontextfreie grammatik suchen. Google wird dir sicher einiges dazu liefern.



  • Helfer in der Not schrieb:

    Kann ich mir kaum vorstellen (na gut als thedailywtf.com Leser kann ich es mir schon vorstellen), ein (deterministischer) endlicher Automat der aus einem regulären Ausdruck erzeugt wird ist effizienter als das was du da hast.

    Ich bezweifel das zumindest das beispiel mit einem regex schneller sein kann. Viel schneller als per array durchlaufen geht es kaum.


Anmelden zum Antworten