Пользователь
Регистрация: 10.10.2017
Сообщений: 44
|
Дополнить интерпретатор Brainfuck на Visual Prolog 5.2
Доброго времени суток. Надо дополнить этот код так, чтобы интерпретатор по считыванию файла выдавал значение формулы x^3 + 2x^2 + 5 . Как я понял, её надо задать на брейнфаке в отдельном текстовом файле (в коде - code.txt). Прошу помочь с самим файлом code.txt Спасибо заранее за советы!
Код:
domains
addr = integer
data = integer
file = codefile %*переменная* с прочитанным файлом - codefile
loop_addr_value = integer*
loops = loop_addr_value*
database
data(addr, data). %ячейки данных
pos(addr). %указатель на ячейку
circle(loops). %[[указатель на позицию начала цикла, значение цикла], ..]
code_pos(integer). %позиция в читаемом файле
predicates
cin. % . .
cout. % , ,
add(integer). % + -
addr(integer). % > <
loop. % [ [
goto. % ] ]
get(data). %получение инфы с ячейки
set(data). %сохранение инфы в ячейку
readcode(string). %код, начиная с указателя
new_code_pos(integer). %сохранить указатель на код
do().
cmd(string).
clauses
readcode(D):- code_pos(A), readdevice(codefile), filepos(codefile, A, 0), readln(D). %риддевайс переключаем на файл!!
new_code_pos(Pos):-retract(code_pos(_)), assert(code_pos(Pos)).
get(D):- pos(A), data(A,D), !.
get(0). %если ячейка пустая возвращаем 0
set(D):- pos(A), retract(data(A,_)), assert(data(A,D)), !.
set(D):- pos(A), assert(data(A,D)), !.
cout:- get(D), char_int(ASCII, D), str_char(ASCII_S, ASCII), write("Out: ", D, "(",ASCII_S,")\n").
cin:- write("In: "), readdevice(keyboard), readint(D), set(D). %риддевайс на клаву!
add(AddValue):- get(OldData), NewData = OldData + AddValue, set(NewData).
addr(AddValue):- pos(OldAddr), retract(pos(_)), NewAddr = OldAddr+AddValue, assert(pos(NewAddr)).
loop:- retract(circle(L)), !, get(D), code_pos(Pos), assert(circle([[Pos,D]|L])). %меняем инфу в бд, добавляя текущую позицию в "стек" вызовов
goto:- get(D), D=0, retract(circle([_|L])), assert(circle(L)). %удаляем из "стека" последнюю [
goto:- circle([[A,_]|_]), new_code_pos(A). %если текущая ячейка != 0 то возвращаемся на [
%читаем код с сохраненной в бд позиции, обрабатываем слово из 4х букв, меняем в бд позицию, *рекурсия*
do():- readcode(In), frontstr(4, In, Cmd, _), code_pos(Pos), NewPos = Pos+4, new_code_pos(NewPos), cmd(Cmd), !, do.
cmd("["):- loop,!.
cmd("]"):- goto, !.
cmd( _ ):-circle([[_,StartValue]|_]),StartValue=0,!. %не выполняем команды снизу если начат цикл [ и ячейка == 0
cmd(">"):- addr( 1),!.
cmd("<"):- addr(-1),!.
cmd(","):- cin,!.
cmd("."):- cout,!.
cmd("+"):- add(1),!.
cmd("-"):- add(-1),!.
cmd(_).
%достаем файл из *lab_folder*\Obj\code.txt, инициализируем значения в бд и начинаем выполнение!
goal openread(codefile, "code.txt"), assert(pos(1)), assert(code_pos(0)), assert(circle([])),
write("count x^3 + 2x^2 + 5, enter x now\n"), do, !.
P.S. Количество букв в коде будет наверное не 4, как и позиций, до этого в коде был пример x^3 + 7
Последний раз редактировалось alexboliam; 04.12.2017 в 21:59.
|