Сохранение нескольких совпадений результатов синтаксического анализа

#pyparsing

#pyparsing

Вопрос:

Приносим извинения, если это было пропущено при поиске.

У меня есть случай, когда я пытаюсь получить некоторую информацию о сетевом списке Verilog. Необходимая мне информация довольно проста, скажем так, мне нужно знать имена всех модулей в файле. (В конечном итоге я хочу большего, но этого примера достаточно)

Я определил следующую строку для тестирования и грамматики

 mystr = """
module MyModule(
  input somein,
  output someout
);
//this is a comment
endmodule

module MyModule2(
  input somein2,
  output someout2
);
//this is another comment
endmodule
"""
             
module_name = Word(alphanums '_').setResultsName('module_name')

base_module = (Keyword("module")   module_name   lpar   SkipTo(rpar)   
                SkipTo(Keyword("endmodule"), include=True)).setResultsName('base_module')

verilog = ZeroOrMore(base_module).setResultsName('modules')


results = verilog.parseString(mystr)

print(results)
print("n===============n")
print(results.dump())
print("n-------n")
print(results.base_module.dump())
print("n-------n")
print(results.base_module.module_name)

 

При запуске этого я получаю следующее:

 ['module', 'MyModule', '(', 'input somein,n  output someoutn', ');n//this is a commentn', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,n  output someout2n', ');n//this is another commentn', 'endmodule']

===============

['module', 'MyModule', '(', 'input somein,n  output someoutn', ');n//this is a commentn', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,n  output someout2n', ');n//this is another commentn', 'endmodule']
- base_module: ['module', 'MyModule2', '(', 'input somein2,n  output someout2n', ');n//this is another commentn', 'endmodule']
- module_name: 'MyModule2'
- modules: ['module', 'MyModule', '(', 'input somein,n  output someoutn', ');n//this is a commentn', 'endmodule', 'module', 'MyModule2', '(', 'input somein2,n  output someout2n', ');n//this is another commentn', 'endmodule']

-------

['module', 'MyModule2', '(', 'input somein2,n  output someout2n', ');n//this is another commentn', 'endmodule']

-------

 

Если вы видите, кажется, существует только один экземпляр module_name and base_module . Я могу установить listAllMatches=True , однако это приводит module_name к тому, что у обоих. В идеале я хотел бы иметь возможность просматривать результаты синтаксического анализа с помощью чего-то вроде следующего:

 modules
  [0]
    base_module : [<base module string>]
    module_name : '<name>'
  [1]
    base_module : [<base module string>]
    module_name : '<name>' 
 

Я полагаю, что мне не хватает чего-то фундаментального в том, как сохраняются результаты синтаксического анализа при сопоставлении нескольких экземпляров одного и того же выражения. В прошлом я использовал PyParsing во многих проектах, но обычно я выполняю поиск по строке и не сопоставляю несколько экземпляров одного и того же выражения. Спасибо за помощь.