Estoy usando pyparsing para analizar los archivos vcd (value change dump). Básicamente, quiero leer los archivos, analizarlos en un diccionario interno y manipular los valores.pyparsing, forward y recursión
Sin entrar en detalles sobre la estructura, mi problema ocurre con la identificación de categorías anidadas.
En los archivos vcd, tiene 'alcances' que incluyen cables y posiblemente algunos ámbitos más profundos (anidados). Piense en ellos como niveles.
Así que en mi archivo, tengo:
$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
Así 'nivel superior' abarca todo (a - i), 'nivel medio' tiene (a - b), 'extralevel' tiene (f - g) , etc.
Aquí está mi código (fragmento) para analizar esta sección:
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)
Ahora, lo que yo pensaba sucede es que, ya que golpea cada ámbito, sería realizar un seguimiento de cada 'nivel ' y terminaría con una estructura que contiene ámbitos anidados. Sin embargo, se produce un error en
$scope module extralevel $end
diciendo que espera '$ upscope'.
Así que sé que no estoy utilizando la recursión correctamente. ¿Alguien me puede ayudar? Avíseme si necesito brindar más información.
Gracias !!!!
Buena intuición! pyparsing sí admite "o", y con la sintaxis exacta que ha adivinado. – PaulMcG
¡Guau, tan simple! ¡¡¡¡¡Funciona a las mil maravillas!!!!! ¡Muchas gracias! – RaytheonLiszt
Siempre es genial cuando puedes adivinar la sintaxis sin tener que buscarla. La sobrecarga puede morderte en el a $$, sin embargo, intenta depurar un programa usando Boost Spirit (el equivalente de pyparse para C++). Es toda la diversión de depurar C++, pero cada llamada al método tiene veinte operadores sobrecargados. –