Repräsentation eines Input Buffers (für einen Lexer)



  • Hallo,

    wie würde man bevorzugt in C++ einen input buffer verwalten? Bei Clang wird jeweils ein const char* für begin/end genommen. Gibt es bessere Möglichkeiten (z.B. std::istreambuf_iterator<char> )?

    Als Input soll sowohl eine Datei, als auch ein string dienen können (z.B. als Argument an das Programm übergeben, oder über eine API).

    Bisher habe ich ein std::istream* gespeichert (der Client muss bei string-input dann zuerst einen istringstream erzeugen und diesen übergeben). Der istream übernimmt dann auch das Parsen von Zahlen. Allerdings möchte ich nur 'E' als Zehnerpotenzschreibweise zulassen und nicht auch das kleine 'e', oder als Dezimalpunkt sowohl '.', als auch ',' zulassen. Oder ich möchte die genaue Stelle eines Fehlers anzeigen, was aber erschwert wird, weil ich nicht weiß, wie viele Zeichen jetzt gelesen wurden (z.B. wenn der istream die Zahl für mich einließt)

    Falls jemand schon mal etwas in die Richtung gemacht hat und mir Tipps geben könnte würde ich mich freuen.

    LG



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++/CLI mit .NET in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    template<typename InputIterator> foo(InputIterator begin, InputIterator end);
    


  • @SeppJ, danke für Deine Antwort.

    Habe ich das richtig interpretiert:

    template<typename InputIterator>
    class Lexer {
      // ...
    private:
        InputIterator begin;
        InputIterator end;
        // ...
    };
    

    LG

    Edit: ok, so viele Möglichkeiten gibt es da ja nicht. 💡



  • Also unter der Voraussetzung dass immer genug Adressraum für den gesamten Input zur Verfügung und lediglich "input im RAM" sowie "input aus File" unterstützt werden müssen, dann ist char const* begin, char const* end doch ne feine Sache. Das Zauberwort für "input aus File" heisst dann mmap . (Bzw. CreateFileMapping+MapViewOfFile.)
    Was Geschwindigkeit angeht wird man es kaum besser hinbekommen.

    Und durch Weglassen des std::istream wird die Sache vermutlich nochmal ordentlich schneller.

    Alles andere wird meiner Erfahrung nach entweder unnötig langsam (signifikant!), oder eher kompliziert.



  • @hustbaer, vielen Dank für den Input.
    Von diesem mmap hab ich erst kürzlich gelesen, als es um grep ging, werde es mal ausprobieren.

    In dem Fall weiß ich auch gleich was ich als InputIter nehmen soll.

    P.S. ich vergaß, über std::cin sollte es auch funktionieren. Bisher habe ich immer getline verwendet und den string übergeben, ist aber auch nicht das Ware glaube ich.

    Edit: Ich bin soeben zu dem Entschluss gekommen, dass es absolut verrückt ist selbst doubles zu parsen - daher lass ich das lieber mal und mache die Multiplikation mit einer Variable wieder explizit: 5pi -> 5*pi, 5e -> 5*e etc.


Anmelden zum Antworten