我正在编写一个简单的pascal解析器,并指定了一些语法规则,如
program_header --> program, id, leftparenthesis ... etc
program --> [500]
id --> [300]
等
如果我想向用户显示诊断消息,我该怎么办?就像有人遗漏了“id”一样,当我得到“leftparenthesis”时,我会显示下一个预期的标记是“id”吗?
答案 0 :(得分:0)
可能是
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 .
我简化了语法,只是为了测试......