0

私はカスタム言語用のpythonicパーサーを書いていますが、今のところ次のようなものがあります:

re1 = re.compile(r"...")
re2 = re.compile(r"...")
re3 = re.compile(r"...")
re4 = re.compile(r"...")
...
...

今、入力ファイルを読んでいます。特定のキーワードが見つかった場合は、各行で特定の正規表現を使用しています。明らかに、私はこのようなことをしているので、これは私の人生を生き地獄にしています:

if line.find("keyword1") >= 0
  # Uses re1 to match the string
  invoke_handler1() 
elif line.find('keyword2") >= 0
  # Uses re2 to match the string
  invoke_handler2() 
...

同時に、指定された行を可能なすべての正規表現と一致させたくありません。それは無駄になるからです。この時点までに書いたことをすべて破棄せずに、この問題を解決し、より効率的で読みやすいものにするエレガントな方法はありますか?

4

3 に答える 3

3

を使用して独自のパーサーを展開するのではなく、Python で利用可能な多くのパーサー ライブラリの 1 つを調べることができます。

于 2011-03-07T20:50:55.980 に答える
2

これがあなたが探している答えではないと思いますが、実際のレクサーとトークナイザーを使用して言語を解析する方が良いと思います。この種のタスクにPLYを使用する方法を検討し、学習することをお勧めします。

于 2011-03-07T20:51:06.587 に答える
1

キーワードをREにマップするデータ構造を作成することをお勧めします。しかし、正直なところ、私は最優先事項として高速で失敗するREを作成し、それらすべてをループするようにします。

フェイルファストREの例は、最初の文字が「S」と一致しないかのように「^ Sometext」で始まるもので、残りのREは評価されません。

于 2011-03-07T20:52:38.557 に答える