問題タブ [parser-combinators]
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.
scala - ランプシェードで略奪者を撃退できるように、剣を捨てずにテキストからプレースホルダーを解析する方法
のようなテキストからプレースホルダーを解析する必要がありましたabc $$FOO$$ cba
。Scala のパーサー コンビネーターを使って何かをハッキングしましたが、その解決策にはあまり満足していません。
特に、正規表現でゼロ幅マッチャーを使用して(?=(\$\$|\z))
、テキストの解析を停止し、プレースホルダーの解析を開始しました。これは、 scala メーリング リストで議論され、派手に却下された(この質問のタイトルに影響を与えた) 悪ふざけに危険なほど近いように思えます。
したがって、課題: このハックなしで動作するようにパーサーを修正します。問題から解決策までの明確な進行を確認したいので、テストが合格するまでコンビネーターをランダムに組み立てるという私の戦略を置き換えることができます。
scala - メソッド"|"で予期されるパーサーのタイプ
次のコードをscala2.8.0に対してコンパイルしています。
MyParser1をコンパイルすると、次のようになります。
|のせいで失敗すると思います メソッドタイプシグネチャ。次のように定義されます。
なぜUはTのスーパータイプでなければならないのですか?「primitiveType」の戻り値はどうあるべきですか?
scala - Scala で不変のケース クラスにラベルを追加する
ラベルと goto を含むコマンドを使用して、小さな言語用のパーサーを作成しようとしています。
などはGOTO
、IFCMD
抽象クラスを拡張するケース クラスです。Core
Functional/scala-like/immutable-objecty の方法に合わせて、次のように定義するCore
のは間違っていると考えています。
しかし、私はその部分を次のように置き換えることができます<APPENDLABELTO_CORE>
:
これを行うための「スカッシュな」方法を指摘できる人はいますか?
(試してみましc copy (label=Some(l))
たが、抽象基本クラスには自動コピーコンストラクターの魔法がありません)
parsing - 統合差分構文のパーサーの書き方
RegexParsers、StandardTokenParsers を使用する必要がありますか、またはこれらはこの種の構文の解析に適していますか? 構文の例はhereから見つけることができます。
regex - RegexParsers を使用した空白/空白の解析
空白/空白の解析に関する問題は何ですか?
regex - 「$」の後に「i」または「{」が続く文字以外のすべての文字に一致する正規表現を作成するにはどうすればよいですか?
つまり、一致させたい:
また
しかし、これではありません:
また:
また、他のすべてに一致させたい...通常の文字、記号、数字など.
$ で始まるもの以外のすべてを一致させるのは簡単です。こんな感じです:
(?!i) または (?!{) を多数の組み合わせで使用して、正規表現の先読み構文を試しましたが、機能しないようです。また、 ! の代わりに = で書き直そうとしました。このように: (?=i)
基本的に、[^\$] 式でイメージできるあらゆる方法でこれらの先読みを挿入しようとしましたが、うまくいきません。
ヘルプ?
編集:うーん、これはうまくいくようです:
f# - これはパーサーコンビネーターライブラリの合理的な基盤ですか?
私は最近FParsecを使用していますが、汎用パーサーの欠如が私にとって大きな停止点であることがわかりました。この小さなライブラリの私の目標は、単純さと一般的な入力のサポートです。これを改善する追加、または特に悪いものを思いつくことができますか?
バックトラック
驚いたことに、あなたが説明したことを実装するのにそれほど多くのコードは必要ありませんでした。それは少しずさんですが、かなりうまくいくようです。
バックトラックパート2
レイジーリストと末尾呼び出しに最適化された再帰を使用するようにコードを切り替えました。
parsing - Scalaパーサー:可用性、違い、組み合わせ?
私の質問はScalaパーサーについてです:
- (標準ライブラリ内および外部で)利用可能なものはどれですか、
- それらの違いは何ですか、
- それらは共通のAPIを共有していますか
- 異なるパーサーを組み合わせて1つの入力文字列を解析できますか?
私は少なくともこれらを見つけました:
- Scalaの「標準」パーサー(LLパーサーのようです)
- ScalaのPackratパーサー(2.8以降はLALRパーサーです)
- パーボイルドパーサー(PEGパーサー?)
- SpiewakのGLLパーサーコンビネーター
haskell - パーサーコンビネーターを効率的にすることはできますか?
約6年前、私はOCamlで自分のパーサーコンビネーターのベンチマークを行い、当時提供されていたパーサージェネレーターよりも約5倍遅いことがわかりました。私は最近、このテーマを再検討し、HaskellのParsecと、F#で記述された単純な手巻きの優先順位クライミングパーサーのベンチマークを行いました。F#がHaskellより25倍高速であることに驚きました。
これが私がファイルから大きな数式を読み取り、それを解析して評価するために使用したHaskellコードです:
これが、F#の自己完結型の優先順位クライミングパーサーです。
私の印象では、最先端のパーサーコンビネーターでさえ、バックトラッキングに多くの時間を浪費しています。あれは正しいですか?もしそうなら、競争力のあるパフォーマンスを得るためにステートマシンを生成するパーサーコンビネーターを書くことは可能ですか、それともコード生成を使用する必要がありますか?
編集:
ベンチマーク用に〜2Mbの式を生成するために使用したOCamlスクリプトは次のとおりです。
java - Java文法の修飾子に関する質問
Java文法は を定義しますModifiersOpt: { Modifier }
。Modifier
はpublic, protected, private, static
etc の 1 つとして定義されます ....の{x}
0 回以上の出現を示しますx
。
public public
有効な識別子ではないことがわかっています。Modifier
リストの任意の要素(例: public
) が に1 回しか表示されないということ{Modifier}
ですか? の「標準」パーサーコンビネーターはあり{ Modifier }
ますか?