2013-04-28 2 views
0

J'écris un analyseur simple pascals et ont spécifié quelques règles de grammaire commemessages de diagnostic pour analyseur pascals

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

etc

Comment pourrais-je aller sur si je voulais afficher les messages de diagnostic à l'utilisateur ? Comme si quelqu'un laissait "id", je montrerais que le prochain jeton attendu serait "id" quand il a obtenu "leftparenthesis" à la place?

Répondre

0

Une possibilité pourrait être

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]). 

test:

?- phrase(program_header,[program,lp,rp]). 
error miss_id at 1 before end 
true. 

?- phrase(program_header,[program,id,lp,rp]). 
true . 

J'ai simplifié la grammaire, juste pour tester ...