我正在尝试使用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])
但当然不起作用。
我认为我需要的是解析器知道如果我们有一个后跟一个等号的字符串,那么我们只需要一个字符串。
如果我们有一个字符串后跟一个括号,那么我们就开始了一个小组。
如果我们有两个字符串,那么我们就开始了一个列表。
我该怎么做?
此外,评论可能也会出现在行尾......
答案 0 :(得分:0)
我不确定您是否对文件格式有所了解,但您的文件可以很容易地表示为RSON文件(请参阅http://code.google.com/p/rson/)。 RSON格式(和相关的解析器)被开发为JSON的“可读”版本。我在一些项目中使用python RSON解析器。
如果您这样做是为了学习如何解析这样的文件,您仍然可以从RSON解析器中收集一些信息。