logo
TurboProlog / Документация / TOM_1

Readtermerror/2

Предикат readtermerror выдает информацию о строке, содержащей син-

таксическую ошибку

readtermerror(Line, LinePos), /* (0,0) */

Параметр Line связан со строкой, содержащей синтаксическую ошибку,

LinePos указывает на позицию ошибки в строке.

В следующем примере показано как можно реализовать предикат consult

в виде, защищенном от ошибок. Когда при использовании предиката consult в

файле встречается синтаксическая ошибка, этот файл загружается в редак-

тор, курсор помещается в то место, где обнаружена ошибка, в нижней части

экрана выводится сообщение об ошибке, что позволяет исправлять ошибки.

/* Program CH19EX02.PRO */

domains

dom = f(INTEGER)

list = integer *

database - mydba

p1(INTEGER, STRING, CHAR, REAL, DOM, LIST)

predicates

repeat

handleconsulterr(STRING, INTEGER)

clauses

repeat.

repeat:-repeat.

handleconsulterr(File, Err):-

Err>1100, Err<1110, !,

retractall(_, mydba),

consulterror(_, LinePos, Filepos),

Pos=LinePos+FilePos,

% may need a path to "..\\prolog.err"

errormsg("prolog.err", Err, Msg, _),

file_str(File, Str),

edit(Str,Str1,"Consult error", File, Msg, Pos,"prolog.hlp",

1, 1, 1, 0, _, RetStatus),

RetStatus=0,

file_str(File, Str1).

handleconsulterr(_, Err):-

exit(Err).

goal

repeat,

File="dd.dat",

trap(consult(File, mydba),Err, handleconsulterr(File,Err)),

write("\nSUCCESS\n"),

save(con, mydba).