<div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div>Я так подозреваю, нам ещё нужно, так называемое, "эталонное решение". Точно так же подозреваю, что мы заморочимся с ним больше всего.<br><br></div>Бегло оглянув возможности вот какие выводы сделал я (может они уже раньше были сделаны и я пропустил, так что извиняйте):<br><br></div>1. У нас есть штука ssa(Fn*), которая строит сокращённую(?) ssa-форму.<br></div>2. Так же у нас есть штука checkssa(Fn*), которая, судя по названию, проверяет корректность формы, но у меня не получилось вызвать её без сегфолта. В комментарии к checkssa написано require use и ssa. Это значит, что чтобы проверить верность ssa-формы, надо её насильно строить? Это очень странно, и, я думаю, мы не сможем это использовать.<br></div>3. По сути выполнение задания состоит в переименовывании и добавлении переменных и добавлении новых функций. <br></div>Получается, что к выполнению задания есть два очевидных подхода: <br>1)работать с внутренним представлением, а потом использовать printfn, которая выводит текстовое представление в поток. Проблема тут состоит в том, что переменные хранятся достаточно особым способом, а так же структура для переменной содержит много полей, значения которых мне (может только мне?) неизвестны. Так что это сложно и нет гарантии, что при преводе в текст ничего не покрашится.<br></div>2) Обрабатывать блоки и писать в поток, но по сути это то же самое, что свой парсер написать, что очень глупо, когда рядом уже лежит парсер. Так что это тоже сложно и нет гарантии, что всё не покрашится.<br></div>4. Если просто считать программу, а затем записать её с помощью printfn, то ввод и вывод не будут идентичны:<br></div>1)ret заменяется на ret<тип возвращаемого значения> (соответственно из сигнатуры функции возвращаемое значение убирается)<br></div>2)вызов функции с аргументами типа print(w a, l b), заменяется на несколько строчек типа argw a; arglb; print.<br></div>Но самое интересное, что эти преобразования не воспринимаются парсером в обратную сторону.<br></div>То есть если взять программу на qbe, загнать её в программу, в которой сделать printfn, а затем результат снова загнать в программу, получим unresolved reference или что-то типа этого (не помню точно). Это подсказывает мне, что первый вариант из предыдущего пункта автоматом отпадает, а второй слишком геморный.<br><br></div>Вот такие пироги<br><div><div><div><div><div><div><div><div><br></div></div></div></div></div></div></div></div></div>