16.7 Алгоритм поиска и сокращенияподобных членов
В процессе преобразования выражения
может образоваться несколько подобных членов. Например,
3.7 * a * b/c + a * b/c.
Поэтому необходимо произвести
сокращение подобных членов. Для нашего примера это 4.7 * a * b/c.
Известно, что два выражения подобны, если отличаются друг от друга только
множителем - константой. При сокращении подобных членов может быть две
ситуации:
1)члены подобны в списке аддитивных
составляющих;
2)члены подобны в мультипликативных
составляющих.
Во второй ситуации необходимо
проверять операцию деления. Например,
a * b/a = > b.
Таким образом, необходимо
использовать два алгоритма сокращения подобных членов. В основе первого
алгоритма лежит попарное сравнение поддеревьев узлов <T>, которые
являются сыновьями некоторого узла <E>. Причем сравнение производится с
учетом самого левого <D> в дереве, который может ссылаться на константу.
Если два узла <T> совпали, то производится преобразование синтаксического
дерева. Второй алгоритм работает несколько по-другому. Здесь производится
попарное сравнение узлов <D>, некоторого узла <T>. Причем первый
узел <D> берется из класса умножения, второй из класса деления. Если они
совпадут, то производится преобразование синтаксического дерева: оба узла
удаляются и вставляется узел <D> со ссылкой на "1" и определяется
необходимость знака "умножить".
|