1
/**************************
Assignment Statment Module
**************************/
assgnStmnt(Clist) :-
        Clist = [H|T], id(H), conc(Exp, [';'|AnotherStmnt], T), Exp = [Op|Rem], Op = '=', expr(Rem), assgnStmnt(AnotherStmnt),!
        ;
        Clist = [], !.

このコードは、コンパイラーで代入ステートメントを解析するためのものです。しかし、私はユーザーに彼のコードの構文エラーがどこにあるかを出力する必要があります。

のように:彼が入力した場合:x = x + 1、私はその期待された';'を出力したい 見つかりません。

どうやってやるの ???

4

1 に答える 1

3

技術的には文法に依存しますが、エラー生成がどこに行くかを既に知っていると仮定すると、次のようにコーディングできます。

assgnStmnt(Clist) :-
    Clist = [H|T],
    id(H),
    conc(Exp, [StmntSep|AnotherStmnt], T),
    Exp = [Op|Rem],
    Op = '=',
    expr(Rem),
    expected(StmntSep, ';'), % the right position depends on grammar
    assgnStmnt(AnotherStmnt),
    !
    ; Clist = [].

expected(Token, Token) :- !.
expected(Wrong, Token) :-
    format('expected ~w, found ~w~n', [Token, Wrong]),
    fail. % fail here depends on error recovery strategy

テスト:

?- assgnStmnt([x,=,x+1,';',x,=,x+1,';']).
true.

?- assgnStmnt([x,=,x+1,';',x,=,x+1]).
expected ;, found x
expected ;, found =
expected ;, found x+1
false.
于 2012-06-24T08:12:36.760 に答える