Utilizza la proprietà del valore del dizionario come chiave del dizionario

5

Sto creando un AST e attualmente sto introducendo il concetto di "ambito". Implementando un ambito, ovunque venga utilizzato un identificatore (nome variabile), sono in grado di determinare la sua dichiarazione originale.

Per l'oggetto scope, stavo per implementare un dizionario come struttura dati sottostante. Il dizionario verrebbe codificato con l'oggetto identificatore, con il valore come oggetto dichiarazione. L'oggetto dichiarazione contiene anche un riferimento allo stesso identificatore. Quindi, qualcosa come:

class Identifier() {
    string name;
}

class Declaration() {
    Type type;
    Identifier ident;
}

class Scope() {
    Dictionary<Identifier,Declaration> identifiers;
}

Quello che voglio sapere è, è la chiave di un dizionario con una proprietà della cattiva pratica del valore corrispondente della chiave? C'è un modo migliore per farlo?

    
posta David Poxon 26.09.2015 - 02:24
fonte

1 risposta

1

Non vedo nulla di fondamentalmente sbagliato in questo.

Il fatto che Identifier sia un membro della Dichiarazione, il tipo di valori della mappa degli identificatori di Scope è per lo più coincidente, imho.

Potresti anche aver optato per, per esempio, questo:

class Identifier() {
    string name;
}

class Declaration() {
    int id;
    Type type;
    Identifier identifier;
}

class Scope() {
    Dictionary<int, Declaration> identifiers; // (map from Declaration.id to Declaration)
}

Ma per qualsiasi ragione, hai appena scoperto che usare lo stesso Identificatore come "chiave primaria" per la stessa Dichiarazione che lo introduce era più conveniente.

Ciò che trovo più intrigante, tuttavia, è il motivo per cui non hai optato per qualcosa di più comune (credo) per quel genere di cose:

class Identifier() {
    string name;
}

class Declaration() {
    Type type;
    Identifier identifier;
}

class Scope() {
    int id;
    List<Declaration> identifiers; // (declared at this scope level)
    Dictionary<int, Scope> innerScopes; // (map from Scope.id to Scope, useful for representing inner scopes, be they lexical or otherwise)
    Scope parent;
    bool IsRoot => parent == null;
}

etc?

Certo, però, la mia domanda è parziale, perché di solito preferisco disaccoppiare le informazioni ottenute dall'analisi sintattica (cioè, qualunque sia l'AST che hai già) e quella relativa a quella semantica (la tua classe Scope, popolata solo in seguito - dove il "collegamento" principale tra i due sarebbe la tua classe di Identificatore (ad esempio, possibilmente con chiave univoca / indicizzata dalla posizione fisica della riga / colonna dell'occorrenza dell'identificatore che la dichiara in primo luogo per questo o quell'ambito).

    
risposta data 14.03.2018 - 05:47
fonte

Leggi altre domande sui tag