問題タブ [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: YACC のトラブル
PLY を使用して、次のような文を解析しています。
「CS2310相当の経験」
望ましい出力:
YACC トークナイザー記号:
(MISC_TEXT は、他の用語に当てはまらないものに一致することを意図しています。)
パーサーからのいくつかの関連ルール:
残念ながら、これは失敗します:
私は何を間違っていますか?優先ルールの設定方法がよくわかりません。
また、これは私のエラー関数です:
失敗したときにパーサーが試行していたルールを確認する方法はありますか? または、どのルールが試行されているかをパーサーに出力させる他の方法はありますか?
UPDATE token_list()は単なるヘルパー関数です。
更新 2:これが私がやりたい解析です:
この解析アクションを追加しました:
パーサーをビルドしようとすると、次の出力が得られます。
上記のように、構文エラーが発生した場合でも解析は失敗します。
python - Python/YACC: shift/reduce 競合の解決
PLYを使用しています。parser.outからの私の状態の 1 つを次に示します。
これを次のように解決したい:
これを反映するようにパーサー ファイルを修正するにはどうすればよいですか? バックトラックして別のルールを試すことで、構文エラーを処理する必要がありますか?
ドキュメントには次のように記載されています。
次に、これらの値を使用して、数値の優先順位の値と結合方向を各文法規則に関連付けます。これは常に、一番右の終端記号の優先順位を調べることによって決定されます。
ルールに端子がない場合はどうなりますか?
更新:完全な文法:
python - 単純な文法を解析するにはどうすればよいですか?
わかりました、このプロジェクトについてたくさんの小さな質問をしましたが、私が思いついたデザインにはまだあまり自信がありませんので、より広いスケールで質問します.
コースカタログの前提条件の説明を解析しています。ほとんどの場合、記述は特定の形式に従っているため、ほとんどの記述を解析できると思います。
テキストから、コースの前提関係のグラフを生成したいと思います。(データを解析した後、その部分は簡単になります。)
入力と出力の例:
説明全体が単なるコースの場合は、直接出力されます。
コースが結合されている場合 ("and")、それらはすべて同じリストに出力されます。
コースが切り離されている(「または」)場合、それらは別々のリストにあります
ここでは、"and" と "or" の両方があります。
簡単にするための 1 つの警告: "and"/"or" 句の入れ子は、例 3 に示されているよりも大きくなることはないようです。
これを行う最善の方法は何ですか?PLY から始めましたが、reduce/reduce の競合を解決する方法がわかりませんでした。PLY の利点は、各解析ルールが生成するものを簡単に操作できることです。
PyParse では、 の出力を変更する方法があまり明確ではありませんparseString()。オブジェクトに状態を保持し、そこから出力を構築するという@Alex Martelliのアイデアに基づいて構築することを検討していましたが、それがどのように行われるのが最適かは正確にはわかりません。
たとえば、「または」の場合を処理するには、次のようにします。
どのdisjunctionCourses()小さなフレーズを分離するかをどうやって知るのですか? 得られるのはトークンだけですが、これまでに解析されたものは に格納されているresultため、関数は のどのデータがresultのどの要素に対応するかをどのように判断できtokenますか? トークンを検索してresult、同じデータを持つ要素を見つけることができると思いますが、複雑に感じます...
また、次のようなその他のテキストを含む多くの説明があります。
しかし、そのテキストを解析することは重要ではありません。
この問題にアプローチするより良い方法は何ですか?
yacc - BNF: 入力が間違った非終端に行く
私はチェス代数表記の BNF を開発していて、興味深いケースに遭遇しました。入力が間違った非端末に行きます。
私の開始 BNF ルールは次のとおりです (これには意図的にキャスリングやメモが含まれていないことに注意してください)。
piece、start_position、capture、およびpromotionは空にすることができるため、「d4」のような移動が可能になります。問題は、そのような移動が入力されると、入力 ('d4') が によって取得されるstart_positionため、エラー b/c there is no more input forend_positionが発生することです。空にすることはできません。
明らかなハック/回避策は、end_position空にすることを許可し、それに対する入力があるかどうかを確認し、それに応じて行動することです。
これはうまくいきますが、これに対処する方法があるかどうか知りたいです。式全体が一致しない場合、入力が最初に一致するシンボルに移動しない可能性はありますか?
別の質問は、これが BNF の標準的な動作なのか、それとも私が使用している yaccer の問題なのかということです: PLY v 3.3.
flex/bison を使用してみましたが、同じ結果が得られました。そのため、PLY に固有のものではないようです。
完全を期すために関連するすべてのルールを次に示します。
python - yaccは削減に失敗します(Python Lex-Yacc)
PLY(yaccのPython実装)を使用してかなり単純な文法を書き込もうとしていますが、必要なyaccときにトークンの文字列を減らすのに問題があります。
さまざまな種類の引数を取る一連のコマンドを解釈したいと思います。引数の種類ごとに異なるトークンがあります。出てくるトークンの文字列は次のlexようになります。
yaccこれらの各行を。というルールにまとめたいと思いinstructionます。ただし、yacc最後の引数()の後の最初の行の削減を停止することを拒否しSTRARG、予期しないCOMMANDトークンのために構文エラーを生成します。
つまり、に減らす代わりに、COMMAND VARARG VARARG STRARG取得instructionするyaccためにもう一度シフトします(読み取られるべきではなかった次の行からCOMMAND VARARG VARARG STRARG COMMAND最後の行を取得します)。COMMAND
私のコードのyacc部分は次のようになります。
ルールの仕様に明らかな誤りがありますか?lex/を使うのは初めてyaccなので、驚かないでしょう。
python - PLY を使用した Python の解析
Pythonパーサーを作成しようとしていますが、私の意見では、「ifステートメント」を解析できますが、解析できません。「構文エラー」メッセージが表示されます。
誰かが私が間違っていることを教えてもらえますか?
前もって感謝します。
コードはこちら: https://github.com/narke/py2neko
入力文字列を次のように変更しました。
出力は次のとおりです。
parsing - PlyLex解析の問題
lexパーサーとしてplyを使用しています。私の仕様は次のとおりです。
次の文字列を解析しようとすると:
次の出力が得られます。
トークンTHENを認識せず、代わりに「hen」を識別子として使用します。
何か案は?
parsing - プライ:「c」言語のルールを定義する際の問題
式、代入、if-else、whileループを処理できるc言語用のパーサーを作成しようとしています。
これが私のルールです:
式->式op式
式->ID
式->NUMBER
ステートメント->IDASSIGN式
ステートメント->IF式THENステートメント
ステートメント->WHILE式THENステートメント
大文字のすべてがトークン(終端記号)です
文字列「whileh<=0 then t = 1」を解析する場合、「h」を式と見なすようです(ルールexpression-> IDを使用)。したがって、「WHILEexpressionTHENステートメント」の式は「h」になります。明らかに、式として「h <= 0」を考慮したいと思います(ルール式->式op式を使用)。これが発生することを確認するにはどうすればよいですか?
python - PLY で記述された、Python (またはサブセット) 用の文法またはレクサーとパーサーはありますか?
PLY で記述された、Python (またはサブセット) 用の文法またはレクサーとパーサーはありますか?
python - PEG の Empty 生産の役割は何ですか?
空の生産ルール
lex-yacc LR ボトムアップ パーサー ジェネレーター (PLY など) で役立ちます。
pyparsing などの PEG パーサーで空のプロダクションを使用する必要があるのはどのような状況ですか?