我正在用python解析文件, pyparsing (这是针对的报告文件 PSAT 在MATLAB中,但这并不重要)。 这里 是我到目前为止所拥有的。我认为这是一团糟,并且想要一些有关如何改进它的建议。具体来说,我应该如何通过pyparsing组织我的语法定义?

我应该在一个函数中都有所有的语法定义吗?如果是这样,这将是一个巨大的功能。如果没有,那么我该如何分解。目前,我已经在文件的各个部分中将其分开。是否值得制作大量功能,这些功能只能从一个地方被调用一次。对我来说,这两个都不是对的。

我应该将所有输入和输出代码放在单独的文件中吗?这将使班级的目的更加清晰。

我也很想知道是否有一种更简单的方法来解析文件,进行一些理智检查并将数据存储在课堂中。我似乎花了很多时间这样做。

(我将接受答案 足够好 或者 使用X而不是Pyparsing 如果人们同意)

有帮助吗?

解决方案

无论哪种方式,我都可以使用单个大方法来创建您的解析器,而不是按照您现在的方式采取步骤。

我可以看到您已经定义了一些有用的助手实用程序,例如缝隙(“抑制文字”,我想),弦乐托盘和十字形。这对我来说很好。

我喜欢您正在使用结果名称,它们确实提高了术后代码的鲁棒性。我建议使用pyparsing 1.4.7中添加的快捷方式,您可以在其中替换

busname.setResultsName("bus1")

busname("bus1")

这可以使您的代码相当多。

我会回顾一下您的解析操作,以查看您在哪里使用数字索引来访问单个令牌,然后回去分配结果名称。这是一种情况,GetStats返回 (ngroup + sgroup).setParseAction(self.process_stats). 。 process_stats的参考文献类似:

self.num_load = tokens[0]["loads"]
self.num_generator = tokens[0]["generators"]
self.num_transformer = tokens[0]["transformers"]
self.num_line = tokens[0]["lines"]
self.num_bus = tokens[0]["buses"]
self.power_rate = tokens[1]["rate"]

我喜欢您将值和统计数据分组,但请继续给他们命名,例如“网络”和“ soln”。然后,您可以将此解析操作代码编写为(我也将其转换为 - 向我转换为 - 易于阅读的对象 - 属性符号而不是DICE元素符号):

self.num_load = tokens.network.loads
self.num_generator = tokens.network.generators
self.num_transformer = tokens.network.transformers
self.num_line = tokens.network.lines
self.num_bus = tokens.network.buses
self.power_rate = tokens.soln.rate

另外,一个样式问题:为什么有时会使用显式和构造函数,而不是使用“+”操作员?

busdef = And([busname.setResultsName("bus1"),
            busname.setResultsName("bus2"),
            integer.setResultsName("linenum"),
            decimaltable("pf qf pl ql".split())])

这很容易写:

busdef = (busname("bus1") + busname("bus2") + 
            integer("linenum") + 
            decimaltable("pf qf pl ql".split()))

总体而言,我认为这是关于这种复杂性的文件的标准。我也有类似的格式(不幸的是,所有专有,因此无法共享),其中我以类似于您的方式构建代码,但是以一种大方法,类似的方法:

def parser():
    header = Group(...)
    inputsummary = Group(...)
    jobstats = Group(...)
    measurements = Group(...)
    return header("hdr") + inputsummary("inputs") + jobstats("stats") + measurements("meas")

该组构造在这样的大型解析器中特别有用,可以在分析数据的每个部分中为结果名称建立一个名称空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top