【问题标题】:Removing unnecessary calculations from loops从循环中删除不必要的计算
【发布时间】:2020-05-27 02:56:37
【问题描述】:

我被分配了一个任务/分配来编写一个程序,该程序读取类似 c 的代码(具有指定的语法,所以我不需要担心 cmets 等中的代码)并从循环体内部删除不必要的计算以外。它可以创建新的变量。就像在这个例子中一样:

    Input:
for (i=1; i<100; i++)
{ b[i] = c[i] *a * 135.8; }
Output:
float __gen1 = a*135.8;
for (i=1; i<100; i++)
{ b[i] = c[i] *___gen1; }

我认为最好的方法是运行一个“优化”递归函数,这样处理嵌套循环会很容易。 但是我应该如何阅读循环中的代码并决定要移出什么,以及如何将其移出循环体?

我正在使用 C#。

【问题讨论】:

  • 如果你的任务是编译器.. 你可能需要一个好的 C# 解析器库。开始可能是this post
  • 为什么?任何体面的编译器都会在某个阶段或另一个阶段做到这一点。你被要求在这里写一段好的编译器。这是一项远非微不足道的任务。你有 3-5 个月的时间来做吗?

标签: c# compiler-construction


【解决方案1】:

首先,您需要一些方法来从代码中创建解析树。有一些工具可以让您从类 c 语言的语法构建词法分析器。您将使用哪一种取决于您使用的语言,如果您使用的是 java,那么您可能想要使用它:https://en.wikipedia.org/wiki/JavaCC

一旦你有了树,你就可以遍历它并查找循环内的表达式,并且只使用没有写在当前循环内的文字或变量。那些可以被拉出循环。

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 2015-02-20
    • 2019-08-10
    • 2018-02-13
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多