我试图将我的编程语言的代码库从Lua转换为C ++。我刚刚开始。我不是C ++专家,我希望我能在写时学到更多东西,但是我已经遇到了让我停下来的障碍。
我现在正在编写词法分析器模块。它应该返回一个双重链接的令牌列表,但当然,在分析源代码时可能会出现错误,例如:当多行注释或字符串没有结束括号等等时。
当然,当我遇到错误时,打印消息并结束程序。但是因为我想让这些错误易于处理,我能想到的最简单的事情就是返回这些错误,这样如果错误处理函数得到了这个错误,它就可以处理它,但是如果它一直到解释器,则会打印出它的消息。
在Lua,很容易。如果词法分析器函数在传递的文本中没有遇到错误,或者由一个错误对象处理,我可以使函数返回一个双向链接的令牌列表(我在那里使用无量纲数组,但这并不重要)呼叫者。
由于C ++必须指定返回类型,但是如何在必要时使函数返回错误对象以便正确处理?或者我应该改变方法并使用除返回系统之外的其他东西吗?
不幸的是,我无法搜索像Python这样庞大的代码库来查看它们如何处理这种情况,所以即使是这些文件的链接也可以提供帮助。
答案 0 :(得分:2)
如果仅用于错误处理,您可能希望使用exceptions,因为这是C ++中的标准错误处理机制。当然,您必须在某处捕获并处理这些异常,否则C ++程序将停止运行。
如果你真的需要一种方法从单个函数中获得几种可能的返回类型,你可以尝试unions。这种方法的缺点是你需要一种方法来向调用者表明你实际返回的类型,并且调用者需要检查各种可能性。
除此之外,我可以给你一些建议:虽然我不知道你将代码库从Lua转换为C ++的动机,但我不建议只是为了让所有代码都可用于C ++,只要Lua代码适合您的目的。你很可能会遇到更多这样的情况,你无法将语言特性从Lua充分翻译成C ++。
相反,如果你需要一种从C ++应用程序与Lua交互的方法,你可以尝试使用像Lua API++ library之类的包装器直接从C ++使用Lua。
答案 1 :(得分:1)
让词法分析器返回一个封装结果的对象和一个表示成功或失败的标志,例如
struct Result {
bool isValid; //flag to indicate of the result is valid
//result from the analyzer
std::list<int> list;
};
然后在词法分析器内部适当地设置标志,例如抛出异常时,将isValid设置为false。
Result DoWork() {
Result result;
try {
/*do real work*/
result.list.push_back(42);
result.isValid = true;
}
catch (...) {
result.isValid = false;
}
return result;
}
int main() {
Result result = DoWork();
if (result.isValid) {
...
} else {
...
}
}