0

我正在尝试使用 pyparsing 构建一个简单的解析器。

我的示例文件如下所示:

# comment
# comment

name1 = value1
name2 = value2


example_list a
  foo
  bar


grp1 (

example_list2 aa
  foo
  bar


example_list3 bb
  foo
  bar

)



grp2 (

example_list4 x
  foo
  bar

example_list5 x
  foo
  bar

example_list6 x
  foo
  bar
)

到目前为止,我提出的解析器如下所示:

#!/usr/bin/python
import sys
from pyparsing import *

blank_line = lineStart + restOfLine
comment = Suppress("#") + restOfLine

alias = Word(alphas, alphanums)
name = Word(alphas, alphanums + "_")
value = Word(printables)

parameter = name + Suppress("=") + value
flag = Literal("*") | Literal("#") | Literal("!")
list_item = Optional(flag) + value
list = name + alias + lineEnd + OneOrMore(list_item) + blank_line
group = alias + Suppress("(") + lineEnd + OneOrMore(list) + lineStart + Suppress(")")
script = ZeroOrMore(Suppress(blank_line) | Suppress(comment) | parameter ^ list ^ group)

if __name__ == "__main__":
    print script.parseFile(sys.argv[1])

但当然它不起作用。

我认为我需要某种方式让解析器知道,如果我们有一个字符串后跟一个等号,那么只有这样我们才能期望再有一个字符串。

如果我们有一个字符串后跟一个括号,那么我们已经开始了一个组。

如果我们有两个字符串,那么我们就开始了一个列表。

我该怎么做呢?

此外,可以想象,注释也可能出现在行尾......

4

1 回答 1

0

我不确定您是否确定了文件格式,但您的文件可以很容易地表示为 RSON 文件(请参阅http://code.google.com/p/rson/)。RSON 格式(和相关的解析器)被开发为 JSON 的“可读”版本。我在我的一些项目中使用了 python RSON 解析器。

如果您这样做是为了学习如何解析这样的文件,您仍然可以从 RSON 解析器中收集一些信息。

于 2012-07-24T15:42:08.000 回答