2

私のPyparsing文法の定義には、複数行にまたがる文字列に一致する文法がいくつかあります。次のようなAPIを使用する場合:

PyGrammar.parseString(open('file_name').read())

正しい方法で動作する場合。

ただし、イテレータを使用して次のようなファイルを読み取りたい場合

with open('file_name') as f:
   for line in f:
      PyGrammar.parseString(line)

パーサーが壊れます

このケースを回避する方法はありますか?ありがとう...

4

1 に答える 1

1

Paul(pyparsingの作者)によると

with open('file_name') as f:
   for line in f:
      PyGrammar.parseString(line)

上記のコードは、pyparsing を使用する正しい方法ではありません。Pyparsing は、テキストを解析する前にすべてのソース テキストを確認する必要があります。そのため、テキストの各行で parseString を呼び出すと、うまくいきません。別の回避策は、ラッパーを使用することです。お気に入り:

    # set up a generator to yield a line of text at a time
    linegenerator = open('big_hairy_file.txt')
    # buffer will accumulate lines until a fully parseable piece is found
    buffer = ""

    for line in linegenerator:
        buffer += line

        match = next(grammar.scanString(buffer), None)
        while match:
            tokens, start, end = match
            print tokens.asList()

            buffer = buffer[end:]
            match = next(grammar.scanString(buffer), None) 
于 2012-10-03T02:56:48.803 に答える