Salve gente, vi espongo il mio problema:
sto scrivendo una classe che rappresenta una generica grammatica formale libera dal contesto (la voglio scrivere io quindi evitate di passarmi link a classi già scritte) però vorrei evitare (sempre se possibile, altrimenti opterò per questa soluzione e buonanotte) di costringere l'utilizzatore di questa classe a crearsi mille classi che rappresentino i simboli (terminali e non); vorrei trovare qualche modo che mi permetta di creare due costrutti: uno contiene tutti i simboli terminali e l'altro contiene tutti i simboli non terminali.
L'ideale sarebbe crearlo con delle enum, vi faccio un esempio di ciò che intendo:
immaginiamo di voler rappresentare questa grammatica:
codice:
E -> T A
T -> + A T
T -> epsilon
A -> 1
E, T ed A sono simboli non terminali mentre +, 1, epsilon sono terminali. Il simbolo di partenza è E
Quello che vorrei fare io è una cosa del genere:
codice:
interface Simboli {
// interfaccia marker per indicare simboli terminali e non
}
enum SimboliTerminali implements Simboli {
PLUS, UNO, EPSILON
}
enum SimboliNonTerminali implements Simboli {
E, T, A
}
public class Main {
public static void main(String[] args) {
Grammatica grammatica = new Grammatica(SimboliTerminali, SimboliNonTerminali, SimboliNonTerminali.E,
new Produzione[] {new Produzione(SimboliNonTerminali.E, new Simboli[] { SimboliNonTerminali.T, SimboliNonTerminali.A}), ... tutte le altre produzioni ...);
}
}
Ovviamente scrivere questa cosa dà errore poiché (giustamente) il compilatore vuole che si passino variabili concrete ai vari metodi/costruttori e non dei tipi (tra l'altro non saprei che tipo metterci nel costruttore, anche se stavo pensando a qualcosa tipo Class<? extends Enum>) quindi non ho idea di come rendere possibile questa mia soluzione.
Voi avete qualche idea di come posso far definire all'utente due costrutti in cui viene specificato in una unica volta tutti i simboli terminali e non senza far creare mille classi?