2009-06-09 11 views

Antwort

0

flex/lex und bison/yacc sind zwei gute Werkzeuge, um solche Dinge zu entwickeln. Das Melden von For-Loop-Fehlern scheint eine sehr spezifische Sache zu sein, die Sie brauchen, also müssen Sie vielleicht Ihren eigenen Lexer und Parser schreiben, damit er das tut, was Sie wollen.

Bisons manual ist ziemlich umfassend.

Mit diesem gesagt, warum nicht einfach die Fehlermeldungen Ihres Compilers verwenden, um herauszufinden, ob Sie die for-Schleife falsch geschrieben haben?

0

Für rein lexikalische Analyse, könnten Sie verwenden, reguläre Ausdrücke oder einer der Dutzende Scanner-Generatoren (flex/lex, ANTLR). Für die syntaktische Analyse benötigen Sie wahrscheinlich einen Parsergenerator, der eine kontextfreie Grammatik lesen kann. Wie dem auch sei, die meisten C++ - Parser sind handgeschrieben. Ich bin mir nicht sicher, ob sogar ein LALR-Parser den Trick machen würde; Vielleicht musst du die großen Waffen herausholen und etwas wie Bisons GLR-Unterstützung benutzen. Für eine Tonne mehr Informationen zur lexikalischen/syntaktischen Analyse empfehle ich auch 'The Dragon Book'. Viel Glück!

2

Der Compiler wird sich beschweren, sehr laut, wenn Sie für Schleife eine illegale schreiben:

for (int i) 

werden an jedem Compiler auf dem Markt einen großen lauten Fehler.

Allerdings sind viele "Fehler" für die Regelschleife vollkommen legal.

Ich nehme an, Sie versuchen, legal für Schleifen zu kennzeichnen, die nicht bedeuten, was Sie wollen, dass sie bedeuten. Das Problem ist natürlich, dass the compiler has no way of knowing what you mean. Sie können jeden der drei Teile in der Schleife legal auslassen, und es ist üblich, alle drei Teile wegzulassen. Darüber hinaus können Sie mehr als eine Sache in jedem Teil auch tun:

for (int i = 0, MAX_ITERS = 20; ; ++i, --MAX_ITERS) { 
    if (MAX_ITERS == 0 || i > MAX_ITERS) 
     break; 
    if (i % 2 == 0) 
     continue; 
    std::cout << i << ',' << MAX_ITERS << '\n'; 
} 

Und natürlich sind die meisten Schleifenfehler völlig unmöglich, einen Compiler zu finden, wie zum Beispiel das Schreiben i < 10 wenn Sie i <= 10 bedeuten.

2

Ich vermute, dass was Sie wollen, ist kein lexikalischer Analysator, der nur einzelne Token betrachtet und Teil eines Compilers ist, sondern ein statischer Analysator, der Code betrachtet und mögliche Fehler vorschlagen kann. Schauen Sie sich diese Fragen: