pyparsing, forward и рекурсия

Я использую pyparsing для синтаксического анализа файлов vcd (дампа изменения значения). По сути, я хочу читать файлы, анализировать их во внутреннем словаре и манипулировать значениями.

Не вдаваясь в подробности структуры, моя проблема возникает с идентификацией вложенных категорий.

В файлах vcd у вас есть "области видимости" которые включают в себя провода и, возможно, некоторые более глубокие (вложенные) области видимости. Думайте о них как об уровнях.

Итак, в моем файле у меня есть:

$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

Итак, «верхний уровень» охватывает все (a - i), «средний уровень» имеет (a - b), «экстрауровень» имеет (f - g ) и т. д.

Вот мой код (фрагмент) для анализа этого раздела:

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)

Теперь, как я подумал , происходит то, что когда он попадает в каждую область видимости, он будет отслеживать каждый 'уровень 'и в итоге я получу структуру, содержащую вложенные области видимости. Однако он ошибается в

$scope module extralevel $end

, говоря, что ожидает «$ upscope».

Итак, я знаю, что использую рекурсию неправильно. Кто-нибудь может мне помочь? Сообщите мне, если мне понадобится дополнительная информация.

Спасибо !!!!

9
задан lesmana 14 September 2013 в 08:44
поделиться