S → E E → i
E → E P E P → +
E → E M E M → * |
S → E E → i |
E → E Ep Ep → P E P → + |
E → E Em Em → M E M → * |
S → i S → E Ep S → E Em |
E → i |
E → E Ep Ep → P E P → + |
E → E Em Em → M E M → * |
return
, mais
c'est tellement pratique.
static boolean isTerm(char c) { return !(isNonTerm(c) || Character.isSpaceChar(c)) ; } static boolean isNonTerm(char c) { return Character.isUpperCase(c) ; } static boolean isCNF(Rules rs) { for ( ; rs != null ; rs = rs.next) { List rhs = rs.rhs ; if (rhs == null) return false ; // Production vide if (rhs.next == null) { if (!isTerm(rhs.val)) return false ; // Production A → B } else { if (rhs.next.next == null) { if (!(isNonTerm(rhs.val) && isNonTerm(rhs.next.val))) return false ; // Membre droit de taille 2, distinct de AB } else { return false ; // Membre droit de taille > 2 } } } return true ; } |