#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 во многих проектах, но обычно я выполняю поиск по строке и не сопоставляю несколько экземпляров одного и того же выражения. Спасибо за помощь.