Sto usando pyparsing per analizzare i file vcd (value change dump). In sostanza, voglio leggere i file, analizzarli in un dizionario interno e manipolare i valori.pyparsing, forward e ricorsiva
Senza entrare nei dettagli sulla struttura, il mio problema si verifica con l'identificazione di categorie annidate.
In file vcd, si dispone di 'ambiti' che includono fili e possibilmente alcuni ambiti più profondi (nidificati). Pensa a loro come livelli.
Così nel mio file, ho:
$scope module toplevel $end
$scope module midlevel $end
$var wire a $end
$var wire b $end
$upscope $end
$var wire c $end
$var wire d $end
$var wire e $end
$scope module extralevel $end
$var wire f $end
$var wire g $end
$upscope $end
$var wire h $end
$var wire i $end
$upscope $end
Così 'primo livello' comprende tutto (A - I), 'midlevel' ha (a - b), 'extralevel' ha (f - g) , ecc
Ecco il mio codice (snippet) per l'analisi di questa sezione:
scope_header = Group(Literal('$scope') + Word(alphas) + Word(alphas) + \
Literal('$end'))
wire_map = Group(Literal('$var') + Literal('wire') + Word(alphas) + \
Literal('$end'))
scope_footer = Group(Literal('$upscope') + Literal('$end'))
scope = Forward()
scope << (scope_header + ZeroOrMore(wire_map) + ZeroOrMore(scope) + \
ZeroOrMore(wire_map) + scope_footer)
Ora, quello che ho pensato accade è che in quanto colpisce ogni ambito, sarebbe tenere traccia di ogni 'livello ' e finirei con una struttura che contiene ambiti nidificati. Tuttavia, errori su
$scope module extralevel $end
dicendo che si aspetta "$ upscope".
Quindi so che non sto utilizzando correttamente la ricorsione. Qualcuno mi può aiutare? Fammi sapere se ho bisogno di fornire maggiori informazioni.
Grazie !!!!
Buona intuizione! il pyparsing supporta infatti "o" e con la sintassi esatta che hai indovinato. – PaulMcG
Wow, così semplice !!! Esso funziona magicamente!!!!! Grazie mille! – RaytheonLiszt
È sempre bello quando puoi indovinare la sintassi senza doverla cercare. Tuttavia, il sovraccarico può azzannarti a a $$, prova a eseguire il debug di un programma usando Boost Spirit (l'equivalente di pyparse per C++). È tutto il divertimento del debug di C++, ma ogni chiamata di metodo è di venti operatori sovraccaricati in profondità. –