-1

我需要一个简单的词法分析器来报告 C/C++ 中的 for 循环错误。

4

4 回答 4

2

如果你写了一个非法的 for 循环,编译器会大声抱怨:

for (int i)

市场上的每个编译器都会出现很大的错误。

然而,很多 for 循环的“错误”是完全合法的。

我假设您正在尝试标记合法的循环,这些循环并不意味着您想要它们的意思。当然,问题在于编译器无法知道您的意思。您可以合理地省略循环中的三个部分中的任何一个,并且省略所有三个部分是很常见的。此外,您还可以在每个部分中做不止一件事:

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 是开发此类东西的两个好工具。报告 for 循环错误似乎是您需要的非常具体的事情,因此您可能必须编写自己的词法分析器和解析器才能让它做您想做的事情。

Bison 的手册非常全面。

话虽如此,为什么不直接使用编译器的错误消息来找出你是否写错了 for 循环?

于 2009-06-09T23:43:28.063 回答
0

对于纯粹的词法分析,您可以使用正则表达式或几十个扫描仪生成器(flex/lex、ANTLR)中的任何一个。另一方面,对于句法分析,您可能需要一个可以读取上下文无关语法的解析器生成器。但是,据我了解,大多数 C++ 解析器都是手写的。我不确定即使是 LALR 解析器也能解决问题。您可能需要拿出大炮并使用诸如 Bison 的 GLR 支持之类的东西。此外,有关词汇/句法分析的更多信息,我推荐'The Dragon Book'。祝你好运!

于 2009-06-10T00:07:16.940 回答