C/C++ で for ループ エラーを報告する単純な語彙アナライザーが必要です。
4 に答える
違法な 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
。
あなたが必要としているのは、個々のトークンを見てコンパイラの一部である語彙アナライザーではなく、コードを見て潜在的なバグを提案できる静的アナライザーだと思います。次の質問を確認してください。
純粋な字句解析の場合は、正規表現、または数十のスキャナー ジェネレーター (flex/lex、ANTLR) のいずれかを使用できます。一方、構文解析の場合は、文脈自由文法を読み取ることができるパーサー ジェネレーターが必要になるでしょう。しかし、私の理解では、ほとんどの C++ パーサーは手書きです。LALRパーサーでさえうまくいくかどうかはわかりません。大きな銃を持ち出して、Bison の GLR サポートのようなものを使用する必要があるかもしれません。また、語彙/構文解析に関するより多くの情報については、「The Dragon Book」をお勧めします。幸運を!