65

Python を使用した字句解析、解析、およびトークン化に関するリソースを教えてもらえますか?

私はオープン ソース プロジェクト ( hotwire ) で少しハッキングを行っており、入力されたコマンドをlexes解析、およびトークン化するコードにいくつかの変更を加えたいと考えていました。これは実際に動作するコードであるため、かなり複雑で、解決するのが少し困難です。

これまでに lex/parse/tokenise のコードに取り組んだことがないので、この側面に関するチュートリアルを 1 つまたは 2 つ実行するのが 1 つのアプローチになると考えていました。実際に変更したいコードをナビゲートするのに十分なことを学びたいと思っています。そこに適したものはありますか?(理想的には、最初にドラゴンの本を購入して読むことなく、午後に行うことができます...)

編集: (2008 年 10 月 7 日) 以下の回答のどれも、私が望むものをまったく与えてくれません。それらを使用して、パーサーをゼロから生成できましたが、lex や yacc などのツールを使用せずに、独自の基本的なパーサーをゼロから作成する方法を学びたいと考えています。そうすることで、既存のコードをよりよく理解できるようになります。

それで、誰かがPythonだけを使って基本的なパーサーをゼロから構築できるチュートリアルを教えてもらえますか?

4

8 に答える 8

38

私はPLYの幸せなユーザーです。これは、Lex と Yacc の純粋な Python 実装であり、非常に Pythonic で使いやすいものにする多くの小さな機能を備えています。Lex と Yacc は最も人気のある字句解析および解析ツールであり、ほとんどのプロジェクトで使用されているため、PLY には巨人の肩に立つという利点があります。Lex & Yacc にはオンライン上に多くの知識が存在し、それを自由に PLY に適用することができます。

PLY には、開始するためのいくつかの簡単な例を含む優れたドキュメント ページもあります。

多くの Python 解析ツールのリストについては、このを参照してください。

于 2008-09-20T05:07:57.413 に答える
31

この質問はかなり古いですが、私の答えは基本を学びたい人に役立つかもしれません. このリソースは非常に優れていると思います。これは、外部ライブラリを使用せずに Python で記述された単純なインタープリターです。したがって、これは、解析、字句解析、およびトークン化の内部作業を理解したい人に役立ちます。

「Python でゼロから作成する単純なインタープリター」:パート 1パート 2パート 3、およびパート 4 .

于 2013-01-14T08:36:04.053 に答える
19

中程度の複雑な文法については、PyParsingが優れています。Python コード内で文法を直接定義できます。コード生成は必要ありません。

>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']

(PyParsing ホームページからの例)。

解析アクション (特定の文法規則がトリガーされたときに呼び出される関数) を使用すると、解析を抽象構文ツリーまたはその他の表現に直接変換できます。

演算子階層、引用符で囲まれた文字列、ネスト、C スタイルのコメントなど、繰り返しパターンをカプセル化する多くのヘルパー関数があります。

于 2008-09-26T01:05:35.700 に答える
6

pygmentsは、Python で書かれたソース コードのシンタックス ハイライターです。レクサーとフォーマッターがあり、ソースをのぞいてみると面白いかもしれません。

于 2008-09-20T05:15:57.613 に答える
5

開始するためのいくつかのことを次に示します (大まかに、最も単純なものから最も複雑なもの、最も強力なものから最も強力なものへ):

http://en.wikipedia.org/wiki/Recursive_descent_parser

http://en.wikipedia.org/wiki/Top-down_parsing

http://en.wikipedia.org/wiki/LL_parser

http://effbot.org/zone/simple-top-down-parsing.htm

http://en.wikipedia.org/wiki/Bottom-up_parsing

http://en.wikipedia.org/wiki/LR_parser

http://en.wikipedia.org/wiki/GLR_parser

私がこのことを学んだとき、それは学期全体の400レベルの大学のコースでした. 手で解析を行う多くの割り当てを行いました。内部で何が起こっているのかを本当に理解したい場合は、同じアプローチをお勧めします。

これは私が使用した本ではありませんが、かなり良い本です: Principles of Compiler Design

うまくいけば、それはあなたが始めるのに十分です:)

于 2008-11-11T01:13:42.507 に答える
5

標準モジュールshlexを見て、そのコピーの 1 つを変更して、シェルで使用する構文に一致させます。これは良い出発点です。

字句解析/解析の完全なソリューションのすべての機能が必要な場合は、ANTLRでPython も生成できます。

于 2008-08-31T17:14:06.990 に答える
3

http://www.canonware.com/Parsing/をお勧めします。これは純粋な python であり、文法を学ぶ必要はありませんが、広く使用されておらず、ドキュメントも比較的少ないためです。重量級は ANTLR と PyParsing です。ANTLR は Java と C++ のパーサー、および AST ウォーカーも生成できますが、新しい言語に相当するものを学習する必要があります。

于 2008-08-31T23:14:54.283 に答える
3

Frederico Tomassetti は、BNF からバイナリ解読に関連するすべての事柄について、適切な (しかし短い) 簡潔な記事を書いています。

  • 字句、
  • パーサー、
  • 抽象構文木 (AST)、および
  • コンストラクト/コードジェネレーター。

彼は、新しい構文解析式文法 (PEG) についても言及しました。

https://tomassetti.me/parsing-in-python/

于 2019-01-05T21:13:57.103 に答える