2017-06-28 3 views
-3

finden tut ich eine kleine Programmiersprache schreibe, die nur ein Schlüsselwort hat, die write ist Ich habe nicht einen Parser aber Lexer getan Es funktioniert gut, bis es zu " Token bekommtSchreibe eine Lexer. Lexer "

..

main.cpp:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <vector> 
using namespace std; 

int main(int argc, char* argv[2]) 
{ 
    char text; 
    string tok = ""; 
    string str = ""; 
    vector <string> tokens; 

    fstream inFile(argv[1]); 

    while (inFile >> noskipws >> text) 
    { 
     tok += text; 

     if (tok == "write") 
     { 
      tokens.push_back(tok); 
      tok = ""; 
     } 
     else if(tok == "\"") 
     { 
      str += text; 
      tokens.push_back("String:"+str); 
      str = ""; 
      tok = ""; 
      tok += text; 
      } 

     for (auto const& c : tokens) 
      std::cout << c << ' '; 
    } 

    return 0; 
} 

test.txt:

write "hello" 

Ausgang ist:

write write write write write write write ... 

statt,

String:hello 

Was kann ich tun? Irgendwelche Ideen?

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage so bearbeiten, dass sie ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel enthält, das Ihr Problem zusammen mit den Beobachtungen, die Sie im Debugger gemacht haben, reproduziert . –

+0

Debugger gibt keinen Fehler –

+0

Und was sind die Variablenwerte, wenn Sie den Code Zeile für Zeile durchlaufen? Auch 'string tokens [];' sieht falsch aus, hat das überhaupt kompiliert? –

Antwort

0

Ich denke, es sollte skipws statt noskipws sein, weil Sie den Fall nicht behandeln, wenn es whitespace zwischen "write" und "Hallo" trifft; speziell löschen Sie nicht tok, so die nächste Schleife es immer noch denkt, das Token ist ein Leerzeichen.

+0

thnx boiit arbeitete –

+0

thnx sehr sehr –

+0

@GameplayerXd kein Problem – meowgoesthedog