忽略语法错误
Ignoring Syntax Errors
我有一个包含任意多行 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;
}
并尝试编译它,return 如果编译成功则为 True,否则为 False,然后我使用它来确定将哪些行写入输出文件。例如,第一行将生成一个包含
的文件
int main() {
int length, width;
return 0;
}
可以很好地编译并且 return 符合 python 程序。但是,我很好奇是否有任何类型的 try-catch 语法适用于编译器,所以我可以将文件的每一行放在一个 try-catch 块中,如果没有抛出异常,或者如果有一种方法可以让编译器忽略语法错误。
编辑:有人问我为什么需要这样做的详细信息,我会第一个承认这是一个奇怪的问题。我这样做的原因是因为我有另一个程序(我不知道它的所有实现细节)将大量行写入文件,每一行都应该能够独立。我也知道这个程序几乎肯定会写出有语法错误的行。我想做的是编写一个程序来删除所有无效行,以便生成的文件可以无错误地编译。我的 python 程序中的内容现在可以使用,但我正在尝试找出是否有更简单的方法来完成它。
编辑 2:虽然我想我已经得到了答案 - 我真的不能用编译器玩 try-catch,但这已经足够了。谢谢大家!
"each line is self-contained"是什么意思?一行 C++ 代码的语法是否有效可能在很大程度上取决于该行之前或之后的代码。给定的代码行可能在函数内有效,但在函数体之外无效。所以,只要你不能定义你的意思"self-contained"就很难解决你的问题。
在 C++ 源文件的上下文中语法正确的各行代码本身不一定在语法上正确。
例如这个:
int length, width;
恰好作为 main
函数的一部分或单独有效 - 但它具有不同的含义(它本身将 length
和 width
定义为静态对象).
这个:
}
在上下文中有效,但单独无效。
编译器通常无法忽略语法错误。一旦遇到语法错误,编译器将无法解释其余代码。
当您阅读英文文本时,adfasff iyufoyur; ^^$(( - 但您通常可以在错误后恢复并识别有效语法。编程语言的编译器并非设计用于执行这种恢复;可能 C++ 语法的性质会使它变得更加困难,而且只有没有足够的需求使它值得做。
我不确定您对单行代码 "correct" 的判断标准是什么。一种可能是将代码行写入文件,包含在 main
:
的定义中
int main() {
// insert arbitrary line here
}
然后编译生成的源文件。我不确定我是否能看出这有什么特别有用,但它是我最接近你要求的东西。
我有一个包含任意多行 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;
}
并尝试编译它,return 如果编译成功则为 True,否则为 False,然后我使用它来确定将哪些行写入输出文件。例如,第一行将生成一个包含
的文件int main() {
int length, width;
return 0;
}
可以很好地编译并且 return 符合 python 程序。但是,我很好奇是否有任何类型的 try-catch 语法适用于编译器,所以我可以将文件的每一行放在一个 try-catch 块中,如果没有抛出异常,或者如果有一种方法可以让编译器忽略语法错误。
编辑:有人问我为什么需要这样做的详细信息,我会第一个承认这是一个奇怪的问题。我这样做的原因是因为我有另一个程序(我不知道它的所有实现细节)将大量行写入文件,每一行都应该能够独立。我也知道这个程序几乎肯定会写出有语法错误的行。我想做的是编写一个程序来删除所有无效行,以便生成的文件可以无错误地编译。我的 python 程序中的内容现在可以使用,但我正在尝试找出是否有更简单的方法来完成它。
编辑 2:虽然我想我已经得到了答案 - 我真的不能用编译器玩 try-catch,但这已经足够了。谢谢大家!
"each line is self-contained"是什么意思?一行 C++ 代码的语法是否有效可能在很大程度上取决于该行之前或之后的代码。给定的代码行可能在函数内有效,但在函数体之外无效。所以,只要你不能定义你的意思"self-contained"就很难解决你的问题。
在 C++ 源文件的上下文中语法正确的各行代码本身不一定在语法上正确。
例如这个:
int length, width;
恰好作为 main
函数的一部分或单独有效 - 但它具有不同的含义(它本身将 length
和 width
定义为静态对象).
这个:
}
在上下文中有效,但单独无效。
编译器通常无法忽略语法错误。一旦遇到语法错误,编译器将无法解释其余代码。
当您阅读英文文本时,adfasff iyufoyur; ^^$(( - 但您通常可以在错误后恢复并识别有效语法。编程语言的编译器并非设计用于执行这种恢复;可能 C++ 语法的性质会使它变得更加困难,而且只有没有足够的需求使它值得做。
我不确定您对单行代码 "correct" 的判断标准是什么。一种可能是将代码行写入文件,包含在 main
:
int main() {
// insert arbitrary line here
}
然后编译生成的源文件。我不确定我是否能看出这有什么特别有用,但它是我最接近你要求的东西。