init with {: System.err.println("Grammaires de Liste"); :} action code {: void PRN(int n) { System.out.print(n+" "); } void PRN() { System.out.print(" vide "); } :} terminal NL,COMMA, SEMI; terminal Integer ENTIER; nonterminal lines, list, list0; nonterminal lista, listb, listc, listd; nonterminal listf, listg, listh, listi; nonterminal listj, listk; lines ::= /* vide */ | lines list {: System.out.println("OK"); :} NL | lines error {: System.out.println("BAD"); :} NL ; list ::= listj ; list0 ::= ENTIER:n {: PRN(n); :} ; lista ::= ENTIER:n {: PRN(n); :} | lista ENTIER:n {: PRN(n); :} ; listb ::= ENTIER:n {: PRN(n); :} | ENTIER:n listb {: PRN(n); :} ; listc ::= /* vide */ {: PRN(); :} | listc ENTIER:n {: PRN(n); :} ; // Autre Bon choix //listc ::= /* vide */ // | lista //; // Mauvais choix : ambigue ! //listc ::= /* vide */ {: PRN(); :} // | ENTIER:n {: PRN(n); :} // | listc ENTIER:n {: PRN(n); :} //; listd ::= /* vide */ {: PRN(); :} | ENTIER:n listd {: PRN(n); :} ; // Ambiguité // liste ::= ENTIER:n {: PRN(n); :} // | liste liste {: :} //; listf ::= ENTIER:n {: PRN(n); :} | listf COMMA ENTIER:n {: PRN(n); :} ; listg ::= ENTIER:n {: PRN(n); :} | ENTIER:n COMMA listg {: PRN(n); :} ; listh ::= /* vide */ | listf ; listi ::= /* vide */ | listg ; // FAUX : ",1,2,3" valide et pas "1,2,3" //listh ::= /* vide */ {: PRN(); :} // | listh COMMA ENTIER:n {: PRN(n); :} //; // FAUX et Ambigue "1,2,3" valide, mais ",1,2,3" aussi //listh ::= /* vide */ {: PRN(); :} // | ENTIER:m // | listh COMMA ENTIER:n {: PRN(n); :} //; listj ::= /* vide */ {: PRN(); :} | listj ENTIER:n SEMI {: PRN(n); :} ; listk ::= /* vide */ {: PRN(); :} | ENTIER:n SEMI listk {: PRN(n); :} ;