忽略语法错误

Ignoring Syntax Errors

本文关键字:错误 语法      更新时间:2023-10-16

我有一个文件,其中包含任意数量的c++代码行,每一行都是自包含的(这意味着它在主函数中本身是有效的)。然而,我不知道有多少行(如果有的话)将具有有效的c++语法。一个示例文件可能是

int length, width; // This one is fine
template <class T className {}; // Throws a syntax error

我想做的是将所有具有有效语法的行写入第二个文件。目前,我已经用python编写了一个程序,可以读取每一行,并将其放入以下形式的中

int main() {
    // Line goes here
    return 0;
}

并尝试编译它,如果编译成功则返回True,如果编译不成功则返回False,然后我用它来确定要写入输出文件的行。例如,第一行将生成一个包含的文件

int main() {
    int length, width;
    return 0;
}

这将编译良好并将True返回到python程序。然而,我很好奇编译器是否有任何类型的try-catch语法,这样我就可以将文件的每一行放在try-catch块中,并在没有引发异常的情况下将其写入输出,或者是否有方法可以告诉编译器忽略语法错误。

编辑:有人问我为什么需要这样做的细节,我会第一个承认这是一个奇怪的问题。我之所以这么做,是因为我有另一个程序(我不知道它的所有实现细节),它向文件中写入大量行,每个行都应该能够独立运行。我也知道这个程序几乎肯定会写有语法错误的行。我要做的是编写一个程序,删除任何无效的行,这样生成的文件就可以编译而不会出错。我在python程序中所做的现在是有效的,但我正在努力弄清楚是否有更简单的方法可以做到这一点

编辑2:虽然我想我已经得到了答案——我不能用编译器真正玩try-catch,这已经足够好了。谢谢大家!

在C++源文件上下文中语法正确的单独代码行本身并不一定语法正确。

例如:

int length, width;

恰好作为main函数的一部分或本身是有效的,但它有不同的含义(它本身将lengthwidth定义为静态对象)。

此:

}

在上下文中有效,但本身无效。

编译器通常无法忽略语法错误。一旦遇到语法错误,编译器就无法解释代码的其余部分。

当你在阅读英文文本时,adfasff iyufoyur^^$(——但你通常可以在出错后恢复并识别有效的语法。编程语言的编译器并不是为执行这种恢复而设计的;C++语法的性质可能会使其更加困难,而且没有足够的需求使其值得做。

我不确定你对一行代码"正确"的标准是什么。一种可能性可能是将这行代码写入一个文件,包含在main:的定义中

int main() {
    // insert arbitrary line here
}

然后编译得到的源文件。我不确定我是否能看到这会特别有用,但这是我能最接近你要求的。

"每一行都是自包含的"是什么意思?一行C++代码的语法是否有效可能在很大程度上取决于该行之前或之后的代码。给定的代码行可能在函数内有效,但在函数体外无效。所以,只要你不能定义你所说的"自给自足"是什么意思,就很难解决你的问题。