問題タブ [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 - PLY: C パーサーでのトークン シフトの問題
PLY を使用して C パーサーを作成していますが、最近問題が発生しました。このコード:
my_type は、以前は型として使用されていた型として定義されているため、正しい C コードです。型と単純な識別子を区別するためにレクサーが使用するパーサーの型シンボル テーブルに入力することで、これを処理します。
ただし、型宣言規則は SEMI (';' トークン) で終了しますが、PLYmy_type
は最初の行で終了したと判断する前に、2 行目からトークンをシフトします。このため、型シンボル テーブルの更新をレクサーに渡す機会がなく、レクサーは my_type を型ではなく識別子として認識します。
修正のアイデアはありますか?
完全なコードは次の場所にあります: http://code.google.com/p/pycparser/source/browse/trunk/src/c_parser.py これより小さな例を作成する方法がわかりません。
編集:
問題が解決しました。以下の私の解決策を参照してください。
python - plyの正規表現でUnicodeを一致させる
識別子を一致させていますが、問題があります。識別子にUnicode文字を含めることができます。したがって、物事を行うための古い方法では十分ではありません。
私のマークアップ言語パーサーでは、明示的に使用する文字を除くすべての文字を許可することでUnicode文字を照合します。これは、マークアップ言語には2つまたは3つの文字しかないため、その方法でエスケープする必要があるためです。
すべてのUnicode文字をPython正規表現およびプライと一致させるにはどうすればよいですか?また、これはまったく良い考えですか?
プログラムの識別子(変数名など)として、Ω»«°foo²väliπなどの識別子を使用できるようにしたいと思います。なんてこった!実用的であれば、自分の言語でプログラムを書いてほしいです!とにかく、ユニコードは今日、さまざまな場所でサポートされており、普及するはずです。
編集:POSIX文字クラスはPython正規表現によって認識されないようです。
編集:私が必要なものをよりよく説明するため。すべてのUnicode印刷可能文字に一致するが、ASCII文字にはまったく一致しない正規表現が必要です。
編集:r "\ w"は私が望むことを少し行いますが、«»とは一致しません。また、数字と一致しない正規表現も必要です。
python - lex/yaccを使用して残りのデータをトークン化する
許してください。私は構文解析とlex/yaccにまったく慣れていません。おそらく頭を悩ませていますが、それでも次のようになります。
私はPLYを使用してかなり基本的な計算機を書いていますが、その入力は必ずしも方程式であるとは限らないため、解析時にそうであるかどうかを判断する必要があります。入力の極値は、方程式に対して完全に評価され、それが細かく解析されて計算されるもの、または方程式のようなものではなく、解析に失敗して細かくされるものになります。
灰色の領域は、方程式のような部分を持つ入力であり、パーサーがその部分を取得して処理します。これは私が望んでいることではありません-エラーをスローバックできるように、文字列の一部が取得およびトークン化されていないかどうかを判断できる必要がありますが、これを行う方法がわかりません。
基本的に、「残っているものをキャッチする」トークンを定義する方法を知っている人はいますか?それとも私がこれを処理できるより良い方法はありますか?
python - PLYを使用した1つのパーサーに対して複数のレクサー?
Linuxカーネルの構成オプションを生成するために使用されるKconfig言語のPLYを使用して、pythonパーサーを実装しようとしています。
包含を実行する source というキーワードがあるので、レクサーがこのキーワードに遭遇すると、レクサーの状態を変更して、ソースファイルをレクシングする新しいレクサーを作成します。
他のどこかにこの行があります
これは、パーサーによって呼び出される「メイン」または「ルート」レクサーです。
私の問題は、パーサーに別のレクサーを使用するように指示する方法や、「source_lexer」に何かを返すように指示する方法がわからないことです...
たぶん、クローン機能を使用する必要があります...
ありがとう
parsing - LALR パーサーでシフト/リデュースの競合を解決する
PLY を使用して自分の言語用のパーサーを構築してきましたが、shift/reduce の競合が発生して問題が発生しています。私の言語には、構文 ala C++ テンプレートを持つジェネリック型があります。だから今、私は次のようなルールを持っています:
ただし、解析できないことがわかりました。
(これは明らかな理由で問題です)。デバッグ出力は次のとおりです。
さらにパーサーが必要な場合は、提供できます。ありがとう。
編集:私に提案された1つの解決策は、型を独自のトークンにすることでした。私の言語は C/C++ のようなプリプロセッサ インクルード システムを使用していないため、これには少し作業が必要になりますが、それでも可能だと思いますが、文法に制限されたソリューションを希望します。
python - 数式を解析するには、Lex または自家製のソリューションを使用する必要がありますか?
私は小さなルールベースの「数学」エンジンを書いているところです。これではわかりにくいと思いますので、簡単な例を示します。
整数を保持する変数 a があるとします。数値に適用できる関数もいくつかあります。
sqr
- 数を二乗するflp
- 数値のビットを反転するdec
- 数を減らすinc
- 数を増やす
次に、 と言うことができますdo_formula(a, "2sqr+inc+flp")
。a が 3 の場合、それを 2 乗し (81)、インクリメントし (82)、そのビットを反転します (~82 - 符号付き整数を扱う場合は -83 だと思います)。
数式を解析する最良の方法は何でしょうか? それは比較的単純で、すべてのオペコードを 3 文字にすることを考えています... Lex を使用するのはやり過ぎでしょうか? シンプルな自作のソリューションを作成するか、まったく別のものを使用する必要がありますか?
上記の例はばかげていると思います。私はそれを行う計算機を構築していませんが、それは私がやろうとしていることを十分に示しています.
python - エスケープが引用符の 2 倍である文字列リテラルに一致する正規表現を作成する方法は?
FORTRAN 文字列リテラルを識別する必要があるplyを使用してパーサーを作成しています。これらは一重引用符で囲まれ、エスケープ文字は二重の一重引用符です。すなわち
'I don''t understand what you mean'
エスケープされた有効な FORTRAN 文字列です。
Ply は正規表現で入力を受け取ります。これまでの試みはうまくいかず、その理由がわかりません。
t_STRING_LITERAL = r"'[^('')]*'"
何か案は?
python - 後で正規表現で一致した番号を評価するにはどうすればよいですか?--Plyを使用したFORTRAN'H'編集記述子の字句解析
Plyを使用してFORTRAN形式の文字列を解釈しています。次の形式の「H」編集記述子に一致する正規表現を記述できません。
x Hccccc ..。
ここで、xは、「H」の後に読み込む文字数を指定します
Plyはトークンを単一の正規表現と照合しますが、正規表現を使用して上記を実行するのに問題があります。私は次のようなものを探しています、
(\d+)[Hh].{\1}
ここで、\1
は整数として解析され、正規表現の一部として評価されますが、そうではありません。
後で同じ正規表現で一致する番号を使用することはできないようですが、これは本当ですか?
Plyを使用する可能性のある他のソリューションはありますか?
python - PythonPLY解析アイテムの出現回数が0回以上
私はPythonとPLYを使用してLISPのようなS式を解析していますが、関数呼び出しを解析するときは、0個以上の引数が存在する可能性があります。これをyaccコードに入れるにはどうすればよいですか。これはこれまでの私の機能です:
「[EXPR]」を0個以上のEXPRを許可するものに置き換える必要があります。これどうやってするの?