Analisi condizionale di analisi

0

Ho scritto una piccola utility in Python3 per aiutarmi a copiare la mia collezione musicale dal mio NAS a un dispositivo mobile. L'utilità di questo è che converte automaticamente i file flac in ogg-vorbis (per risparmiare spazio) ed esclude alcuni file in base ai loro tag audio (cioè artista, album, data, ecc.)

Non sono contento della natura limitata della funzione di esclusione e voglio migliorarla, ma ho raggiunto un blocco mentale e sto cercando consigli su come procedere.

Vorrei che l'utente scrivesse un file di esclusione che assomigliò a questo:

exclude {
    artist is "U2"

    artist is "Uriah Heep" {
        album is "Spellbinder"
        album is "Innocent Victim"
    }
}

Questo si tradurrebbe in:

exclude if 
(artist = "U2") OR 
(artist = "Uriah Heep" AND (album = "Spellbinder" OR album = "Innocent Victim"))

Ci saranno più condizionali come la corrispondenza della sottostringa e gli intervalli di date.

Ho controllato PLY ma sto lottando con i concetti su come analizzare questo tipo di struttura nidificata e anche come rappresentare il condizionale risultante in modo che possa essere eseguito nel codice quando si applica il filtro di esclusione durante l'operazione di copia.

    
posta user2582685 12.11.2015 - 10:24
fonte

1 risposta

2

Risposta agnostica linguistica (non conosco python):

Poiché la tua struttura è un albero, devi archiviarlo come albero. Devi sapere se il tuo albero avrà solo due livelli o più, questo potrebbe influire sul modo in cui gestirlo (ricorsivamente o forza bruta).

Se non è necessario ottimizzare la velocità, è possibile iniziare con un algoritmo ingenuo.
Abbina il tuo albero con un algoritmo di gestione.
Inizia dal livello superiore.
1 / Loop per ogni ramo fino a quando non trovi una corrispondenza (esclusione), se non c'è alcuna corrispondenza restituisce al chiamante senza esclusione.
2 / Se il nodo non ha un ramo al livello successivo, ritorna al chiamante con un'esclusione.
3 / Se il nodo ha rami o foglie al livello successivo, scendere di un livello e iniziare dall'azione 1.

HTH

    
risposta data 18.11.2015 - 01:17
fonte

Leggi altre domande sui tag