問題タブ [ply]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python で論理式を処理するにはどうすればよいですか?
ieの形式で論理式を取得したとしましょう。AvBv~C->D
. ブール要素と(v,~,->)
(論理和、否定、含意) などの演算子で構成されます。これらの式と、それらを構成する各要素を保存する必要があります。また、各要素には説明が必要なので、それらを表すクラスを作成する必要があると思います(フィールドrepresentation
とdescription
ieを使用しますが、これがpythonicの方法であるかどうかはわかりません。名前と説明を列として持つ2D配列かもしれませんelement1.representation="A"
)element1.description="This is element A"
名前はすべて一意であるため、より良いアイデアです。
- このような式を格納するには、どのデータ構造を使用すればよいですか? 異なる型の要素と演算子を格納し、それらを論理式として復元し、それらに対して操作を実行できるようにする必要があるという事実に注意してください。
- 論理演算を処理するために、各要素と演算子を認識するメソッドを作成する必要がありますか、それともより良いアプローチがありますか? おそらく、Lex-Yacc のようなパーサーや、それらを扱う他のライブラリを使用するのでしょうか?
あまり明確でない場合はご容赦ください。ただし、同じデータ構造に異なるタイプの要素を格納できない Java から来ています。
python - 一重引用符、二重引用符、または三重引用符を含む Lex 文字列
私の目的は、Python が文字列を処理するように解析することです。
質問:以下をサポートする lex の書き方:
"string..."
'string...'
"""multi line string \n \n end"""
'''multi line string \n \n end'''
いくつかのコード:
私の現在のアイデアは、4 つの異なる文字列ケースに一致する4 つの一意の状態を作成することですが、より良いアプローチがあるかどうか疑問に思っています。
ご協力いただきありがとうございます!
python-2.7 - PLY を使用して通常の文字列に一致させる
PLYを使用してパーサーを作成しています。質問はこれに似ていますエスケープが二重引用符文字である文字列リテラルに一致する正規表現を書く方法? . ただし、文字列の開閉には二重引用符を使用します。例えば:
「\"A\"が何かわかりません」
通常の文字列レクサーを次のように定義します。
そして、変数用の別のレクサーがあります:
問題は、レクサーが「\"A\" が何かわからない」を NORMSTRING トークンとして認識しないことです。エラーを返します
正しくない理由を教えてください。
python - python -OO で PLY を使用しますか?
アプリケーションが開始されるシステムがあります:
アプリケーションの起動方法を変更することはできませんが、アプリケーションを完全に制御できます。PLYを使用してアプリケーションにパーサーを追加するとき、-OO が PLY が依存するドキュメントストリングを削除するという事実に悩まされました。
-OO で起動したアプリケーションで PLY を使用することはできませんか? この問題を解決するために使用できる巧妙な Python トリックはありますか?
Cython を使用してパーサー モジュールをコンパイルすることを考えています。それができるかどうかはわかりませんし、複雑さの層が追加されるので、その道を進む前に、他のアイデアをいただければ幸いです。
python - 単純な PLY インタープリターで引数リストから非決定性を解決する
些細なことだと思うことを解決するのに苦労しています。PLY の calc の例を修正して、いくつかの関数呼び出しと、1 つ以上の式 (式は名前、数値、またはリテラル) を受け入れることができる引数リストを含めました。問題は、私の実装が非決定論的であることです。複数行の引数が正しく、そうでない場合もあります。
たとえば、実行中に次のように入力しています。
時々実行すると、次のようになります。
また、プログラムを実行すると、これが生成されます(これは避けたいです):
どちらの場合も、パーサーは正しいルール (p_expression_number) に入りますが、間違ったものを選択することもあります。半分の時間は、(コンマを無視して) 式に縮小され、次の引数であるコンマが理解できないと不平を言うように見えます。それ以外の時は大丈夫です。
これを解決するにはどうすればよいですか? 私はいくつかのことを試しましたが、例を調べましたが、わかりません。
これが私のコードです:
python - PLY を使用して Python で記述された言語は遅くなりますか?
独自のプログラミング言語の作成に興味があり、Python を使用したいと考えています。私の質問は、PLY ライブラリを使用して Python で記述された言語は、CPython よりもかなり遅いでしょうか、それともプログラムの実行速度に関してはほぼ同じでしょうか? また、Cで実装した場合、パフォーマンスの点でどれくらい良くなりますか?
ありがとう、フランシス
parsing - この文法でバックトラックする必要を避けるために、何かできることはありますか?
私はプログラミング言語のインタープリターを実装しようとしていますが、後戻りする必要があるケースに出くわしましたが、私のパーサージェネレーター (ply、Python で書かれた lex&yacc クローン) はそれを許可しません。関係するルールは次のとおりです:
エラーは、フォームのステートメントで発生します
SomeGuy.SomeOtherGuy は、型を格納する有効な変数です (型はファースト クラス オブジェクトです)。その型には、引数のないコンストラクターがあります。
その式を解析すると、パーサーは var_access_start = SomeGuy var_access_metcall = を構築します。SomeOtherGuy ( ) を実行し、セミコロンを見つけてエラー状態で終了します - パーサーがバックトラックして、式 = new typereference(SomeGuy .SomeOtherGuy) LPAREN empty_list RPAREN を作成してみてください。var ステートメントの構文と完全に一致します
ただし、PLY はバックトラッキングをサポートしておらず、パーサー ジェネレーターで実際に自分で実装するのに十分な経験がないことを考えると、問題を回避するために文法に変更を加えることはできますか?
の代わりに -> を使用することを検討しました。「メソッド呼び出し」演算子としてですが、パーサーをなだめるためだけに言語を変更したくありません。また、「変数参照」の形式としてメソッドがあるため、 myObject.someMethod().aChildOfTheResult[0].doSomeOtherThing(1,2,3).helloWorld() を実行できますが、文法を修正して同じ効果、それも私のために働くだろう
ありがとう!