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:
E, T ed A sono simboli non terminali mentre +, 1, epsilon sono terminali. Il simbolo di partenza è Ecodice:E -> T A T -> + A T T -> epsilon A -> 1
Quello che vorrei fare io è una cosa del genere:
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.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 ...); } }
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?![]()