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])
しかし、もちろんうまくいきません。
私が必要だと思うのは、文字列の後に等号が続く場合にのみ、あと 1 つの文字列しか期待できないことをパーサーが認識できるようにする方法です。
文字列の後に括弧が続く場合、グループを開始しています。
2 つの文字列がある場合は、リストを開始しています。
どうすればいいですか?
また、コメントはおそらく行末にも表示される可能性があります...