Удаление ненужных вычислений из циклов - PullRequest
0 голосов
/ 27 мая 2020

Мне дали задание написать программу, которая считывает код, подобный c (с указанным синтаксисом, поэтому мне не нужно беспокоиться о коде в комментариях и c), и удаляет ненужные вычисления из внутри корпуса l oop наружу. Он может создавать новые переменные. Как в этом примере:

    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; }

Я решил, что лучшим подходом будет запуск рекурсивной функции «optimize», таким образом работать с вложенными циклами будет легко. Но как мне go прочитать код в l oop и решить, что переместить, и как переместить его за пределы тела l oop?

Я использую C#.

1 Ответ

0 голосов
/ 27 мая 2020

Сначала вам понадобится способ создать дерево синтаксического анализа из кода. Существуют инструменты, позволяющие создавать лексические анализаторы на основе грамматики вашего c -подобного языка. Какой из них вы будете использовать, зависит от языка, на котором вы это реализуете, если вы используете java, тогда вы можете использовать это: https://en.wikipedia.org/wiki/JavaCC

Как только у вас будет дерево , вы можете пройти по нему и искать выражения, которые находятся внутри al oop и использовать только литералы или переменные, которые не записаны внутри текущего l oop. Их можно вытащить из l oop.

...