Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di Mega-X
    Registrato dal
    Dec 2008
    Messaggi
    19

    [JAVA] Passare una enum ad un metodo/costruttore

    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?
    www.lastfm.it/user/WTFucker

  2. #2
    Utente di HTML.it L'avatar di Mega-X
    Registrato dal
    Dec 2008
    Messaggi
    19
    Alla fine ho risolto da solo usando le classi EnumSet ed Enum:

    codice:
    import java.util.EnumSet;
    
    public class Test {
    	public static void main(String[] args) {
    		Grammar g = new Grammar(EnumSet.allOf(Term.class), EnumSet.allOf(NonTerm.class), NonTerm.E,
    				new Production[]{
    			new Production(NonTerm.E, NonTerm.T, NonTerm.E_),
    			new Production(NonTerm.E_, Term.PLUS, NonTerm.T, NonTerm.E_),
    			new Production(NonTerm.E_, Term.EPS),
    			new Production(NonTerm.T, Term.NUM)
    			});
    		System.out.println(g);
    	}
    }
    Il cui output è:

    codice:
    GRAMMAR = {
    	TERMINAL_SYMBOLS = [NUM, EPS, PLUS]
    	NON-TERMINAL_SYMBOLS = [E, E_, T]
    	START_SYMBOL = E
    	PRODUCTIONS = [E -> [T, E_], E_ -> [PLUS, T, E_], E_ -> [EPS], T -> [NUM]]
    }
    www.lastfm.it/user/WTFucker

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.