编译从BASIC到C ++的for语句

时间:2014-05-29 20:11:12

标签: c++ compiler-construction vb6 vb6-migration

我正在编写一个编译器来将一些传统的VB6程序迁移到C ++。我需要将VB6语言中的for语句翻译成C ++ for语句:

For var = start To end Step S
  ...
Next var

天真的翻译不起作用,因为S可能是否定的:

for (var = start; var <= end; var += S) 

我已经想出了这个翻译,但条件中的三元if很难看:

for (var = start; (S > 0) ? (var <= end) : (var >= end); var += S)

2 个答案:

答案 0 :(得分:1)

这是一个生成的代码。调试代码生成器时,您只会看到它。如果丑陋的话,这完全无关紧要。只有它是正确的,然后生成越简单就越重要。


更新:但是,如果是迁移,尝试使代码可读确实有意义。然后我要么:

  1. 如果可能,解析操作符以在翻译器中使用,因为步骤几乎总是不变的。
  2. 隐藏辅助定义中的逻辑,并使用基于范围的:

    for(auto var : basic_range(start, end, S))
    

    不幸的是boost::irange没有进入C ++ 11,并且它像C ++一样使用半开放范围定义,即在您想要包含它时不包括end。所以你必须自己定义范围。基本上你只是隐藏它中的方向逻辑,所以它不会掩盖代码。请查看boost::irange获取灵感。

  3. 无论如何,最大的问题是对象生命周期。 VB6(与早期的BASIC不同)是受管理的。所以你可能最终会在大多数事情上使用智能指针而且这不是最有效的事情。

答案 1 :(得分:0)

如果将varend乘以S

的符号,则可以避免终止条件中的三元表达式
int sign = S>=0 ? 1 : -1;
for (int var = start; sign*var <= sign*end; var += S)
{
    //...
}