重新初始化 PLY 解析器
Posted
技术标签:
【中文标题】重新初始化 PLY 解析器【英文标题】:re-initializing PLY parser 【发布时间】:2016-12-21 00:36:46 【问题描述】:我使用 PLY 编写了一个解析器,它可以满足我的需要。 现在,我想使用解析器类解析多个文件。 我不想为每个文件实例化解析器类,而是对所有文件重复使用相同的实例化类(这样我就可以在解析器类中积累一些结果)。
一个文件的解析可能无法很好地完成,因此我想在输入另一个文件之前重新初始化解析器。
的正确方法是什么? (或者,我不应该重用解析器?)
【问题讨论】:
(免责声明:我不使用 PLY。)如果您举例说明您想要保留的数据类型以及原因,您可能会得到更多答案。如果 PLY 确实 有一个安全的重新初始化方法,我怀疑它会留下 un-重新初始化您想要保留的确切值。 ...就此而言,将每个解析器中要保留的数据累积在字典中,或者每个解析文件在一个字典中,不是更好吗? 我正在编写一个 Verilog 解析器,它将处理多个 Verilog 文件。其中一些可能包含错误,因此解析器在解析文件时可能会以有趣的状态停止。我认为重用解析器可能是个好主意,这样就不需要拆除解析器对象并构建一个新的解析器对象。此外,我可以保留类中多个输入文件的解析结果。 “其中一些可能包含错误,因此解析器可能会在一个有趣的状态下停止”,结合“我可以保留来自多个输入文件的解析结果”,听起来你会从第一个混合错误种文件入二中效果不错。但是我不在我的领域,所以我会把这个问题留给其他人。不过,我建议您 edit 您对问题的评论中的详细信息 --- 他们不会在这里被注意到。 Pyparsing 包括一个 verilog 解析器作为其示例的一部分 - 即使您仍然选择使用 PLY,此代码也可以让您深入了解您在自己的解析器实现中需要什么。 【参考方案1】:如果你想对多个文件重用同一个解析器,但每次都重置堆栈,你可以使用restart
函数:
parser = yacc.yacc()
for file in file_list:
with open(file) as fp:
parser.parse(fp.read())
... # accumulate logging info
parser.restart() # this discards the entire parsing stack and resets the parser to its initial state
更多信息请访问official documentation。
【讨论】:
以上是关于重新初始化 PLY 解析器的主要内容,如果未能解决你的问题,请参考以下文章
ORB_SLAM2 源码解析 单目初始化器Initializer