SymbolSet [] [] m ; // Tableau de tableaux d'ensembles de symboles |
SymbolSet
comme des listes de caractères sans
répétitions, l'ensemble vide étant représenté par null
.
class SymbolSet { char val ; SymbolSet next ; // test d'appartenance static boolean mem(char c, SymbolSet e) // ajouter un élément static SymbolSet add(char c, SymbolSet e) // union des ensembles static SymbolSet union(SymbolSet e1, SymbolSet e2) } |
class Pair { char fst, snd ; Pair (char c1, char c2) { fst = c1 ; snd = c2 ; } } |
Chomsky
proposera trois méthodes, deux méthodes
pour retrouver tous les non-terminaux définis par un membre droit
donné, et une méthode qui donne le symbole de départ.
class Chomsky { SymbolSet getLhs(char t) SymbolSet getLhs(Pair p) char getStartSymbol() ; } |
static boolean parse(Chomsky g, String alpha) { int len = s.length() ; if (len == 0) return false ; SymbolSet [] [] m = new SymbolSet [len+1] []; |
null
).
On notera que le tableau m comprend ℓ+1 éléments, ainsi
m[j][i]
sera mj,i. La ligne d'indice zéro ne sera pas
employée.SymbolSet [] m1 = new SymbolSet[len] ; for (int i = 0 ; i < len ; i++) { m0[i] = g.getLhs(alpha.charAt(i)) ; } m[1] = m1 ; |
Chomsky
.for (int j = 2 ; j <= len ; j++) { // Pour toutes les longueurs j SymbolSet [] row = new SymbolSet [len-j+1] ; for (int i = 0 ; i <= len-j ; i++) { // Pour tous les indices i de sous-chaînes de longueur j SymbolSet set = null ; for (int k = 1 ; k < j ; k++) { // Pour tous les découpages de [i..i+j[ en [i..i+k[ et ... for (SymbolSet p = m[k][i] ; // [i..i+k[ p != null ; p = p.next) { for(SymbolSet q = m[j-k][i+k] ; //[i+k..i+k+k'[, k+k' = j q != null ; q = q.next) { set = SymbolSet.union(g.getLhs(new Pair(p.val, q.val)), set) ; } } } row[i] = set ; } m[j] = row ; } |
return SymbolSet.mem(g.getStartSymbol(),m[len][0]) ; } |
class Pair { char fst, snd ; Pair (char c1, char c2) { fst = c1 ; snd = c2 ; } public boolean equals(Object o) { if (o == null) return false ; try { Pair p = (Pair)o ; return fst == p.fst && snd == p.snd ; } catch (ClassCastException e) { return false ; } } public int hashCode() { int f = fst ; int s = snd ; int h = (f << 16) | s ; return h ; } public String toString() { return "(" + fst + "," + snd + ")" ; } } |
int
sont sur
32 bits).import java.util.* ; class Chomsky { private char start ; private Hashtable t_lhs ; char getStartSymbol() { return start ; } static private void error(String msg) { System.err.println("Chomsky: " + msg) ; System.exit(2) ; } private void add(Object key, char c) { SymbolSet p = (SymbolSet)(t_lhs.get(key)) ; t_lhs.put(key, SymbolSet.add (c, p)) ; } Chomsky(char c, Rules rs) { start = c ; t_lhs = new Hashtable () ; for (Rules p = rs ; p != null ; p = p.next) { char lhs = p.lhs ; List rhs = p.rhs ; if (rhs == null) error("règle vide") ; if (rhs.next == null) { add(new Character(rhs.val), lhs) ; } else if (rhs.next.next == null) { add(new Pair(rhs.val, rhs.next.val), lhs) ; } else error("règle trop longue") ; } } SymbolSet getLhs(Pair p) { return (SymbolSet)t_lhs.get(p) ; } SymbolSet getLhs(char t) { return (SymbolSet)t_lhs.get(new Character(t)) ; } } |