Ich benutze pyparsing, um vcd (Wert ändern Dump) Dateien zu analysieren. Im Wesentlichen möchte ich die Dateien einlesen, in ein internes Wörterbuch einlesen und die Werte manipulieren.pyparsing, forward und recursion
Ohne auf Details in der Struktur zu gehen, tritt mein Problem beim Identifizieren verschachtelter Kategorien auf.
In VCD-Dateien haben Sie "Bereiche", die Drähte und möglicherweise einige tiefere (verschachtelte) Bereiche enthalten. Denken Sie an sie wie Ebenen.
Also in meiner Akte, die ich habe:
$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
So 'Toplevel' umfasst alles (a - i), 'midlevel' hat (a - b) 'extralevel' hat (f - g) usw.
Hier ist mein Code (snippet) zum Parsen dieser Sektion:
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)
Nun, was ich dachte passiert ist, dass, wie es jeden Bereich trifft, wäre es Spur jedes ‚Niveau halten " und ich würde am Ende eine Struktur mit verschachtelten Bereichen haben. Es ist jedoch auf
$scope module extralevel $end
Ausspruch es erwartet "$ upscope".
Also weiß ich, dass ich die Rekursion nicht richtig verwende. Kann mir jemand helfen? Lassen Sie mich wissen, wenn ich mehr Informationen zur Verfügung stellen muss.
Danke !!!!
Gute Intuition! pyparsing unterstützt tatsächlich "oder" und genau die Syntax, die Sie erraten haben. – PaulMcG
Wow, so einfach !!! Es wirkt wie ein Zauber!!!!! Vielen Dank! – RaytheonLiszt
Es ist immer gut, wenn Sie die Syntax erraten können, ohne nachschlagen zu müssen. Die Überladung kann Sie jedoch im a $$ beißen, versuchen Sie, ein Programm mit Boost Spirit zu debuggen (das Äquivalent von pyparse für C++). Es macht Spaß, C++ zu debuggen, aber jeder Methodenaufruf ist zwanzig überladene Operatoren. –