問題タブ [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 - ast で goto を実装する
背景: 冬休み中の短いプロジェクトとして、Python と PLY を使用して、Ax (グラフ電卓用に設計された) というプログラミング言語を実装しようとしています。簡単な注意: この言語はグローバル変数のみを許可し、ポインターを多用します。
この言語で goto を実装しようとしていますが、その方法がわかりません。
私の一般的な方法は、最初に PLY を使用してコードを ast に解析し、次にそれを実行しながら実行することです。
たとえば、ステートメント
...に変わるだろう...
...これを再帰的に実行します (読みやすくするためにインデントを追加しました)。
ast はツリーであるため、異なるノード間をジャンプする方法がわかりません。おそらく、ツリーをフラットな配列に変換して、フラットな配列['IF', ['CONDITION', 3], ['DISP', 4], ['DISP', 6]]
のインデックスを使用してコードの特定の行に移動できるようにすることを検討しましたが、これには特定の優雅さが欠けているようで、ほとんどステップのように感じます逆に(間違っているかもしれませんが)。
私はこれを見てきましたが、それがどのように機能するかを理解できませんでした。
ヘルプやヒントをいただければ幸いです。
python - PLY で文法ファイルの非終端記号を破棄する方法 (Python Lex-Yacc)
PLY の使用時に問題が発生しました。PLYでコールグラフジェネレーターを作りたいです。場合によっては、文法ファイル内のいくつかのトークンを破棄する必要があります。これは、トークンを破棄する前にパーサーがそのトークンを認識したときに何かを行う必要があるためです。そのため、レクサー ファイルで単に破棄することはできません。たとえば、「IF」トークンは破棄したいものです。それで、文法ファイルでそれを破棄するために何かをしようとします。と同じように:
でも、思うようにはいきませんでした。symstack (これはパーサーの属性であり、パーサーは yacc.py の LRParser インスタンスです) を出力し、symstack リストには以前のトークンのみが含まれますが、「if」は含まれません。したがって、この状況でトークンを破棄する方法を考えています。誰でも私を助けることができますか?どうもありがとう!
python - LALR文法、末尾のコンマ、複数行のリストの割り当て
課題で構成される非常に単純な言語のLALR文法を作成しようとしています。例えば:
言語は、値のリストも処理する必要があります。次に例を示します。
しかし、私は複数行のリストも処理したいと思います。
末尾のコンマ(シングルトンと言語の柔軟性のため):
そして明らかに、両方同時に:
末尾のコンマまたは複数行のリストを使用して文法を書くことはできますが、両方を同時に書くことはできません。
私の文法は次のようになります。
注:この種のコードを禁止するには、文法に「\n」が必要です。
よろしくお願いします、
アントワーヌ。
python - PythonPLYの複数のルール
プライでは、どのルールが使用されたかをどのように区別できますか?
例:-'''p:ab | c | d'''したがって、ルールごとに異なるコードを作成する必要があるとします。それでは、そうするためのエレガントな方法はありますか。マニュアルに記載されている1つの方法は、ルールとトークンの組み合わせを使用することですが、私が見つけたものは常にクリックするとは限りません。
python - パーサーからの Python PLY lexer 状態の制御
クエリパーサーのような単純な SQL 選択に取り組んでおり、特定の場所で発生する可能性のあるサブクエリを文字通りキャプチャできるようにする必要があります。lexer 状態が最適なソリューションであることがわかり、中かっこを使用して POC を実行して開始と終了をマークすることができました。ただし、サブクエリは中括弧ではなく括弧で区切られ、括弧は他の場所でも発生する可能性があるため、すべてのオープン括弧で状態になることはできません. この情報はパーサーですぐに利用できるので、パーサー ルールの適切な場所で begin と end を呼び出したいと考えていました。ただし、レクサーはストリームを一度にトークン化するように見えるため、これは機能しませんでした。したがって、トークンは INITIAL 状態で生成されます。この問題の回避策はありますか? これが私がやろうとしたことの概要です:
start_subquery() と end_subquery() は次のように定義されます。
lexer トークンは、閉じ括弧を検出するためだけに存在します。
助けていただければ幸いです。
python - 手書きのレクサー用のPLYインターフェースを作成するにはどうすればよいですか?
私はPythonでコンパイラーを書いていますが、PLYでインデントを解析する方法がわからないため、手書きのレクサーを作成しました。また、私のレクサーは次のyield
ようないくつかのステートメントを使用します。
ただし、PLYパーサーにはメソッドが必要であることに気付いたtoken
ので、次のようなメソッドを作成しました。
私のテストによると、実際のスキャンscan()
には平均124ミリ秒かかりますが、PLYパーサーを使用すると、数分経っても解析が開始されません。私のtoken()
方法には問題があるようです。
また、インターフェイスになるようscan()
にメソッドの名前を変更しようとしました。Pythonは次のようなものを返します
したがって、PLYには一度に1つのトークンを返すメソッドが必要なようです。
token()
の次の反復を返し、それほどscan()
遅くならないようにメソッドを書き直す方法はありますか?
python - plyで正規表現で空白をエスケープしますか?
正規表現で単一の空白をエスケープする必要がありますか? Python では次のいずれかの方法で動作することがわかっています: re.compile(r'\s')
、re.compile(r' ')
およびre.compile(r'\ ')
. したがって、Python re モジュールを使用してエスケープするかどうかを選択できるようです。
しかし、ply.lex を介して単一の空白のルールを定義しようとしたとき、状況は少し異なるようです。
ply.lex は、ルールのドキュメント文字列で特別な処理を行いますか?
python - 正規表現の大文字と小文字を区別しないように PLY を取得する方法は?
私は、SQL INSERT ステートメントからDbUnitで使用されるデータセット XML ファイルへの単純なトランスレーターに取り組んでいます。
私の現在の定義は次のようになります。
ここで、SQL の大文字と小文字を区別しないコマンドをサポートしたいと考えています。たとえば、INSERT INTO
、Insert Into
、insert into
およびのすべてをiNsErT inTO
同じものとして受け入れます。
ケースを無視するように PLY を使用する方法があるかどうかre.I
、または私が慣れていないルールを作成するためのさらに別の方法があるかどうか疑問に思います。
python - PLYyacc解析IF-ELSEIF-ELSEネストされたステートメント
ネストされたifステートメントの正しい文法規則を書くのを誰かが手伝ってくれますか?私の言語では、次のような構文を書くことができます。
RULE_OPEN
レクサーを書いたので、左右の括弧はRULE_CLOSE
トークンです。「IF」はIF
トークン、「END」はEND
トークン、「ELSE」はELSE
トークン、「CONDITION」はCONDITION
トークンです。
「いくつかのステートメント」は、私の言語で許可されているものであれば何でもよいと仮定します(一般的なプログラミング言語のように)。IFステートメントをおそらく無限にネストできることが重要です。
これが明確であることを願って、私がそれをひどく説明したかどうか私に知らせてください。
どんなに頑張っても。私は常にshift/reduceの競合を取得しており、パーサーは正しい入力を受け入れていません。
とはいえ、私は他の方法なしでルールを作成することに成功しました-if。else-ifのルールを追加すると、コードが非常に複雑になり始めます。
以下は、else-if部分なしでの私の成功したアプローチです(関連するルールのみをリストしました):
これは構文解析で非常に一般的な問題だと思います。ここの誰かがすでにそれを解決していることを願っています:-)助けてくれてありがとう!
python - 解析: 定義したルールが一致しないのはなぜですか?
私は、mythryl を neko に変換することを目的とした、PLY を使用したトランスコンパイラを Python で作成しています。
問題は、次のようなコードを解析するときです。
この例はhttps://github.com/narke/my2neko/blob/master/test_cases/ex1.myにあります。
パーサーは、FUN_T で表される予約語「fun」に適用される規則と一致しません。もちろん規則は存在します。最後の規則は次のとおりです。
パーサーはhttps://github.com/narke/my2neko/blob/master/my2neko.pyにあります。
私が得たエラーは次のようなものです:
再現するには: ./my2neko.py test_cases/ex4.my f.neko
私が見逃したものを教えてください。前もって感謝します。
プロジェクトは次のとおりです: https://github.com/narke/my2neko