pascal解析器的诊断消息

时间:2013-04-28 12:06:53

标签: prolog dcg

我正在编写一个简单的pascal解析器,并指定了一些语法规则,如

program_header --> program, id, leftparenthesis ... etc
program --> [500]
id --> [300]

如果我想向用户显示诊断消息,我该怎么办?就像有人遗漏了“id”一样,当我得到“leftparenthesis”时,我会显示下一个预期的标记是“id”吗?

1 个答案:

答案 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 .

我简化了语法,只是为了测试......