-1

C/C++ で for ループ エラーを報告する単純な語彙アナライザーが必要です。

4

4 に答える 4

2

違法な for ループを書くと、コンパイラは非常に大きな音で文句を言います:

for (int i)

市場に出回っているすべてのコンパイラで大きな大きなエラーが発生します。

ただし、多くの for ループの「間違い」は完全に合法です。

私は、あなたが意味したいことを意味しない正当な for ループにフラグを立てようとしていると仮定しています。もちろん、問題は、コンパイラがあなたの意味を知る方法がないことです。ループ内の 3 つの部分のいずれかを正当に除外することができ、3 つの部分すべてを除外するのが一般的です。さらに、各部分で複数のことを行うこともできます。

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';
}

そしてもちろん、ほとんどのループ エラーは、コンパイラが見つけることは完全に不可能i < 10ですi <= 10

于 2009-06-10T00:09:29.510 に答える
2

あなたが必要としているのは、個々のトークンを見てコンパイラの一部である語彙アナライザーではなく、コードを見て潜在的なバグを提案できる静的アナライザーだと思います。次の質問を確認してください。

于 2009-06-10T00:15:51.540 に答える
0

flex /lexとbison /yaccは、そのようなものを開発するための2つの優れたツールです。forループエラーの報告は、必要な非常に具体的なことのように思われるため、独自のレクサーとパーサーを作成して、必要な処理を実行する必要がある場合があります。

バイソンのマニュアルはかなり包括的です。

そうは言っても、コンパイラのエラーメッセージを使用して、forループを間違って記述したかどうかを確認してみませんか?

于 2009-06-09T23:43:28.063 に答える
0

純粋な字句解析の場合は、正規表現、または数十のスキャナー ジェネレーター (flex/lex、ANTLR) のいずれかを使用できます。一方、構文解析の場合は、文脈自由文法を読み取ることができるパーサー ジェネレーターが必要になるでしょう。しかし、私の理解では、ほとんどの C++ パーサーは手書きです。LALRパーサーでさえうまくいくかどうかはわかりません。大きな銃を持ち出して、Bison の GLR サポートのようなものを使用する必要があるかもしれません。また、語彙/構文解析に関するより多くの情報については、「The Dragon Book」をお勧めします。幸運を!

于 2009-06-10T00:07:16.940 に答える