Задача 2.
Пусть грамматика языка описывается следующим образом:
<выражение>::=<операнд> <on> <операнд> | <операнд>
<on>::=+|-|*
<операнд>::=<переменная> | <целое без знака>
<переменная>::= A | B | C | D | ... | Z
<целое без знака>::= 1 | 2 | 3 | 4 | ... | 9 | 0
<оператор>::=<IF-оператор> | <WHILE-оператор> | <присвоить>
<присвоить>::=<переменная>:=<выражение>
<IF-оператор>::= IF <условие> THEN <оператор> ELSE <оператор>
<WHILE-оператор>::= WHILE <условие> DO BEGIN <оператор> END
<условие>=<выражение> > <выражение>
<программа P>=<оператор> | <программа P><оператор>
Задается текст программы P. Каждый оператор программы Р начинается с новой строки. Оператор может быть записан в нескольких строках. Ввод программы осуществляется из файла. Имя файла вводится с клавиатуры. В программе все переменные и ключевые слова записываются заглавными буквами латинского алфавита. Текст вводимой программы Р синтаксически правильный.
Написать программу, оптимизирующую введенный текст программы Р по следующим правилам:
Если в операторе IF условие всегда истинно (ложно) (например 2>1 (1>2)), то в текст преобразованной программы включается только оператор, стоящий за THEN ( за ELSE, если он есть).
Если в операторе WHILE условие всегда ложно, то WHILE- оператор из текста программы исключается.
Если в операторах IF, WHILE в <условие> или в операторе присваивания в правой части стоит выражение, численное значение операндов которого известно, то это значение вычисляется и записывается вместо <выражения> в условие или вместо правой части оператора присваивания соответственно.
Если в двух операторах присваивания (обозначим их А и В) в программе Р в левой части оператора стоит одна переменная, и эта переменная не используется ни в правой части операторов присваивания, ни в условиях IF- или WHILE-операторов, встречающихся в тексте программы между операторами А и В, то в программе Р остается только оператор В.
Если внутри тела цикла оператора WHILE стоит оператор присваивания, и переменная из левой части этого оператора не встречается в <условии>, то этот оператор выносится из цикла и ставится перед ним.
Если в ветках THEN и ELSE оператора IF стоит один и тот же оператор присваивания (переменные в левых частях этих двух операторов совпадают, а значения правых частей одинаковы, например,
IF A>B THEN L:=A+B ELSE L:=B+A),
то этот оператор присваивания записывается вместо IF-оператора.
Вывод программы оптимизатора направляется в файл с именем код.OUT.
|