我正在尝试使用 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])
但当然它不起作用。
我认为我需要某种方式让解析器知道,如果我们有一个字符串后跟一个等号,那么只有这样我们才能期望再有一个字符串。
如果我们有一个字符串后跟一个括号,那么我们已经开始了一个组。
如果我们有两个字符串,那么我们就开始了一个列表。
我该怎么做呢?
此外,可以想象,注释也可能出现在行尾......