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])

しかし、もちろんうまくいきません。

私が必要だと思うのは、文字列の後に等号が続く場合にのみ、あと 1 つの文字列しか期待できないことをパーサーが認識できるようにする方法です。

文字列の後に括弧が続く場合、グループを開始しています。

2 つの文字列がある場合は、リストを開始しています。

どうすればいいですか?

また、コメントはおそらく行末にも表示される可能性があります...

4

1 に答える 1

0

ファイル形式が決まっているかどうかはわかりませんが、ファイルは RSON ファイルとして簡単に表現できます ( http://code.google.com/p/rson/を参照)。RSON 形式 (および関連するパーサー) は、JSON の「読み取り可能な」バージョンになるように開発されました。一部のプロジェクトで python RSON パーサーを使用しています。

このようなファイルを解析する方法を学ぶためにこれを行っている場合でも、RSON パーサーからいくつかの情報を収集できる可能性があります。

于 2012-07-24T15:42:08.000 に答える