我正在编写一个简单的帕斯卡解析器并指定了一些语法规则,例如
program_header --> program, id, leftparenthesis ... etc
program --> [500]
id --> [300]
ETC
如果我想向用户显示诊断消息,我该怎么做?就像有人遗漏了“id”一样,当它得到“leftparenthesis”时,我会显示下一个预期的标记将是“id”?
一种可能是
program_header -->
[program], ( [id] ; {Err = miss_id} ), [lp], check_err(Err), [rp].
check_err(Err, Right, Right) :-
var(Err) -> true ; length(Right, ToEnd), format('error ~s at ~d before end~n', [Err, ToEnd]).
测试:
?- phrase(program_header,[program,lp,rp]).
error miss_id at 1 before end
true.
?- phrase(program_header,[program,id,lp,rp]).
true .
我已经简化了语法,只是为了测试......